From b54a46575be40a51b4791cfc082695591dfd5d14 Mon Sep 17 00:00:00 2001 From: Islam Amin Date: Mon, 22 Apr 2024 15:36:02 -0400 Subject: [PATCH 1/2] feat(sdk-lib-mpc): support mpcv1 to mpcv2 retrofit Ticket: HSM-342 --- .../src/account-lib/mpc/tss/ecdsa/types.ts | 24 ++-- modules/sdk-lib-mpc/package.json | 1 + modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dkg.ts | 70 +++++++++- .../sdk-lib-mpc/src/tss/ecdsa-dkls/types.ts | 5 + modules/sdk-lib-mpc/src/tss/ecdsa/types.ts | 13 ++ .../test/unit/tss/ecdsa/dklsDkg.ts | 113 +++++++++++++++- .../unit/tss/ecdsa/fixtures/mpcv1shares.ts | 72 ++++++++++ package.json | 1 + yarn.lock | 128 +++++++++++++++++- 9 files changed, 399 insertions(+), 28 deletions(-) create mode 100644 modules/sdk-lib-mpc/test/unit/tss/ecdsa/fixtures/mpcv1shares.ts diff --git a/modules/sdk-core/src/account-lib/mpc/tss/ecdsa/types.ts b/modules/sdk-core/src/account-lib/mpc/tss/ecdsa/types.ts index 0793336693..3570d8b13a 100644 --- a/modules/sdk-core/src/account-lib/mpc/tss/ecdsa/types.ts +++ b/modules/sdk-core/src/account-lib/mpc/tss/ecdsa/types.ts @@ -32,6 +32,10 @@ export type SerializedNtilde = EcdsaTypes.SerializedNtilde; * @deprecated use SerializedNtildeWithProofs from sdk-lib-mpc instead */ export type SerializedNtildeWithProofs = EcdsaTypes.SerializedNtildeWithProofs; +/** + * @deprecated use XShare from sdk-lib-mpc instead + */ +export type XShare = EcdsaTypes.XShare; // Private share of the user generated during key generation export type PShare = { @@ -66,19 +70,9 @@ export type KeyShare = { nShares: Record; }; -// Private XShare of the current participant -export type XShare = { - i: number; - l: string; - m: string; - n: string; - y: string; // combined public key - x: string; // combined secret - schnorrProofX: SchnorrProof; // schnorr proof of knowledge of x - chaincode: string; -}; - -export type XShareWithChallenges = XShare & EcdsaTypes.SerializedNtilde & EcdsaTypes.SerializedPaillierChallenge; +export type XShareWithChallenges = EcdsaTypes.XShare & + EcdsaTypes.SerializedNtilde & + EcdsaTypes.SerializedPaillierChallenge; // YShares used during signature generation export type YShare = SignIndex & { @@ -88,7 +82,7 @@ export type YShare = SignIndex & { export type YShareWithChallenges = YShare & EcdsaTypes.SerializedNtilde & EcdsaTypes.SerializedPaillierChallenge; export interface KeyCombined { - xShare: XShare; + xShare: EcdsaTypes.XShare; yShares: Record; } @@ -98,7 +92,7 @@ export type KeyCombinedWithNtilde = { }; export type SubkeyShare = { - xShare: XShare; + xShare: EcdsaTypes.XShare; nShares: Record; }; diff --git a/modules/sdk-lib-mpc/package.json b/modules/sdk-lib-mpc/package.json index 49957c4ef3..940f98a7b6 100644 --- a/modules/sdk-lib-mpc/package.json +++ b/modules/sdk-lib-mpc/package.json @@ -44,6 +44,7 @@ "bigint-crypto-utils": "3.1.4", "bigint-mod-arith": "3.1.2", "cbor": "^9.0.1", + "cbor-x": "1.5.9", "libsodium-wrappers-sumo": "^0.7.9", "openpgp": "5.10.1", "paillier-bigint": "3.3.0", diff --git a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dkg.ts b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dkg.ts index 4192ac96c6..6ea7a21fe0 100644 --- a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dkg.ts +++ b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dkg.ts @@ -1,22 +1,70 @@ import { KeygenSession, Keyshare, Message } from '@silencelaboratories/dkls-wasm-ll-node'; -import { DeserializedBroadcastMessage, DeserializedMessages, DkgState } from './types'; +import { DeserializedBroadcastMessage, DeserializedMessages, DkgState, RetrofitData } from './types'; import { decode } from 'cbor'; +import { encode } from 'cbor-x'; +import { bigIntToBufferBE } from '../../util'; +import { Secp256k1Curve } from '../../curves'; export class Dkg { protected dkgSession: KeygenSession | undefined; protected dkgSessionBytes: Uint8Array; protected dkgKeyShare: Keyshare; + protected keyShareBuff: Buffer; protected n: number; protected t: number; protected chainCodeCommitment: Uint8Array | undefined; protected partyIdx: number; protected dkgState: DkgState = DkgState.Uninitialized; + protected dklsKeyShareRetrofitObject: Keyshare | undefined; - constructor(n: number, t: number, partyIdx: number) { + constructor(n: number, t: number, partyIdx: number, retrofitData?: RetrofitData) { this.n = n; this.t = t; this.partyIdx = partyIdx; this.chainCodeCommitment = undefined; + if (retrofitData) { + if (!retrofitData.xShare.y || !retrofitData.xShare.chaincode || !retrofitData.xShare.x) { + throw Error('xShare must have a public key, private share value, and a chaincode.'); + } + if (n !== 3 || t !== 2) { + throw Error('only 2 of 3 retrofit is supported.'); + } + if (retrofitData.bigSiList.length !== 2) { + throw Error("bigSiList should contain the other parties' Si's"); + } + const bigSList: Array> = []; + let j = 0; + for (let i = 0; i < n; i++) { + if (i === partyIdx) { + const secp256k1 = new Secp256k1Curve(); + bigSList.push(Array.from(bigIntToBufferBE(secp256k1.basePointMult(BigInt('0x' + retrofitData.xShare.x))))); + } else { + bigSList.push(Array.from(Buffer.from(retrofitData.bigSiList[j], 'hex'))); + j++; + } + } + const x_i_list = [new Array(32).fill(0), new Array(32).fill(0), new Array(32).fill(0)]; + x_i_list[0][31] = 1; + x_i_list[1][31] = 2; + x_i_list[2][31] = 3; + const dklsKeyShare = { + total_parties: 3, + threshold: 2, + rank_list: [0, 0, 0], + party_id: partyIdx, + public_key: Array.from(Buffer.from(retrofitData.xShare.y, 'hex')), + root_chain_code: Array.from(Buffer.from(retrofitData.xShare.chaincode, 'hex')), + final_session_id: Array(32).fill(0), + seed_ot_receivers: [Array(32832).fill(0), Array(32832).fill(0)], + seed_ot_senders: [Array(32768).fill(0), Array(32768).fill(0)], + sent_seed_list: [Array(32).fill(0)], + rec_seed_list: [Array(32).fill(0)], + s_i: Array.from(Buffer.from(retrofitData.xShare.x, 'hex')), + big_s_list: bigSList, + x_i_list: x_i_list, + }; + this.dklsKeyShareRetrofitObject = Keyshare.fromBytes(encode(dklsKeyShare)); + } } private _restoreSession() { @@ -63,7 +111,11 @@ export class Dkg { const initDkls = require('@silencelaboratories/dkls-wasm-ll-web'); await initDkls.default(); } - this.dkgSession = new KeygenSession(this.n, this.t, this.partyIdx); + if (this.dklsKeyShareRetrofitObject) { + this.dkgSession = KeygenSession.initKeyRotation(this.dklsKeyShareRetrofitObject); + } else { + this.dkgSession = new KeygenSession(this.n, this.t, this.partyIdx); + } try { const payload = this.dkgSession.createFirstMessage().payload; this._deserializeState(); @@ -77,9 +129,10 @@ export class Dkg { } getKeyShare(): Buffer { - const keyShareBuff = Buffer.from(this.dkgKeyShare.toBytes()); - this.dkgKeyShare.free(); - return keyShareBuff; + if (!this.keyShareBuff) { + throw Error('Can not get key share, DKG is not complete yet.'); + } + return this.keyShareBuff; } handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages { @@ -117,6 +170,11 @@ export class Dkg { } if (this.dkgState === DkgState.Round4) { this.dkgKeyShare = this.dkgSession.keyshare(); + if (this.dklsKeyShareRetrofitObject) { + this.dkgKeyShare.finishKeyRotation(this.dklsKeyShareRetrofitObject); + } + this.keyShareBuff = Buffer.from(this.dkgKeyShare.toBytes()); + this.dkgKeyShare.free(); this.dkgState = DkgState.Complete; return { broadcastMessages: [], p2pMessages: [] }; } else { diff --git a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/types.ts b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/types.ts index c97708506d..61451304b2 100644 --- a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/types.ts +++ b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/types.ts @@ -1,5 +1,6 @@ import assert from 'assert'; import { decode } from 'cbor'; +import { XShare } from '../ecdsa/types'; // Broadcast message meant to be sent to multiple parties interface BroadcastMessage { @@ -52,6 +53,10 @@ export type DklsSignature = { R: T; S: T; }; +export type RetrofitData = { + bigSiList: string[]; + xShare: Partial; +}; export type SerializedBroadcastMessage = BroadcastMessage; export type DeserializedBroadcastMessage = BroadcastMessage; export type SerializedP2PMessage = P2PMessage; diff --git a/modules/sdk-lib-mpc/src/tss/ecdsa/types.ts b/modules/sdk-lib-mpc/src/tss/ecdsa/types.ts index da919605fc..1212e77f1c 100644 --- a/modules/sdk-lib-mpc/src/tss/ecdsa/types.ts +++ b/modules/sdk-lib-mpc/src/tss/ecdsa/types.ts @@ -1,6 +1,19 @@ // Ntilde Proof where both alpha and t are a set of 128 proofs each. +import { SchnorrProof } from '../../types'; import { bigIntToHex, convertBigIntArrToHexArr, convertHexArrToBigIntArr, hexToBigInt } from '../../util'; +// Private XShare of the current participant +export type XShare = { + i: number; + l: string; + m: string; + n: string; + y: string; // combined public key + x: string; // combined secret + schnorrProofX: SchnorrProof; // schnorr proof of knowledge of x + chaincode: string; +}; + interface NtildeProof { alpha: T[]; t: T[]; diff --git a/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDkg.ts b/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDkg.ts index 65814672f6..f3677af50a 100644 --- a/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDkg.ts +++ b/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDkg.ts @@ -4,9 +4,17 @@ import { decryptAndVerifyIncomingMessages, encryptAndAuthOutgoingMessages, } from '../../../../src/tss/ecdsa-dkls/commsLayer'; -import { PartyGpgKey, deserializeMessages, serializeMessages } from '../../../../src/tss/ecdsa-dkls/types'; +import { + PartyGpgKey, + RetrofitData, + deserializeMessages, + serializeMessages, +} from '../../../../src/tss/ecdsa-dkls/types'; +import * as fixtures from './fixtures/mpcv1shares'; import * as openpgp from 'openpgp'; import { decode } from 'cbor'; +import { Secp256k1Curve } from '../../../../src/curves'; +import { bigIntToBufferBE } from '../../../../src/util'; describe('DKLS Dkg 2x3', function () { it(`should create key shares`, async function () { @@ -86,6 +94,109 @@ describe('DKLS Dkg 2x3', function () { assert.deepEqual(DklsTypes.getCommonKeychain(backupKeyShare), DklsTypes.getCommonKeychain(bitgoKeyShare)); }); + it(`should create retrofit MPCV1 shares`, async function () { + const secp256k1 = new Secp256k1Curve(); + const aKeyCombine = { + xShare: fixtures.mockDKeyShare.xShare, + }; + const bKeyCombine = { + xShare: fixtures.mockEKeyShare.xShare, + }; + const cKeyCombine = { + xShare: fixtures.mockFKeyShare.xShare, + }; + const aPub = bigIntToBufferBE(secp256k1.basePointMult(BigInt('0x' + aKeyCombine.xShare.x))).toString('hex'); + const bPub = bigIntToBufferBE(secp256k1.basePointMult(BigInt('0x' + bKeyCombine.xShare.x))).toString('hex'); + const cPub = bigIntToBufferBE(secp256k1.basePointMult(BigInt('0x' + cKeyCombine.xShare.x))).toString('hex'); + const retrofitDataA: RetrofitData = { + bigSiList: [bPub, cPub], + xShare: aKeyCombine.xShare, + }; + const retrofitDataB: RetrofitData = { + bigSiList: [aPub, cPub], + xShare: bKeyCombine.xShare, + }; + const retrofitDataC: RetrofitData = { + bigSiList: [aPub, bPub], + xShare: cKeyCombine.xShare, + }; + const user = new DklsDkg.Dkg(3, 2, 0, retrofitDataA); + const backup = new DklsDkg.Dkg(3, 2, 1, retrofitDataB); + const bitgo = new DklsDkg.Dkg(3, 2, 2, retrofitDataC); + const userRound1Message = await user.initDkg(); + const backupRound1Message = await backup.initDkg(); + const bitgoRound1Message = await bitgo.initDkg(); + const userRound2Messages = user.handleIncomingMessages({ + p2pMessages: [], + broadcastMessages: [bitgoRound1Message, backupRound1Message], + }); + const backupRound2Messages = backup.handleIncomingMessages({ + p2pMessages: [], + broadcastMessages: [userRound1Message, bitgoRound1Message], + }); + const bitgoRound2Messages = bitgo.handleIncomingMessages({ + p2pMessages: [], + broadcastMessages: [userRound1Message, backupRound1Message], + }); + const userRound3Messages = user.handleIncomingMessages({ + p2pMessages: backupRound2Messages.p2pMessages + .filter((m) => m.to === 0) + .concat(bitgoRound2Messages.p2pMessages.filter((m) => m.to === 0)), + broadcastMessages: [], + }); + const backupRound3Messages = backup.handleIncomingMessages({ + p2pMessages: bitgoRound2Messages.p2pMessages + .filter((m) => m.to === 1) + .concat(userRound2Messages.p2pMessages.filter((m) => m.to === 1)), + broadcastMessages: [], + }); + const bitgoRound3Messages = bitgo.handleIncomingMessages({ + p2pMessages: backupRound2Messages.p2pMessages + .filter((m) => m.to === 2) + .concat(userRound2Messages.p2pMessages.filter((m) => m.to === 2)), + broadcastMessages: [], + }); + const userRound4Messages = user.handleIncomingMessages({ + p2pMessages: backupRound3Messages.p2pMessages + .filter((m) => m.to === 0) + .concat(bitgoRound3Messages.p2pMessages.filter((m) => m.to === 0)), + broadcastMessages: [], + }); + const backupRound4Messages = backup.handleIncomingMessages({ + p2pMessages: bitgoRound3Messages.p2pMessages + .filter((m) => m.to === 1) + .concat(userRound3Messages.p2pMessages.filter((m) => m.to === 1)), + broadcastMessages: [], + }); + const bitgoRound4Messages = bitgo.handleIncomingMessages({ + p2pMessages: backupRound3Messages.p2pMessages + .filter((m) => m.to === 2) + .concat(userRound3Messages.p2pMessages.filter((m) => m.to === 2)), + broadcastMessages: [], + }); + user.handleIncomingMessages({ + p2pMessages: [], + broadcastMessages: bitgoRound4Messages.broadcastMessages.concat(backupRound4Messages.broadcastMessages), + }); + bitgo.handleIncomingMessages({ + p2pMessages: [], + broadcastMessages: backupRound4Messages.broadcastMessages.concat(userRound4Messages.broadcastMessages), + }); + backup.handleIncomingMessages({ + p2pMessages: [], + broadcastMessages: bitgoRound4Messages.broadcastMessages.concat(userRound4Messages.broadcastMessages), + }); + + const userKeyShare = user.getKeyShare(); + const backupKeyShare = backup.getKeyShare(); + const bitgoKeyShare = bitgo.getKeyShare(); + assert.deepEqual(decode(userKeyShare).public_key, decode(bitgoKeyShare).public_key); + assert.deepEqual(decode(backupKeyShare).public_key, decode(bitgoKeyShare).public_key); + assert.deepEqual(DklsTypes.getCommonKeychain(userKeyShare), DklsTypes.getCommonKeychain(bitgoKeyShare)); + assert.deepEqual(DklsTypes.getCommonKeychain(backupKeyShare), DklsTypes.getCommonKeychain(bitgoKeyShare)); + assert.deepEqual(aKeyCombine.xShare.y, Buffer.from(decode(userKeyShare).public_key).toString('hex')); + }); + it(`should create key shares with authenticated encryption`, async function () { const user = new DklsDkg.Dkg(3, 2, 0); const backup = new DklsDkg.Dkg(3, 2, 1); diff --git a/modules/sdk-lib-mpc/test/unit/tss/ecdsa/fixtures/mpcv1shares.ts b/modules/sdk-lib-mpc/test/unit/tss/ecdsa/fixtures/mpcv1shares.ts new file mode 100644 index 0000000000..1bdc1904cd --- /dev/null +++ b/modules/sdk-lib-mpc/test/unit/tss/ecdsa/fixtures/mpcv1shares.ts @@ -0,0 +1,72 @@ +// Mocks for deterministic seed tests +export const mockDKeyShare = { + xShare: { + i: 1, + l: 'aaf19cbfb67436e12bd77080ceb98a2d38bbbd6739da5c9bb76a41f6e6f8d04544e28dbb21d7930a6e15ae62fe84d17ac91bd84cfa24dc81dc98b2e91f07fdc6e7346ff31fe794d75652a17cd84fb817caade116bacfa7aee324d5881f44f616b5270c39b849dba0da9aaa740275c5416224d1f0cd1af776c8d709f65f72e7ffde5cefab0b6559fb96f04f8fe3a0d48197446b3ec47db82963f78bf25f71ec7883e5eda7dd2d74f683e8c6570be5eed060190d17d1b5236ed72567bee35a7e0b48e137c42f2ba29f6c89fa83d8e4c9f871ed19464cfa0f4577f75de3050cdb23ec1f940ef91471a2d276775943c69a9e0b3f81b327ab9e346b0e9c09f0cbb51d818deff53c6d66f94666099764b9bfdbfeee2db7103e306e252b7abc1dfbced3c62224c9770a6e117da5c786fa5f990c6102fe3afa0dc6443c6346179bc7163e359c2f3a6b29ec758ef2664ee91b93228fc14717d82bc3c6c84f044935f46cc4c34733b41af108c556e5ecf82df724e23d2572b999a45f906da9c501fd4abd50', + m: '88e213a344a266571460bfd5bd47b7172e7a80d8e42cbeb3738735422d02ea7eef96e72feacb42824109e5a16f385dbdf169d27e86a42ad1eb2fa622cde07c99feda5a26dd7159181377f6a5293cb4b5df0ee743a4ebf6578f30d53654f2aac221e6394eb63953ab3733470a6c6f826f72f9411e76a94bc5e4d5b11e30a2ca28540ad7d799bc9bd62e2985855d127776a8aa452aa176f65dc036f820a0d16cfbdf55410afba77d7f8c972a29a0ecddf68cf21fb2996ac716af72646b4e3b5a8e2f70d8f75b1e5a32cd6570e57144878e78af743d0c6791e49bb8e53a59de3b468e89ce437de6fb3875e15830dae588702b3060c45ff240e5efd106a9ab7c08b3f39b4c2d369521ec45d8e5c02229d239921a992c41c11365308ed5a325c93db6e3fcf4b9a6232435489e4eb0ebecfd8e95947074ee019e8c35885c0b7d308422068eb4b5df05b19c5f69f345f9d8ca9eaf05fdaf4391079ab68a7bb4bbdb1a88fb9180d473f957d7da628a66ea63787f81aa9e28dc40fd43c9dc73f6e75a24e5', + n: 'aaf19cbfb67436e12bd77080ceb98a2d38bbbd6739da5c9bb76a41f6e6f8d04544e28dbb21d7930a6e15ae62fe84d17ac91bd84cfa24dc81dc98b2e91f07fdc6e7346ff31fe794d75652a17cd84fb817caade116bacfa7aee324d5881f44f616b5270c39b849dba0da9aaa740275c5416224d1f0cd1af776c8d709f65f72e7ffde5cefab0b6559fb96f04f8fe3a0d48197446b3ec47db82963f78bf25f71ec7883e5eda7dd2d74f683e8c6570be5eed060190d17d1b5236ed72567bee35a7e0cf5463e839db22e632b4ccc49cab3d2d9d86f0740d983115b078693847a8160eb2bed70bb0c8946d35e10f9d03cedab1afe95489ccf3414ba7e72471266b6c1950a09c723d84251f400ca3a3998c670d8352b968c9a6582709617d1157e4667fe3728ba6f329183334fb69e3f2f0e31037761dc8a547f8676f702f3670e9631c8d14c2b6acf8a83646d61d817955d8898e60fe74e4f2eb4a8a3112cd457960efb240f5b78e7f41b14f16127929502c72b3b239f0daa27b3901d6fbdb62d834ff9', + y: '0376f9a78504e9a226dbb7a4c80fffc44c01099934a5696d77241c183e4469edff', + x: 'a5f59532379099ea61a6b616eaa876c06bd56c4b053a898f58906bec7fd05f9e', + chaincode: '4fc5422aba22c34051d78c9689fb3116269789aea96a157ea5c544bbdb744c08', + }, + yShares: { + 2: { + i: 1, + j: 2, + n: 'da8b60396a17a78c5c65d427a844d890c294e319ea0e4eacf52cb9de3d66631bebb923f36fd91a5142c0acefac6001d3fefe9e7169f4474a2ff6615adfbb15125c49a40d2ce7b2489a9118c03c33a5e4c355ceb0bbc7ffe6a47cdc6d17b42f9a0263529f0515462b17f21c4c0d28e215251c0c5bd3f6c592de14e256d5bb6b35bf82071a5c1287587f6a55a94636e5c37c7236737f6742be10d8ad92c4b1f71499d51e88ad00501db5118ffaa895fe0191cd137db47ad8b17d4b14ed33889dabaa0977bcfd707973020b67f19249c375d2a251fed0eb85c23b345ca44d5604b4cedc31d1adab958ad1a9dfe402818115812f632b5e8983f25dc9f214a920d721ac298b87a73f5caa89d73e3092eecc66a250435e697fe9974ed4f6f7f2c774b89829bd3dff1deda6ade256977f9e623f45e565799817edd5d33503174dbc91d30735851065c14458b1c9ccf40bad150f34abfd12041e59389df484b319e48eee2c37db69afe97a92552ab132e02f33a4a5dfeccc5129601afd197ad972d5c945', + }, + 3: { + i: 1, + j: 3, + n: 'c482179be6588577aed7784eba708623d6d87f994a0482e2b598d59f6d4bb269d7c2fcdad870a1948f212d56b0e5c8b8b99320fedbbdba6076ce2fe9f7b563af3321e37836b4a602b29c64b8c5e687b2c7964c7a42271af1f9a91e18e4f0b3bfcc4a92a8f8c56099ee546fe093e85856083b78c476af494ba312405fdf1eba86c99b1b47ca1236f1d4cd0356c51f5234f240d2dccaf9f34ac1dcb33ce8514254cc0e3e214f3e16530e7a85316b6c870f47b4d1d3998e73805286c17d954f11de271cff280385ee1cbb0b8fda3c12b40685a6dde693dd199ba65a695b0c6c12604c15ebc46c7cf519e54cf9b2ec366ed41c329a7733ece1cdc36eb3ff2c043c4e3509b7928906d9bbe96fae538843aa3cffb4de55a462d0fc7c90079990005425185405925ab8a8f92e4a08f63772001cba57c36f86e27b3f83d415fb6c733f10e2b2c79a7ac0706b8ff3e114b79e712370876bad3fd569bcf160c9589df889610fc3af735b8544b36c9f026a15b7576e2c6d2de1f5f54b9a2757b1c7e71e00c1', + }, + }, +}; + +export const mockEKeyShare = { + xShare: { + i: 2, + l: 'da8b60396a17a78c5c65d427a844d890c294e319ea0e4eacf52cb9de3d66631bebb923f36fd91a5142c0acefac6001d3fefe9e7169f4474a2ff6615adfbb15125c49a40d2ce7b2489a9118c03c33a5e4c355ceb0bbc7ffe6a47cdc6d17b42f9a0263529f0515462b17f21c4c0d28e215251c0c5bd3f6c592de14e256d5bb6b35bf82071a5c1287587f6a55a94636e5c37c7236737f6742be10d8ad92c4b1f71499d51e88ad00501db5118ffaa895fe0191cd137db47ad8b17d4b14ed33889da9c5344a553fdffe18ac2cf74ca071ba0c93b1f0c4a2cb9d3ceda0d66661ed4215277ac63573f1ed1f16c16ca809f1e02ea03f97aaab9e1ee73f1fbd22ea73195db551c820926ea40f42a7236520e64d0bda50af2675100f29c89dea4b192e276d0df1f9edc831215e960699c7ce3ec6fa3c9cdcb8f4c068a105fb93fdf240b830ac7342525f26cd7d3f335c40c05e311c810bb5ba4f86561cb3c5741e3340ba0077191e132ce4ed5dfced4dc575d2d1f96eac31923985127eba16785a50188420', + m: '3a63d0bf877125f57cbef4e1019d822760091cc12eb79e86668112db4636322eb1bc9746f0e542ac4b44a367b38f8fd2e94ac44bf3bf3165c4df83af8fb5ce7dc64e4a026ca06ed7258472bfc086c7ad13f6e9c96fcbe409adf7a9488a8db16d2df6a4574734e4fe89db808e7a04da15958c8b164bca1f5416d3fb02b1edffb4a00f47c7ae5e2e6c138f982589bbad0b6fc1d656e92c578b5d5eb518e97f02c13a674b4b7ac78dbdacd4bbef230dbd8ea32de38eca105934d8facb9daea3907755f1ed6d83a8c1988bac3f2d02fd26fef59c47906dfbd9c69dd4871129c965521a404b321a8ce28c48d99fc06adf705b78de5c55b9f7f96ca289604535850dbcdacb247c1ba0d30cc5b83e0c9c4a4ddf5bdf5820e3bc50cc31f5b9de6bb5a3518df5348709607ae5a12df4a7d05c14d0685e7b800d3a445667589c8c61fcd8c298a9c5c0d6e73f721d54fa0ec0c92c9a90b413f4994721233738426fd1d31831218b8b2c2e76d5bdd4bec461c0f64ec33eba5a766b0499f168ff191044ef6d81', + n: 'da8b60396a17a78c5c65d427a844d890c294e319ea0e4eacf52cb9de3d66631bebb923f36fd91a5142c0acefac6001d3fefe9e7169f4474a2ff6615adfbb15125c49a40d2ce7b2489a9118c03c33a5e4c355ceb0bbc7ffe6a47cdc6d17b42f9a0263529f0515462b17f21c4c0d28e215251c0c5bd3f6c592de14e256d5bb6b35bf82071a5c1287587f6a55a94636e5c37c7236737f6742be10d8ad92c4b1f71499d51e88ad00501db5118ffaa895fe0191cd137db47ad8b17d4b14ed33889dabaa0977bcfd707973020b67f19249c375d2a251fed0eb85c23b345ca44d5604b4cedc31d1adab958ad1a9dfe402818115812f632b5e8983f25dc9f214a920d721ac298b87a73f5caa89d73e3092eecc66a250435e697fe9974ed4f6f7f2c774b89829bd3dff1deda6ade256977f9e623f45e565799817edd5d33503174dbc91d30735851065c14458b1c9ccf40bad150f34abfd12041e59389df484b319e48eee2c37db69afe97a92552ab132e02f33a4a5dfeccc5129601afd197ad972d5c945', + y: '0376f9a78504e9a226dbb7a4c80fffc44c01099934a5696d77241c183e4469edff', + x: '75770cd377aef8a8e263ac1e943a911ea5a9a44265fdd5be6f5b8426b5e80dfd', + chaincode: '4fc5422aba22c34051d78c9689fb3116269789aea96a157ea5c544bbdb744c08', + }, + yShares: { + 1: { + i: 2, + j: 1, + n: 'aaf19cbfb67436e12bd77080ceb98a2d38bbbd6739da5c9bb76a41f6e6f8d04544e28dbb21d7930a6e15ae62fe84d17ac91bd84cfa24dc81dc98b2e91f07fdc6e7346ff31fe794d75652a17cd84fb817caade116bacfa7aee324d5881f44f616b5270c39b849dba0da9aaa740275c5416224d1f0cd1af776c8d709f65f72e7ffde5cefab0b6559fb96f04f8fe3a0d48197446b3ec47db82963f78bf25f71ec7883e5eda7dd2d74f683e8c6570be5eed060190d17d1b5236ed72567bee35a7e0cf5463e839db22e632b4ccc49cab3d2d9d86f0740d983115b078693847a8160eb2bed70bb0c8946d35e10f9d03cedab1afe95489ccf3414ba7e72471266b6c1950a09c723d84251f400ca3a3998c670d8352b968c9a6582709617d1157e4667fe3728ba6f329183334fb69e3f2f0e31037761dc8a547f8676f702f3670e9631c8d14c2b6acf8a83646d61d817955d8898e60fe74e4f2eb4a8a3112cd457960efb240f5b78e7f41b14f16127929502c72b3b239f0daa27b3901d6fbdb62d834ff9', + }, + 3: { + i: 2, + j: 3, + n: 'c482179be6588577aed7784eba708623d6d87f994a0482e2b598d59f6d4bb269d7c2fcdad870a1948f212d56b0e5c8b8b99320fedbbdba6076ce2fe9f7b563af3321e37836b4a602b29c64b8c5e687b2c7964c7a42271af1f9a91e18e4f0b3bfcc4a92a8f8c56099ee546fe093e85856083b78c476af494ba312405fdf1eba86c99b1b47ca1236f1d4cd0356c51f5234f240d2dccaf9f34ac1dcb33ce8514254cc0e3e214f3e16530e7a85316b6c870f47b4d1d3998e73805286c17d954f11de271cff280385ee1cbb0b8fda3c12b40685a6dde693dd199ba65a695b0c6c12604c15ebc46c7cf519e54cf9b2ec366ed41c329a7733ece1cdc36eb3ff2c043c4e3509b7928906d9bbe96fae538843aa3cffb4de55a462d0fc7c90079990005425185405925ab8a8f92e4a08f63772001cba57c36f86e27b3f83d415fb6c733f10e2b2c79a7ac0706b8ff3e114b79e712370876bad3fd569bcf160c9589df889610fc3af735b8544b36c9f026a15b7576e2c6d2de1f5f54b9a2757b1c7e71e00c1', + }, + }, +}; + +export const mockFKeyShare = { + xShare: { + i: 3, + l: 'c482179be6588577aed7784eba708623d6d87f994a0482e2b598d59f6d4bb269d7c2fcdad870a1948f212d56b0e5c8b8b99320fedbbdba6076ce2fe9f7b563af3321e37836b4a602b29c64b8c5e687b2c7964c7a42271af1f9a91e18e4f0b3bfcc4a92a8f8c56099ee546fe093e85856083b78c476af494ba312405fdf1eba86c99b1b47ca1236f1d4cd0356c51f5234f240d2dccaf9f34ac1dcb33ce8514254cc0e3e214f3e16530e7a85316b6c870f47b4d1d3998e73805286c17d954f11dc42fd11b1eec0ed7079a25ce149f064feb603edfa0a99e110c7e0d363801a20959eb6eb8b20df2d5899684865674e4e1ac5580c542d3a73f2ab00c54825c7a92cd8339d1b9464adbc9280a2e116ab5119ac5c2907489877e026150523c59241cd5a203ed95a7e1c50870a9036e972ad5d9fcbe8cedb9cec02036925f761d59b1623fdb8aaa35d07516f6e34af5d960e1601611cbd8c1ec9f06bac5ddd44fec7e42d4c7fb8fcfcad222606f15ab75ebceb7cbef6a9a6621eea2c72a389098393c4', + m: '16445387dec32471beb13b0fbea8429ac36667929e9160b98224a8f7d54e6b05d805cc7f4c6e281b7b74e3a05c6a7171229d4708afaf7f45790992cc2cec246dfa9a732192371dd4aa68b74f03cf0d9d480540b1db258871c04c8e094d9781e06caff3c60db80684d0f3037bf060578954cd508ea37d3fa74f4b86e5dbd65d9cf918ffae23a9b3d8552a70acb911594e3c7a0e1a6f5efd9ca97db5ebff329000e87034d63ed11b32885ce3efb88308c7bfa58a33d2aab331e7a2bd1177bb43e2d6dd34e72a7c3d191592aad5c9a46144ae5f91938eff78ff75e9428c8ab641ea6e77bbf176dc294204c963d6490081324223801b087676bf16993658bb2076c1fd82877144a2475e6d60478b3e2310a94e1ef8f077dc244e7ec754f6a72bec0439fd6abb673b7d4221d59dad1b2d5bf7a62a2a951c1eacd531a29d7769edee87392d8d57e54b9e095989c4ec91b20f6afb93fa496d36bf6fd9e7f495cd7e89f41a7cd0c1e8b2dab296a93c902cd79d63fd72913efa017ce88b56c5d4aee6897d', + n: 'c482179be6588577aed7784eba708623d6d87f994a0482e2b598d59f6d4bb269d7c2fcdad870a1948f212d56b0e5c8b8b99320fedbbdba6076ce2fe9f7b563af3321e37836b4a602b29c64b8c5e687b2c7964c7a42271af1f9a91e18e4f0b3bfcc4a92a8f8c56099ee546fe093e85856083b78c476af494ba312405fdf1eba86c99b1b47ca1236f1d4cd0356c51f5234f240d2dccaf9f34ac1dcb33ce8514254cc0e3e214f3e16530e7a85316b6c870f47b4d1d3998e73805286c17d954f11de271cff280385ee1cbb0b8fda3c12b40685a6dde693dd199ba65a695b0c6c12604c15ebc46c7cf519e54cf9b2ec366ed41c329a7733ece1cdc36eb3ff2c043c4e3509b7928906d9bbe96fae538843aa3cffb4de55a462d0fc7c90079990005425185405925ab8a8f92e4a08f63772001cba57c36f86e27b3f83d415fb6c733f10e2b2c79a7ac0706b8ff3e114b79e712370876bad3fd569bcf160c9589df889610fc3af735b8544b36c9f026a15b7576e2c6d2de1f5f54b9a2757b1c7e71e00c1', + y: '0376f9a78504e9a226dbb7a4c80fffc44c01099934a5696d77241c183e4469edff', + x: '44f88474b7cd57676320a2263dccab7cdf7ddc39c6c121ed86269c60ebffbc5c', + chaincode: '4fc5422aba22c34051d78c9689fb3116269789aea96a157ea5c544bbdb744c08', + }, + yShares: { + 1: { + i: 3, + j: 1, + n: 'aaf19cbfb67436e12bd77080ceb98a2d38bbbd6739da5c9bb76a41f6e6f8d04544e28dbb21d7930a6e15ae62fe84d17ac91bd84cfa24dc81dc98b2e91f07fdc6e7346ff31fe794d75652a17cd84fb817caade116bacfa7aee324d5881f44f616b5270c39b849dba0da9aaa740275c5416224d1f0cd1af776c8d709f65f72e7ffde5cefab0b6559fb96f04f8fe3a0d48197446b3ec47db82963f78bf25f71ec7883e5eda7dd2d74f683e8c6570be5eed060190d17d1b5236ed72567bee35a7e0cf5463e839db22e632b4ccc49cab3d2d9d86f0740d983115b078693847a8160eb2bed70bb0c8946d35e10f9d03cedab1afe95489ccf3414ba7e72471266b6c1950a09c723d84251f400ca3a3998c670d8352b968c9a6582709617d1157e4667fe3728ba6f329183334fb69e3f2f0e31037761dc8a547f8676f702f3670e9631c8d14c2b6acf8a83646d61d817955d8898e60fe74e4f2eb4a8a3112cd457960efb240f5b78e7f41b14f16127929502c72b3b239f0daa27b3901d6fbdb62d834ff9', + }, + 2: { + i: 3, + j: 2, + n: 'da8b60396a17a78c5c65d427a844d890c294e319ea0e4eacf52cb9de3d66631bebb923f36fd91a5142c0acefac6001d3fefe9e7169f4474a2ff6615adfbb15125c49a40d2ce7b2489a9118c03c33a5e4c355ceb0bbc7ffe6a47cdc6d17b42f9a0263529f0515462b17f21c4c0d28e215251c0c5bd3f6c592de14e256d5bb6b35bf82071a5c1287587f6a55a94636e5c37c7236737f6742be10d8ad92c4b1f71499d51e88ad00501db5118ffaa895fe0191cd137db47ad8b17d4b14ed33889dabaa0977bcfd707973020b67f19249c375d2a251fed0eb85c23b345ca44d5604b4cedc31d1adab958ad1a9dfe402818115812f632b5e8983f25dc9f214a920d721ac298b87a73f5caa89d73e3092eecc66a250435e697fe9974ed4f6f7f2c774b89829bd3dff1deda6ade256977f9e623f45e565799817edd5d33503174dbc91d30735851065c14458b1c9ccf40bad150f34abfd12041e59389df484b319e48eee2c37db69afe97a92552ab132e02f33a4a5dfeccc5129601afd197ad972d5c945', + }, + }, +}; diff --git a/package.json b/package.json index 95466b2ea0..068562793f 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "mocha": "^9.2.0", "nock": "^13.3.1", "nyc": "^15.1.0", + "formidable": "3.2.4", "parse-url": "^8.1.0", "prettier": "^2.3.0", "process": "^0.11.10", diff --git a/yarn.lock b/yarn.lock index 190465b980..5dab04ac7c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1020,6 +1020,36 @@ resolved "https://registry.yarnpkg.com/@brandonblack/musig/-/musig-0.0.1-alpha.1.tgz#0895f59977bedf519099ff6e2fcbcbced30bc761" integrity sha512-00RbByQG85lSzrkDjCblzrUc2n1LJAPPrEMHS4oMg+QckE0kzjd26JytT6yx6tNU2+aOXfK7O4kGW/sKVL67cw== +"@cbor-extract/cbor-extract-darwin-arm64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz#8d65cb861a99622e1b4a268e2d522d2ec6137338" + integrity sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w== + +"@cbor-extract/cbor-extract-darwin-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz#9fbec199c888c5ec485a1839f4fad0485ab6c40a" + integrity sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w== + +"@cbor-extract/cbor-extract-linux-arm64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz#bf77e0db4a1d2200a5aa072e02210d5043e953ae" + integrity sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ== + +"@cbor-extract/cbor-extract-linux-arm@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz#491335037eb8533ed8e21b139c59f6df04e39709" + integrity sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q== + +"@cbor-extract/cbor-extract-linux-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz#672574485ccd24759bf8fb8eab9dbca517d35b97" + integrity sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw== + +"@cbor-extract/cbor-extract-win32-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz#4b3f07af047f984c082de34b116e765cb9af975f" + integrity sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w== + "@celo/base@2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@celo/base/-/base-2.3.0.tgz#a6369473200d5cc7e856a2a95a3f4d2fddfbfc6b" @@ -7629,6 +7659,27 @@ catharsis@^0.9.0: dependencies: lodash "^4.17.15" +cbor-extract@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cbor-extract/-/cbor-extract-2.2.0.tgz#cee78e630cbeae3918d1e2e58e0cebaf3a3be840" + integrity sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA== + dependencies: + node-gyp-build-optional-packages "5.1.1" + optionalDependencies: + "@cbor-extract/cbor-extract-darwin-arm64" "2.2.0" + "@cbor-extract/cbor-extract-darwin-x64" "2.2.0" + "@cbor-extract/cbor-extract-linux-arm" "2.2.0" + "@cbor-extract/cbor-extract-linux-arm64" "2.2.0" + "@cbor-extract/cbor-extract-linux-x64" "2.2.0" + "@cbor-extract/cbor-extract-win32-x64" "2.2.0" + +cbor-x@1.5.9: + version "1.5.9" + resolved "https://registry.yarnpkg.com/cbor-x/-/cbor-x-1.5.9.tgz#ed6b2afcd7884bdd697674bfb7332c1473a13ecf" + integrity sha512-OEI5rEu3MeR0WWNUXuIGkxmbXVhABP+VtgAXzm48c9ulkrsvxshjjk94XSOGphyAKeNGLPfAxxzEtgQ6rEVpYQ== + optionalDependencies: + cbor-extract "^2.2.0" + cbor@^9.0.1: version "9.0.2" resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.2.tgz#536b4f2d544411e70ec2b19a2453f10f83cd9fdb" @@ -9078,6 +9129,11 @@ detect-indent@^6.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== +detect-libc@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" @@ -9091,6 +9147,14 @@ detective@^4.0.0: acorn "^5.2.1" defined "^1.0.0" +dezalgo@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ== + dependencies: + asap "^2.0.0" + wrappy "1" + dezalgo@^1.0.0, dezalgo@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" @@ -10845,6 +10909,15 @@ formdata-polyfill@^4.0.10: dependencies: fetch-blob "^3.1.2" +formidable@3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-3.2.4.tgz#c0019368718de33ecb637c66d03b6342a677893a" + integrity sha512-8/5nJsq+o2o1+Dryx1k5gLTDaw0dNE9kL4P3srKArO6zhoerGm42/R8zq+L5EkV7kckNTvJpJke0kI8JseL3RQ== + dependencies: + dezalgo "1.0.3" + hexoid "1.0.0" + once "1.4.0" + formidable@^1.2.0: version "1.2.6" resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.6.tgz#d2a51d60162bbc9b4a055d8457a7c75315d1a168" @@ -11540,7 +11613,7 @@ help-me@^5.0.0: resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6" integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg== -hexoid@^1.0.0: +hexoid@1.0.0, hexoid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== @@ -11674,7 +11747,18 @@ html-minifier-terser@^6.0.2: tapable "^1.1.3" util.promisify "1.0.0" -"html-webpack-plugin-5@npm:html-webpack-plugin@^5", html-webpack-plugin@^5.5.0: +"html-webpack-plugin-5@npm:html-webpack-plugin@^5": + version "5.6.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" + integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +html-webpack-plugin@^5.5.0: version "5.6.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== @@ -14428,6 +14512,13 @@ node-forge@^1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +node-gyp-build-optional-packages@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz#52b143b9dd77b7669073cbfe39e3f4118bfc603c" + integrity sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw== + dependencies: + detect-libc "^2.0.1" + node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.8.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" @@ -14926,7 +15017,7 @@ on-headers@~1.0.1, on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@1.4.0, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -18086,7 +18177,16 @@ string-argv@^0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -18158,7 +18258,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -18172,6 +18272,13 @@ strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -19987,7 +20094,7 @@ workerpool@6.2.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -20005,6 +20112,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From d85c10b089b4ba83f38f174fd40256a255fb0f8e Mon Sep 17 00:00:00 2001 From: Islam Amin Date: Thu, 2 May 2024 19:40:01 -0400 Subject: [PATCH 2/2] Support general t of n retrofit TICKET: HSM-362 --- modules/sdk-lib-mpc/package.json | 1 - modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dkg.ts | 66 ++++++++++--------- modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dsg.ts | 2 +- .../sdk-lib-mpc/src/tss/ecdsa-dkls/types.ts | 3 +- .../sdk-lib-mpc/src/tss/ecdsa-dkls/util.ts | 2 +- .../test/unit/tss/ecdsa/dklsDkg.ts | 63 +++++++++++++++++- .../test/unit/tss/ecdsa/dklsDsg.ts | 2 +- 7 files changed, 101 insertions(+), 38 deletions(-) diff --git a/modules/sdk-lib-mpc/package.json b/modules/sdk-lib-mpc/package.json index 940f98a7b6..6a76d90a02 100644 --- a/modules/sdk-lib-mpc/package.json +++ b/modules/sdk-lib-mpc/package.json @@ -43,7 +43,6 @@ "@wasmer/wasi": "^1.2.2", "bigint-crypto-utils": "3.1.4", "bigint-mod-arith": "3.1.2", - "cbor": "^9.0.1", "cbor-x": "1.5.9", "libsodium-wrappers-sumo": "^0.7.9", "openpgp": "5.10.1", diff --git a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dkg.ts b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dkg.ts index 6ea7a21fe0..41471ff651 100644 --- a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dkg.ts +++ b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dkg.ts @@ -1,7 +1,6 @@ import { KeygenSession, Keyshare, Message } from '@silencelaboratories/dkls-wasm-ll-node'; import { DeserializedBroadcastMessage, DeserializedMessages, DkgState, RetrofitData } from './types'; -import { decode } from 'cbor'; -import { encode } from 'cbor-x'; +import { decode, encode } from 'cbor-x'; import { bigIntToBufferBE } from '../../util'; import { Secp256k1Curve } from '../../curves'; @@ -16,63 +15,65 @@ export class Dkg { protected partyIdx: number; protected dkgState: DkgState = DkgState.Uninitialized; protected dklsKeyShareRetrofitObject: Keyshare | undefined; + protected retrofitData: RetrofitData | undefined; constructor(n: number, t: number, partyIdx: number, retrofitData?: RetrofitData) { this.n = n; this.t = t; this.partyIdx = partyIdx; this.chainCodeCommitment = undefined; - if (retrofitData) { - if (!retrofitData.xShare.y || !retrofitData.xShare.chaincode || !retrofitData.xShare.x) { + this.retrofitData = retrofitData; + } + + private _restoreSession() { + if (!this.dkgSession) { + this.dkgSession = KeygenSession.fromBytes(this.dkgSessionBytes); + } + } + + private _createDKLsRetrofitKeyShare() { + if (this.retrofitData) { + if (!this.retrofitData.xShare.y || !this.retrofitData.xShare.chaincode || !this.retrofitData.xShare.x) { throw Error('xShare must have a public key, private share value, and a chaincode.'); } - if (n !== 3 || t !== 2) { - throw Error('only 2 of 3 retrofit is supported.'); - } - if (retrofitData.bigSiList.length !== 2) { + if (this.retrofitData.bigSiList.length !== this.n - 1) { throw Error("bigSiList should contain the other parties' Si's"); } const bigSList: Array> = []; + const xiList: Array> = []; let j = 0; - for (let i = 0; i < n; i++) { - if (i === partyIdx) { + for (let i = 0; i < this.n; i++) { + if (i === this.partyIdx) { const secp256k1 = new Secp256k1Curve(); - bigSList.push(Array.from(bigIntToBufferBE(secp256k1.basePointMult(BigInt('0x' + retrofitData.xShare.x))))); + bigSList.push( + Array.from(bigIntToBufferBE(secp256k1.basePointMult(BigInt('0x' + this.retrofitData.xShare.x)))) + ); } else { - bigSList.push(Array.from(Buffer.from(retrofitData.bigSiList[j], 'hex'))); + bigSList.push(Array.from(Buffer.from(this.retrofitData.bigSiList[j], 'hex'))); j++; } + xiList.push(Array.from(bigIntToBufferBE(BigInt(i + 1), 32))); } - const x_i_list = [new Array(32).fill(0), new Array(32).fill(0), new Array(32).fill(0)]; - x_i_list[0][31] = 1; - x_i_list[1][31] = 2; - x_i_list[2][31] = 3; const dklsKeyShare = { - total_parties: 3, - threshold: 2, - rank_list: [0, 0, 0], - party_id: partyIdx, - public_key: Array.from(Buffer.from(retrofitData.xShare.y, 'hex')), - root_chain_code: Array.from(Buffer.from(retrofitData.xShare.chaincode, 'hex')), + total_parties: this.n, + threshold: this.t, + rank_list: new Array(this.n).fill(0), + party_id: this.partyIdx, + public_key: Array.from(Buffer.from(this.retrofitData.xShare.y, 'hex')), + root_chain_code: Array.from(Buffer.from(this.retrofitData.xShare.chaincode, 'hex')), final_session_id: Array(32).fill(0), - seed_ot_receivers: [Array(32832).fill(0), Array(32832).fill(0)], - seed_ot_senders: [Array(32768).fill(0), Array(32768).fill(0)], + seed_ot_receivers: new Array(this.n - 1).fill(Array(32832).fill(0)), + seed_ot_senders: new Array(this.n - 1).fill(Array(32768).fill(0)), sent_seed_list: [Array(32).fill(0)], rec_seed_list: [Array(32).fill(0)], - s_i: Array.from(Buffer.from(retrofitData.xShare.x, 'hex')), + s_i: Array.from(Buffer.from(this.retrofitData.xShare.x, 'hex')), big_s_list: bigSList, - x_i_list: x_i_list, + x_i_list: this.retrofitData.xiList ? this.retrofitData.xiList : xiList, }; this.dklsKeyShareRetrofitObject = Keyshare.fromBytes(encode(dklsKeyShare)); } } - private _restoreSession() { - if (!this.dkgSession) { - this.dkgSession = KeygenSession.fromBytes(this.dkgSessionBytes); - } - } - private _deserializeState() { if (!this.dkgSession) { throw Error('Session not intialized'); @@ -111,6 +112,7 @@ export class Dkg { const initDkls = require('@silencelaboratories/dkls-wasm-ll-web'); await initDkls.default(); } + this._createDKLsRetrofitKeyShare(); if (this.dklsKeyShareRetrofitObject) { this.dkgSession = KeygenSession.initKeyRotation(this.dklsKeyShareRetrofitObject); } else { diff --git a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dsg.ts b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dsg.ts index 016560b1a7..670e10cff7 100644 --- a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dsg.ts +++ b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/dsg.ts @@ -1,6 +1,6 @@ import { SignSession, Keyshare, Message } from '@silencelaboratories/dkls-wasm-ll-node'; import { DeserializedBroadcastMessage, DeserializedDklsSignature, DeserializedMessages, DsgState } from './types'; -import { decode } from 'cbor'; +import { decode } from 'cbor-x'; export class Dsg { protected dsgSession: SignSession | undefined; diff --git a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/types.ts b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/types.ts index 61451304b2..735bf75b28 100644 --- a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/types.ts +++ b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/types.ts @@ -1,5 +1,5 @@ import assert from 'assert'; -import { decode } from 'cbor'; +import { decode } from 'cbor-x'; import { XShare } from '../ecdsa/types'; // Broadcast message meant to be sent to multiple parties @@ -56,6 +56,7 @@ export type DklsSignature = { export type RetrofitData = { bigSiList: string[]; xShare: Partial; + xiList?: string[]; }; export type SerializedBroadcastMessage = BroadcastMessage; export type DeserializedBroadcastMessage = BroadcastMessage; diff --git a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/util.ts b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/util.ts index bfb756dc96..82b4ed2ca4 100644 --- a/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/util.ts +++ b/modules/sdk-lib-mpc/src/tss/ecdsa-dkls/util.ts @@ -2,7 +2,7 @@ import { Signature } from '@noble/secp256k1'; import { HDTree, Secp256k1Bip32HdTree, Secp256k1Curve } from '../../curves'; import { bigIntFromBufferBE, bigIntToBufferBE } from '../../util'; import { DeserializedDklsSignature } from './types'; -import { decode } from 'cbor'; +import { decode } from 'cbor-x'; import * as secp256k1 from 'secp256k1'; import { Hash, createHash } from 'crypto'; diff --git a/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDkg.ts b/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDkg.ts index f3677af50a..2d7076a590 100644 --- a/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDkg.ts +++ b/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDkg.ts @@ -12,7 +12,7 @@ import { } from '../../../../src/tss/ecdsa-dkls/types'; import * as fixtures from './fixtures/mpcv1shares'; import * as openpgp from 'openpgp'; -import { decode } from 'cbor'; +import { decode } from 'cbor-x'; import { Secp256k1Curve } from '../../../../src/curves'; import { bigIntToBufferBE } from '../../../../src/util'; @@ -197,6 +197,67 @@ describe('DKLS Dkg 2x3', function () { assert.deepEqual(aKeyCombine.xShare.y, Buffer.from(decode(userKeyShare).public_key).toString('hex')); }); + it(`should create retrofit MPCV1 shares with only 2 parties`, async function () { + const secp256k1 = new Secp256k1Curve(); + const aKeyCombine = { + xShare: fixtures.mockDKeyShare.xShare, + }; + const bKeyCombine = { + xShare: fixtures.mockEKeyShare.xShare, + }; + const aPub = bigIntToBufferBE(secp256k1.basePointMult(BigInt('0x' + aKeyCombine.xShare.x))).toString('hex'); + const bPub = bigIntToBufferBE(secp256k1.basePointMult(BigInt('0x' + bKeyCombine.xShare.x))).toString('hex'); + const retrofitDataA: RetrofitData = { + bigSiList: [bPub], + xShare: aKeyCombine.xShare, + }; + const retrofitDataB: RetrofitData = { + bigSiList: [aPub], + xShare: bKeyCombine.xShare, + }; + const user = new DklsDkg.Dkg(2, 2, 0, retrofitDataA); + const backup = new DklsDkg.Dkg(2, 2, 1, retrofitDataB); + const userRound1Message = await user.initDkg(); + const backupRound1Message = await backup.initDkg(); + const userRound2Messages = user.handleIncomingMessages({ + p2pMessages: [], + broadcastMessages: [backupRound1Message], + }); + const backupRound2Messages = backup.handleIncomingMessages({ + p2pMessages: [], + broadcastMessages: [userRound1Message], + }); + const userRound3Messages = user.handleIncomingMessages({ + p2pMessages: backupRound2Messages.p2pMessages.filter((m) => m.to === 0), + broadcastMessages: [], + }); + const backupRound3Messages = backup.handleIncomingMessages({ + p2pMessages: userRound2Messages.p2pMessages.filter((m) => m.to === 1), + broadcastMessages: [], + }); + const userRound4Messages = user.handleIncomingMessages({ + p2pMessages: backupRound3Messages.p2pMessages.filter((m) => m.to === 0), + broadcastMessages: [], + }); + const backupRound4Messages = backup.handleIncomingMessages({ + p2pMessages: userRound3Messages.p2pMessages.filter((m) => m.to === 1), + broadcastMessages: [], + }); + user.handleIncomingMessages({ + p2pMessages: [], + broadcastMessages: backupRound4Messages.broadcastMessages, + }); + backup.handleIncomingMessages({ + p2pMessages: [], + broadcastMessages: userRound4Messages.broadcastMessages, + }); + + const userKeyShare = user.getKeyShare(); + const backupKeyShare = backup.getKeyShare(); + assert.deepEqual(aKeyCombine.xShare.y, Buffer.from(decode(userKeyShare).public_key).toString('hex')); + assert.deepEqual(bKeyCombine.xShare.y, Buffer.from(decode(backupKeyShare).public_key).toString('hex')); + }); + it(`should create key shares with authenticated encryption`, async function () { const user = new DklsDkg.Dkg(3, 2, 0); const backup = new DklsDkg.Dkg(3, 2, 1); diff --git a/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDsg.ts b/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDsg.ts index e8d71005f4..ef2177024b 100644 --- a/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDsg.ts +++ b/modules/sdk-lib-mpc/test/unit/tss/ecdsa/dklsDsg.ts @@ -3,7 +3,7 @@ import * as fs from 'fs'; import * as crypto from 'crypto'; import should from 'should'; import { Keyshare } from '@silencelaboratories/dkls-wasm-ll-node'; -import { decode } from 'cbor'; +import { decode } from 'cbor-x'; import { verifyAndConvertDklsSignature } from '../../../../src/tss/ecdsa-dkls/util'; describe('DKLS Dsg 2x3', function () {