@metamask/toprf-secure-backup
Advanced tools
+8
-1
@@ -10,2 +10,8 @@ # Changelog | ||
| ## [0.9.0] | ||
| ### Added | ||
| - feat: Add auth token error handling (expired and invalid) to TOPRF eval request in `recoverTOPRFSeed` ([#147](https://github.com/MetaMask/toprf-secure-backup/pull/147)) | ||
| ## [0.8.0] | ||
@@ -121,3 +127,4 @@ | ||
| [Unreleased]: https://github.com/MetaMask/toprf-secure-backup/compare/@metamask/toprf-secure-backup@0.8.0...HEAD | ||
| [Unreleased]: https://github.com/MetaMask/toprf-secure-backup/compare/@metamask/toprf-secure-backup@0.9.0...HEAD | ||
| [0.9.0]: https://github.com/MetaMask/toprf-secure-backup/compare/@metamask/toprf-secure-backup@0.8.0...@metamask/toprf-secure-backup@0.9.0 | ||
| [0.8.0]: https://github.com/MetaMask/toprf-secure-backup/compare/@metamask/toprf-secure-backup@0.7.1...@metamask/toprf-secure-backup@0.8.0 | ||
@@ -124,0 +131,0 @@ [0.7.1]: https://github.com/MetaMask/toprf-secure-backup/compare/@metamask/toprf-secure-backup@0.7.0...@metamask/toprf-secure-backup@0.7.1 |
@@ -110,2 +110,7 @@ "use strict"; | ||
| const validateSeed = async (userInput, blindingFactor, resultArr, keyDeriver) => { | ||
| // Check for auth token errors before filtering responses | ||
| const authTokenError = (0, utils_1.checkAuthTokenErrors)(resultArr); | ||
| if (authTokenError) { | ||
| throw authTokenError; | ||
| } | ||
| // Check for rate limit errors before filtering responses | ||
@@ -112,0 +117,0 @@ let rateLimitDetails = (0, utils_1.checkRateLimitErrors)(resultArr); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"toprfEvalRequest.cjs","sourceRoot":"","sources":["../src/toprfEvalRequest.ts"],"names":[],"mappings":";;;AAAA,qEAMsC;AAEtC,uDAAoD;AACpD,0DAAgE;AAEhE,+CAAiE;AACjE,yCAAsC;AAQtC,uDAA8D;AAC9D,qCAA+C;AAC/C,uCAMiB;AAOjB;;;;;;;;;;GAUG;AACH,MAAM,4BAA4B,GAAG,CACnC,SAAiB,EACjB,aAAqB,EACrB,aAAqB,EACrB,gBAAwB,EACxB,MAAc,EACd,uBAAgC,EACJ,EAAE;IAC9B,OAAO;QACL,SAAS;QACT,gBAAgB,EAAE,GAAG;QACrB,aAAa;QACb,aAAa;QACb,QAAQ,EAAE,uBAAuB,IAAI,gBAAgB;QACrD,UAAU,EAAE,MAAM;KACnB,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,oBAAoB,GAAG,KAAK,EAChC,QAAgB,EAChB,MAAkC,EACF,EAAE;IAClC,MAAM,oBAAoB,GAAG,IAAA,oCAAqB,EAChD,wBAAY,CAAC,kBAAkB,EAC/B,MAAM,CACiB,CAAC;IAE1B,OAAO,IAAA,uBAAe,EAAwB,QAAQ,EAAE,oBAAoB,CAAC,CAAC;AAChF,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,mCAAmC,GAAG,KAAK,EAC/C,oBAA0C,EAC1C,SAAqB,EACrB,cAAsB,EACtB,mBAA2B,EAC3B,UAAuB,EACsC,EAAE;IAC/D,MAAM,SAAS,GAAG,IAAA,kCAAa,EAC7B,oBAAoB,CAAC,MAAM,EAC3B,gCAAoB,CACrB,CAAC;IAEF,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE;QACpC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAClE,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC7B,CAAC;QACF,MAAM,sBAAsB,GAAG,kBAAkB,CAAC,GAAG,CACnD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAC/B,CAAC;QACF,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CACxB,CAAC;QAEF,MAAM,aAAa,GAAG,IAAA,mDAA8B,EAClD,qBAAS,CAAC,KAAK,CAAC,CAAC,EACjB,sBAAsB,EACtB,WAAW,CACZ,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,WAAI,CAAC,cAAc,CAC7C,SAAS,EACT,aAAa,EACb,cAAc,EACd,UAAU,CACX,CAAC;QACF,MAAM,EAAE,EAAE,EAAE,GAAG,IAAA,2CAA2B,EAAC,aAAa,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,qBAAS,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,eAAe,GACnB,qBAAS,CAAC,eAAe,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAEzD,IAAI,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE;YACzC,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,aAAa;aACnD,CAAC;SACH;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,4BAA4B,GAAG,CACnC,KAAc,EACY,EAAE;IAC5B,IACE,OAAO,KAAK,KAAK,QAAQ,IAAI,8BAA8B;QAC3D,KAAK,KAAK,IAAI,IAAI,6BAA6B;QAC/C,CAAC,CAAC,gBAAgB,IAAI,KAAK,CAAC,IAAI,uCAAuC;QACvE,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,IAAI,sCAAsC;QAClF,CAAC,CAAC,gBAAgB,IAAI,KAAK,CAAC,IAAI,uCAAuC;QACvE,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,IAAI,sCAAsC;QAClF,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,kCAAkC;QAC7D,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,iCAAiC;QACxE,CAAC,CAAC,eAAe,IAAI,KAAK,CAAC,IAAI,4BAA4B;QAC3D,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,qCAAqC;QAChF,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,qBAAqB;QAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,8BAA8B;MAC/D;QACA,OAAO,KAAK,CAAC;KACd;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACI,MAAM,YAAY,GAAG,KAAK,EAC/B,SAAqB,EACrB,cAAsB,EACtB,SAAkC,EAClC,UAAuB,EAC+B,EAAE;IACxD,yDAAyD;IACzD,IAAI,gBAAgB,GAAG,IAAA,4BAAoB,EAAC,SAAS,CAAC,CAAC;IACvD,IAAI,gBAAgB,EAAE;QACpB,MAAM,mBAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;KACtD;IAED,MAAM,iBAAiB,GACrB,IAAA,4CAAuB,EAAwB,SAAS,CAAC,CAAC;IAE5D,IAAI,iBAAiB,CAAC,MAAM,GAAG,gCAAoB,EAAE;QACnD,MAAM,mBAAU,CAAC,0BAA0B,CACzC,qDAAqD,gCAAoB,YAAY,iBAAiB,CAAC,MAAM,EAAE,CAChH,CAAC;KACH;IACD,MAAM,mBAAmB,GAAG,IAAA,kCAAa,EACvC,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClD,gCAAoB,CACrB,CAAC;IAEF,IAAI,CAAC,mBAAmB,EAAE;QACxB,MAAM,mBAAU,CAAC,iCAAiC,EAAE,CAAC;KACtD;IAED,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,MAAM,CAClD,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC,EAAE;YAC7C,OAAO,GAAG,CAAC;SACZ;QAED,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,GAChE,UAAU,CAAC;QAEb,GAAG,CAAC,IAAI,CAAC;YACP,aAAa,EAAE,qBAAS,CAAC,eAAe,CAAC,UAAU,CAAC;gBAClD,CAAC,EAAE,MAAM,CAAC,KAAK,cAAc,EAAE,CAAC;gBAChC,CAAC,EAAE,MAAM,CAAC,KAAK,cAAc,EAAE,CAAC;aACjC,CAAC;YACF,SAAS;YACT,aAAa;SACd,CAAC,CAAC;QAEH,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CACH,CAAC;IAEF,IAAI,mBAAmB,CAAC,MAAM,GAAG,gCAAoB,EAAE;QACrD,MAAM,mBAAU,CAAC,0BAA0B,CACzC,iDAAiD,gCAAoB,eAAe,mBAAmB,CAAC,MAAM,EAAE,CACjH,CAAC;KACH;IAED,MAAM,eAAe,GAAG,MAAM,mCAAmC,CAC/D,mBAAmB,EACnB,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,UAAU,CACX,CAAC;IACF,IAAI,CAAC,eAAe,EAAE;QACpB,4FAA4F;QAC5F,gBAAgB,GAAG,IAAA,wCAAgC,EAAC,SAAS,CAAC,CAAC;QAC/D,IAAI,gBAAgB,EAAE;YACpB,MAAM,mBAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;SACtD;QACD,MAAM,mBAAU,CAAC,2BAA2B,EAAE,CAAC;KAChD;IAED,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AA5EW,QAAA,YAAY,gBA4EvB;AAEF;;;;;;;;;;;;;GAaG;AACI,MAAM,gBAAgB,GAAG,KAAK,EAAE,MAQtC,EAAwD,EAAE;IACzD,MAAM,EACJ,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,MAAM,EACN,SAAS,EACT,UAAU,GACX,GAAG,MAAM,CAAC;IAEX,IAAI,UAAU,CAAC,MAAM,GAAG,gCAAoB,EAAE;QAC5C,MAAM,mBAAU,CAAC,sBAAsB,CACrC,YAAY,gCAAoB,4BAA4B,CAC7D,CAAC;KACH;IACD,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,WAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEvC,MAAM,uBAAuB,GAAG,IAAA,oCAA4B,EAC1D,UAAU,EACV,gBAAgB,CACjB,CAAC;IAEF,MAAM,QAAQ,GAAG,uBAAuB,CAAC,GAAG,CAC1C,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QAChC,MAAM,aAAa,GAAG,4BAA4B,CAChD,SAAS,CAAC,SAAS,EACnB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAChB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAChB,gBAAgB,EAChB,MAAM,EACN,uBAAuB,CACxB,CAAC;QACF,OAAO,oBAAoB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACvD,CAAC,CACF,CAAC;IAEF,IAAI;QACF,OAAO,MAAM,IAAA,yBAAI,EAGf,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAC9B,IAAA,oBAAY,EAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAClD,CAAC;KACH;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,IAAA,qBAAa,EAAC,KAAc,CAAC,CAAC;KACrC;AACH,CAAC,CAAC;AAvDW,QAAA,gBAAgB,oBAuD3B","sourcesContent":["import {\n Some,\n filterCompletedRequests,\n kCombinations,\n lagrangeInterpolationForPoints,\n thresholdSame,\n} from '@metamask/auth-network-utils';\nimport type { ProjPointType } from '@noble/curves/abstract/weierstrass';\nimport { secp256k1 } from '@noble/curves/secp256k1';\nimport { generateJsonRPCObject } from '@toruslabs/http-helpers';\n\nimport { TOPRF_EVAL_THRESHOLD, JRPC_METHODS } from './constants';\nimport { TOPRFError } from './errors';\nimport type { NodeAuthTokens } from './interfaces';\nimport type {\n ToprfEvalJRPCRequest,\n ToprfEvalJRPCRequestParams,\n ToprfEvalJRPCResponse,\n ToprfEvalResult,\n} from './jrpcInterfaces';\nimport { deriveAuthenticationKeyPair } from './keyDerivation';\nimport { OPRF, type KeyDeriver } from './oprf';\nimport {\n checkRateLimitErrors,\n mergeEndpointsWithAuthTokens,\n postJRPCRequest,\n getTOPRFError,\n extractRateLimitErrorFromResults,\n} from './utils';\n\ntype BlindedOutputShare = {\n blindedOutput: ProjPointType<bigint>;\n nodeIndex: number;\n keyShareIndex: number;\n};\n/**\n * Creates the parameters for the toprf eval request\n *\n * @param authToken - The auth token issued by node to authenticate the request.\n * @param blindedInputX - The blinded input x coordinate to be used for the toprf eval request.\n * @param blindedInputY - The blinded input y coordinate to be used for the toprf eval request.\n * @param authConnectionId - The auth connection name.\n * @param userId - The user id of the user issued by authentication service.\n * @param groupedAuthConnectionId - An optional grouped auth connection name used for authentication with aggregate (single id) verifier.\n * @returns The parameters for the toprf eval jrpc request.\n */\nconst createToprfEvalRequestParams = (\n authToken: string,\n blindedInputX: string,\n blindedInputY: string,\n authConnectionId: string,\n userId: string,\n groupedAuthConnectionId?: string,\n): ToprfEvalJRPCRequestParams => {\n return {\n authToken,\n shareCoefficient: '1', // We apply share coefficient after evaluation so that we can select the share subset after we have responses.\n blindedInputX,\n blindedInputY,\n verifier: groupedAuthConnectionId ?? authConnectionId,\n verifierId: userId,\n };\n};\n\n/**\n * Sends a toprf eval request to the given endpoint\n *\n * @param endpoint - The endpoint to be used for the toprf eval request\n * @param params - The parameters for the toprf eval request\n * @returns Array of toprf eval request promises\n */\nconst sendToprfEvalRequest = async (\n endpoint: string,\n params: ToprfEvalJRPCRequestParams,\n): Promise<ToprfEvalJRPCResponse> => {\n const toprfEvalJRPCRequest = generateJsonRPCObject(\n JRPC_METHODS.TOPRF_EVAL_REQUEST,\n params,\n ) as ToprfEvalJRPCRequest;\n\n return postJRPCRequest<ToprfEvalJRPCResponse>(endpoint, toprfEvalJRPCRequest);\n};\n\n/**\n * Finds the matching seed from the toprf eval responses\n *\n * @param sortedBlindedOutputs - The sorted blinded outputs from the toprf eval responses.\n * @param userInput - The user input i.e. the password.\n * @param blindingFactor - The random scalar used to blind the input.\n * @param thresholdAuthPubKey - The threshold auth pub key derived from the toprf eval responses.\n * @param keyDeriver - The key deriver to be used for key management and authentication.\n *\n * @returns The seed and key share index if found, otherwise null.\n */\nconst findMatchingSeedWithAllCombinations = async (\n sortedBlindedOutputs: BlindedOutputShare[],\n userInput: Uint8Array,\n blindingFactor: bigint,\n thresholdAuthPubKey: string,\n keyDeriver?: KeyDeriver,\n): Promise<{ seed: Uint8Array; keyShareIndex: number } | null> => {\n const allCombis = kCombinations(\n sortedBlindedOutputs.length,\n TOPRF_EVAL_THRESHOLD,\n );\n\n for (const currentCombi of allCombis) {\n const currentCombiPoints = sortedBlindedOutputs.filter((_, index) =>\n currentCombi.includes(index),\n );\n const selectedBlindedOutputs = currentCombiPoints.map(\n (point) => point.blindedOutput,\n );\n const nodeIndexes = currentCombiPoints.map((point) =>\n BigInt(point.nodeIndex),\n );\n\n const blindedOutput = lagrangeInterpolationForPoints(\n secp256k1.CURVE.n,\n selectedBlindedOutputs,\n nodeIndexes,\n );\n\n const recoveredSeed = await OPRF.unblindAndHash(\n userInput,\n blindedOutput,\n blindingFactor,\n keyDeriver,\n );\n const { pk } = deriveAuthenticationKeyPair(recoveredSeed);\n const derivedPubKey = secp256k1.ProjectivePoint.fromHex(pk);\n const thresholdPubKey =\n secp256k1.ProjectivePoint.fromHex(thresholdAuthPubKey);\n\n if (derivedPubKey.equals(thresholdPubKey)) {\n return {\n seed: recoveredSeed,\n keyShareIndex: currentCombiPoints[0].keyShareIndex,\n };\n }\n }\n\n return null;\n};\n\n/**\n * Asserts that the value given is a valid toprf eval result\n *\n * @param value - The value to be asserted\n * @returns True if the value is a valid toprf eval result, otherwise false\n */\nconst assertIsValidToprfEvalResult = (\n value: unknown,\n): value is ToprfEvalResult => {\n if (\n typeof value !== 'object' || // `value` should be an object\n value === null || // `value` should not be null\n !('blindedOutputX' in value) || // `value` should have `blindedOutputX`\n typeof value.blindedOutputX !== 'string' || // `blindedOutputX` should be a string\n !('blindedOutputY' in value) || // `value` should have `blindedOutputY`\n typeof value.blindedOutputY !== 'string' || // `blindedOutputY` should be a string\n !('nodeIndex' in value) || // `value` should have `nodeIndex`\n typeof value.nodeIndex !== 'number' || // `nodeIndex` should be a number\n !('keyShareIndex' in value) || // should have keyShareIndex\n typeof value.keyShareIndex !== 'number' || // `keyShareIndex` should be a number\n !('pubKey' in value) || // should have pubKey\n typeof value.pubKey !== 'string' // `pubKey` should be a string\n ) {\n return false;\n }\n return true;\n};\n\n/**\n * Validates the seed from the toprf eval responses\n *\n * @param userInput - The user input i.e. the password.\n * @param blindingFactor - The random scalar used to blind the input.\n * @param resultArr - The toprf eval request result\n * @param keyDeriver - The key deriver to be used for the toprf eval request.\n *\n * @returns The toprf eval request result and the key share index\n */\nexport const validateSeed = async (\n userInput: Uint8Array,\n blindingFactor: bigint,\n resultArr: ToprfEvalJRPCResponse[],\n keyDeriver?: KeyDeriver,\n): Promise<{ seed: Uint8Array; keyShareIndex: number }> => {\n // Check for rate limit errors before filtering responses\n let rateLimitDetails = checkRateLimitErrors(resultArr);\n if (rateLimitDetails) {\n throw TOPRFError.rateLimitExceeded(rateLimitDetails);\n }\n\n const completedRequests =\n filterCompletedRequests<ToprfEvalJRPCResponse>(resultArr);\n\n if (completedRequests.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientValidResponses(\n `Insufficient toprf eval request results, expected ${TOPRF_EVAL_THRESHOLD} but got ${completedRequests.length}`,\n );\n }\n const thresholdAuthPubKey = thresholdSame(\n completedRequests.map((res) => res.result?.pubKey),\n TOPRF_EVAL_THRESHOLD,\n );\n\n if (!thresholdAuthPubKey) {\n throw TOPRFError.couldNotDeriveThresholdAuthPubKey();\n }\n\n const blindedOutputShares = completedRequests.reduce<BlindedOutputShare[]>(\n (acc, resp) => {\n const evalResult = resp.result;\n if (!assertIsValidToprfEvalResult(evalResult)) {\n return acc;\n }\n\n const { blindedOutputX, blindedOutputY, nodeIndex, keyShareIndex } =\n evalResult;\n\n acc.push({\n blindedOutput: secp256k1.ProjectivePoint.fromAffine({\n x: BigInt(`0x${blindedOutputX}`),\n y: BigInt(`0x${blindedOutputY}`),\n }),\n nodeIndex,\n keyShareIndex,\n });\n\n return acc;\n },\n [],\n );\n\n if (blindedOutputShares.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientValidResponses(\n `Insufficient valid blinded outputs, expected: ${TOPRF_EVAL_THRESHOLD}, received: ${blindedOutputShares.length}`,\n );\n }\n\n const seedAndKeyIndex = await findMatchingSeedWithAllCombinations(\n blindedOutputShares,\n userInput,\n blindingFactor,\n thresholdAuthPubKey,\n keyDeriver,\n );\n if (!seedAndKeyIndex) {\n // if seed and key index is not found, check if rate limit error is present in the resultArr\n rateLimitDetails = extractRateLimitErrorFromResults(resultArr);\n if (rateLimitDetails) {\n throw TOPRFError.rateLimitExceeded(rateLimitDetails);\n }\n throw TOPRFError.couldNotDeriveEncryptionKey();\n }\n\n return seedAndKeyIndex;\n};\n\n/**\n * Recovers the seed from the toprf eval responses.\n *\n * @param params - The parameters for the toprf eval request\n * @param params.authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param params.nodeEndpointsMap - Map of node index to endpoint to be used for the toprf eval request.\n * @param params.authConnectionId - The auth connection name used for authentication.\n * @param params.groupedAuthConnectionId - An optional grouped auth connection name used for authentication with aggregate (single id) verifier.\n * @param params.userId - The user id of the user issued by authentication service.\n * @param params.userInput - The user input to be used for the toprf eval request.\n * @param params.keyDeriver - The key deriver to be used for the toprf eval request.\n *\n * @returns - A promise that resolves with the key pair seed and key share index.\n */\nexport const recoverTOPRFSeed = async (params: {\n authTokens: NodeAuthTokens;\n nodeEndpointsMap: Record<number, string>;\n authConnectionId: string;\n groupedAuthConnectionId?: string;\n userId: string;\n userInput: Uint8Array;\n keyDeriver?: KeyDeriver;\n}): Promise<{ seed: Uint8Array; keyShareIndex: number }> => {\n const {\n authTokens,\n nodeEndpointsMap,\n authConnectionId,\n groupedAuthConnectionId,\n userId,\n userInput,\n keyDeriver,\n } = params;\n\n if (authTokens.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientAuthTokens(\n `At least ${TOPRF_EVAL_THRESHOLD} auth tokens are required.`,\n );\n }\n const { a, r } = OPRF.blind(userInput);\n\n const endpointsWithAuthTokens = mergeEndpointsWithAuthTokens(\n authTokens,\n nodeEndpointsMap,\n );\n\n const promises = endpointsWithAuthTokens.map(\n async ({ endpoint, authToken }) => {\n const requestParams = createToprfEvalRequestParams(\n authToken.authToken,\n a.x.toString(16),\n a.y.toString(16),\n authConnectionId,\n userId,\n groupedAuthConnectionId,\n );\n return sendToprfEvalRequest(endpoint, requestParams);\n },\n );\n\n try {\n return await Some<\n ToprfEvalJRPCResponse,\n { seed: Uint8Array; keyShareIndex: number }\n >(promises, async (resultArr) =>\n validateSeed(userInput, r, resultArr, keyDeriver),\n );\n } catch (error) {\n throw getTOPRFError(error as Error);\n }\n};\n"]} | ||
| {"version":3,"file":"toprfEvalRequest.cjs","sourceRoot":"","sources":["../src/toprfEvalRequest.ts"],"names":[],"mappings":";;;AAAA,qEAMsC;AAEtC,uDAAoD;AACpD,0DAAgE;AAEhE,+CAAiE;AACjE,yCAAsC;AAQtC,uDAA8D;AAC9D,qCAA+C;AAC/C,uCAOiB;AAOjB;;;;;;;;;;GAUG;AACH,MAAM,4BAA4B,GAAG,CACnC,SAAiB,EACjB,aAAqB,EACrB,aAAqB,EACrB,gBAAwB,EACxB,MAAc,EACd,uBAAgC,EACJ,EAAE;IAC9B,OAAO;QACL,SAAS;QACT,gBAAgB,EAAE,GAAG;QACrB,aAAa;QACb,aAAa;QACb,QAAQ,EAAE,uBAAuB,IAAI,gBAAgB;QACrD,UAAU,EAAE,MAAM;KACnB,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,oBAAoB,GAAG,KAAK,EAChC,QAAgB,EAChB,MAAkC,EACF,EAAE;IAClC,MAAM,oBAAoB,GAAG,IAAA,oCAAqB,EAChD,wBAAY,CAAC,kBAAkB,EAC/B,MAAM,CACiB,CAAC;IAE1B,OAAO,IAAA,uBAAe,EAAwB,QAAQ,EAAE,oBAAoB,CAAC,CAAC;AAChF,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,mCAAmC,GAAG,KAAK,EAC/C,oBAA0C,EAC1C,SAAqB,EACrB,cAAsB,EACtB,mBAA2B,EAC3B,UAAuB,EACsC,EAAE;IAC/D,MAAM,SAAS,GAAG,IAAA,kCAAa,EAC7B,oBAAoB,CAAC,MAAM,EAC3B,gCAAoB,CACrB,CAAC;IAEF,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE;QACpC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAClE,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC7B,CAAC;QACF,MAAM,sBAAsB,GAAG,kBAAkB,CAAC,GAAG,CACnD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAC/B,CAAC;QACF,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CACxB,CAAC;QAEF,MAAM,aAAa,GAAG,IAAA,mDAA8B,EAClD,qBAAS,CAAC,KAAK,CAAC,CAAC,EACjB,sBAAsB,EACtB,WAAW,CACZ,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,WAAI,CAAC,cAAc,CAC7C,SAAS,EACT,aAAa,EACb,cAAc,EACd,UAAU,CACX,CAAC;QACF,MAAM,EAAE,EAAE,EAAE,GAAG,IAAA,2CAA2B,EAAC,aAAa,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,qBAAS,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,eAAe,GACnB,qBAAS,CAAC,eAAe,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAEzD,IAAI,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE;YACzC,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,aAAa;aACnD,CAAC;SACH;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,4BAA4B,GAAG,CACnC,KAAc,EACY,EAAE;IAC5B,IACE,OAAO,KAAK,KAAK,QAAQ,IAAI,8BAA8B;QAC3D,KAAK,KAAK,IAAI,IAAI,6BAA6B;QAC/C,CAAC,CAAC,gBAAgB,IAAI,KAAK,CAAC,IAAI,uCAAuC;QACvE,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,IAAI,sCAAsC;QAClF,CAAC,CAAC,gBAAgB,IAAI,KAAK,CAAC,IAAI,uCAAuC;QACvE,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,IAAI,sCAAsC;QAClF,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,kCAAkC;QAC7D,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,iCAAiC;QACxE,CAAC,CAAC,eAAe,IAAI,KAAK,CAAC,IAAI,4BAA4B;QAC3D,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,qCAAqC;QAChF,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,qBAAqB;QAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,8BAA8B;MAC/D;QACA,OAAO,KAAK,CAAC;KACd;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACI,MAAM,YAAY,GAAG,KAAK,EAC/B,SAAqB,EACrB,cAAsB,EACtB,SAAkC,EAClC,UAAuB,EAC+B,EAAE;IACxD,yDAAyD;IACzD,MAAM,cAAc,GAAG,IAAA,4BAAoB,EAAC,SAAS,CAAC,CAAC;IACvD,IAAI,cAAc,EAAE;QAClB,MAAM,cAAc,CAAC;KACtB;IAED,yDAAyD;IACzD,IAAI,gBAAgB,GAAG,IAAA,4BAAoB,EAAC,SAAS,CAAC,CAAC;IACvD,IAAI,gBAAgB,EAAE;QACpB,MAAM,mBAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;KACtD;IAED,MAAM,iBAAiB,GACrB,IAAA,4CAAuB,EAAwB,SAAS,CAAC,CAAC;IAE5D,IAAI,iBAAiB,CAAC,MAAM,GAAG,gCAAoB,EAAE;QACnD,MAAM,mBAAU,CAAC,0BAA0B,CACzC,qDAAqD,gCAAoB,YAAY,iBAAiB,CAAC,MAAM,EAAE,CAChH,CAAC;KACH;IACD,MAAM,mBAAmB,GAAG,IAAA,kCAAa,EACvC,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClD,gCAAoB,CACrB,CAAC;IAEF,IAAI,CAAC,mBAAmB,EAAE;QACxB,MAAM,mBAAU,CAAC,iCAAiC,EAAE,CAAC;KACtD;IAED,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,MAAM,CAClD,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC,EAAE;YAC7C,OAAO,GAAG,CAAC;SACZ;QAED,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,GAChE,UAAU,CAAC;QAEb,GAAG,CAAC,IAAI,CAAC;YACP,aAAa,EAAE,qBAAS,CAAC,eAAe,CAAC,UAAU,CAAC;gBAClD,CAAC,EAAE,MAAM,CAAC,KAAK,cAAc,EAAE,CAAC;gBAChC,CAAC,EAAE,MAAM,CAAC,KAAK,cAAc,EAAE,CAAC;aACjC,CAAC;YACF,SAAS;YACT,aAAa;SACd,CAAC,CAAC;QAEH,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CACH,CAAC;IAEF,IAAI,mBAAmB,CAAC,MAAM,GAAG,gCAAoB,EAAE;QACrD,MAAM,mBAAU,CAAC,0BAA0B,CACzC,iDAAiD,gCAAoB,eAAe,mBAAmB,CAAC,MAAM,EAAE,CACjH,CAAC;KACH;IAED,MAAM,eAAe,GAAG,MAAM,mCAAmC,CAC/D,mBAAmB,EACnB,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,UAAU,CACX,CAAC;IACF,IAAI,CAAC,eAAe,EAAE;QACpB,4FAA4F;QAC5F,gBAAgB,GAAG,IAAA,wCAAgC,EAAC,SAAS,CAAC,CAAC;QAC/D,IAAI,gBAAgB,EAAE;YACpB,MAAM,mBAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;SACtD;QACD,MAAM,mBAAU,CAAC,2BAA2B,EAAE,CAAC;KAChD;IAED,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AAlFW,QAAA,YAAY,gBAkFvB;AAEF;;;;;;;;;;;;;GAaG;AACI,MAAM,gBAAgB,GAAG,KAAK,EAAE,MAQtC,EAAwD,EAAE;IACzD,MAAM,EACJ,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,MAAM,EACN,SAAS,EACT,UAAU,GACX,GAAG,MAAM,CAAC;IAEX,IAAI,UAAU,CAAC,MAAM,GAAG,gCAAoB,EAAE;QAC5C,MAAM,mBAAU,CAAC,sBAAsB,CACrC,YAAY,gCAAoB,4BAA4B,CAC7D,CAAC;KACH;IACD,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,WAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEvC,MAAM,uBAAuB,GAAG,IAAA,oCAA4B,EAC1D,UAAU,EACV,gBAAgB,CACjB,CAAC;IAEF,MAAM,QAAQ,GAAG,uBAAuB,CAAC,GAAG,CAC1C,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QAChC,MAAM,aAAa,GAAG,4BAA4B,CAChD,SAAS,CAAC,SAAS,EACnB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAChB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAChB,gBAAgB,EAChB,MAAM,EACN,uBAAuB,CACxB,CAAC;QACF,OAAO,oBAAoB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACvD,CAAC,CACF,CAAC;IAEF,IAAI;QACF,OAAO,MAAM,IAAA,yBAAI,EAGf,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAC9B,IAAA,oBAAY,EAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAClD,CAAC;KACH;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,IAAA,qBAAa,EAAC,KAAc,CAAC,CAAC;KACrC;AACH,CAAC,CAAC;AAvDW,QAAA,gBAAgB,oBAuD3B","sourcesContent":["import {\n Some,\n filterCompletedRequests,\n kCombinations,\n lagrangeInterpolationForPoints,\n thresholdSame,\n} from '@metamask/auth-network-utils';\nimport type { ProjPointType } from '@noble/curves/abstract/weierstrass';\nimport { secp256k1 } from '@noble/curves/secp256k1';\nimport { generateJsonRPCObject } from '@toruslabs/http-helpers';\n\nimport { TOPRF_EVAL_THRESHOLD, JRPC_METHODS } from './constants';\nimport { TOPRFError } from './errors';\nimport type { NodeAuthTokens } from './interfaces';\nimport type {\n ToprfEvalJRPCRequest,\n ToprfEvalJRPCRequestParams,\n ToprfEvalJRPCResponse,\n ToprfEvalResult,\n} from './jrpcInterfaces';\nimport { deriveAuthenticationKeyPair } from './keyDerivation';\nimport { OPRF, type KeyDeriver } from './oprf';\nimport {\n checkRateLimitErrors,\n checkAuthTokenErrors,\n mergeEndpointsWithAuthTokens,\n postJRPCRequest,\n getTOPRFError,\n extractRateLimitErrorFromResults,\n} from './utils';\n\ntype BlindedOutputShare = {\n blindedOutput: ProjPointType<bigint>;\n nodeIndex: number;\n keyShareIndex: number;\n};\n/**\n * Creates the parameters for the toprf eval request\n *\n * @param authToken - The auth token issued by node to authenticate the request.\n * @param blindedInputX - The blinded input x coordinate to be used for the toprf eval request.\n * @param blindedInputY - The blinded input y coordinate to be used for the toprf eval request.\n * @param authConnectionId - The auth connection name.\n * @param userId - The user id of the user issued by authentication service.\n * @param groupedAuthConnectionId - An optional grouped auth connection name used for authentication with aggregate (single id) verifier.\n * @returns The parameters for the toprf eval jrpc request.\n */\nconst createToprfEvalRequestParams = (\n authToken: string,\n blindedInputX: string,\n blindedInputY: string,\n authConnectionId: string,\n userId: string,\n groupedAuthConnectionId?: string,\n): ToprfEvalJRPCRequestParams => {\n return {\n authToken,\n shareCoefficient: '1', // We apply share coefficient after evaluation so that we can select the share subset after we have responses.\n blindedInputX,\n blindedInputY,\n verifier: groupedAuthConnectionId ?? authConnectionId,\n verifierId: userId,\n };\n};\n\n/**\n * Sends a toprf eval request to the given endpoint\n *\n * @param endpoint - The endpoint to be used for the toprf eval request\n * @param params - The parameters for the toprf eval request\n * @returns Array of toprf eval request promises\n */\nconst sendToprfEvalRequest = async (\n endpoint: string,\n params: ToprfEvalJRPCRequestParams,\n): Promise<ToprfEvalJRPCResponse> => {\n const toprfEvalJRPCRequest = generateJsonRPCObject(\n JRPC_METHODS.TOPRF_EVAL_REQUEST,\n params,\n ) as ToprfEvalJRPCRequest;\n\n return postJRPCRequest<ToprfEvalJRPCResponse>(endpoint, toprfEvalJRPCRequest);\n};\n\n/**\n * Finds the matching seed from the toprf eval responses\n *\n * @param sortedBlindedOutputs - The sorted blinded outputs from the toprf eval responses.\n * @param userInput - The user input i.e. the password.\n * @param blindingFactor - The random scalar used to blind the input.\n * @param thresholdAuthPubKey - The threshold auth pub key derived from the toprf eval responses.\n * @param keyDeriver - The key deriver to be used for key management and authentication.\n *\n * @returns The seed and key share index if found, otherwise null.\n */\nconst findMatchingSeedWithAllCombinations = async (\n sortedBlindedOutputs: BlindedOutputShare[],\n userInput: Uint8Array,\n blindingFactor: bigint,\n thresholdAuthPubKey: string,\n keyDeriver?: KeyDeriver,\n): Promise<{ seed: Uint8Array; keyShareIndex: number } | null> => {\n const allCombis = kCombinations(\n sortedBlindedOutputs.length,\n TOPRF_EVAL_THRESHOLD,\n );\n\n for (const currentCombi of allCombis) {\n const currentCombiPoints = sortedBlindedOutputs.filter((_, index) =>\n currentCombi.includes(index),\n );\n const selectedBlindedOutputs = currentCombiPoints.map(\n (point) => point.blindedOutput,\n );\n const nodeIndexes = currentCombiPoints.map((point) =>\n BigInt(point.nodeIndex),\n );\n\n const blindedOutput = lagrangeInterpolationForPoints(\n secp256k1.CURVE.n,\n selectedBlindedOutputs,\n nodeIndexes,\n );\n\n const recoveredSeed = await OPRF.unblindAndHash(\n userInput,\n blindedOutput,\n blindingFactor,\n keyDeriver,\n );\n const { pk } = deriveAuthenticationKeyPair(recoveredSeed);\n const derivedPubKey = secp256k1.ProjectivePoint.fromHex(pk);\n const thresholdPubKey =\n secp256k1.ProjectivePoint.fromHex(thresholdAuthPubKey);\n\n if (derivedPubKey.equals(thresholdPubKey)) {\n return {\n seed: recoveredSeed,\n keyShareIndex: currentCombiPoints[0].keyShareIndex,\n };\n }\n }\n\n return null;\n};\n\n/**\n * Asserts that the value given is a valid toprf eval result\n *\n * @param value - The value to be asserted\n * @returns True if the value is a valid toprf eval result, otherwise false\n */\nconst assertIsValidToprfEvalResult = (\n value: unknown,\n): value is ToprfEvalResult => {\n if (\n typeof value !== 'object' || // `value` should be an object\n value === null || // `value` should not be null\n !('blindedOutputX' in value) || // `value` should have `blindedOutputX`\n typeof value.blindedOutputX !== 'string' || // `blindedOutputX` should be a string\n !('blindedOutputY' in value) || // `value` should have `blindedOutputY`\n typeof value.blindedOutputY !== 'string' || // `blindedOutputY` should be a string\n !('nodeIndex' in value) || // `value` should have `nodeIndex`\n typeof value.nodeIndex !== 'number' || // `nodeIndex` should be a number\n !('keyShareIndex' in value) || // should have keyShareIndex\n typeof value.keyShareIndex !== 'number' || // `keyShareIndex` should be a number\n !('pubKey' in value) || // should have pubKey\n typeof value.pubKey !== 'string' // `pubKey` should be a string\n ) {\n return false;\n }\n return true;\n};\n\n/**\n * Validates the seed from the toprf eval responses\n *\n * @param userInput - The user input i.e. the password.\n * @param blindingFactor - The random scalar used to blind the input.\n * @param resultArr - The toprf eval request result\n * @param keyDeriver - The key deriver to be used for the toprf eval request.\n *\n * @returns The toprf eval request result and the key share index\n */\nexport const validateSeed = async (\n userInput: Uint8Array,\n blindingFactor: bigint,\n resultArr: ToprfEvalJRPCResponse[],\n keyDeriver?: KeyDeriver,\n): Promise<{ seed: Uint8Array; keyShareIndex: number }> => {\n // Check for auth token errors before filtering responses\n const authTokenError = checkAuthTokenErrors(resultArr);\n if (authTokenError) {\n throw authTokenError;\n }\n\n // Check for rate limit errors before filtering responses\n let rateLimitDetails = checkRateLimitErrors(resultArr);\n if (rateLimitDetails) {\n throw TOPRFError.rateLimitExceeded(rateLimitDetails);\n }\n\n const completedRequests =\n filterCompletedRequests<ToprfEvalJRPCResponse>(resultArr);\n\n if (completedRequests.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientValidResponses(\n `Insufficient toprf eval request results, expected ${TOPRF_EVAL_THRESHOLD} but got ${completedRequests.length}`,\n );\n }\n const thresholdAuthPubKey = thresholdSame(\n completedRequests.map((res) => res.result?.pubKey),\n TOPRF_EVAL_THRESHOLD,\n );\n\n if (!thresholdAuthPubKey) {\n throw TOPRFError.couldNotDeriveThresholdAuthPubKey();\n }\n\n const blindedOutputShares = completedRequests.reduce<BlindedOutputShare[]>(\n (acc, resp) => {\n const evalResult = resp.result;\n if (!assertIsValidToprfEvalResult(evalResult)) {\n return acc;\n }\n\n const { blindedOutputX, blindedOutputY, nodeIndex, keyShareIndex } =\n evalResult;\n\n acc.push({\n blindedOutput: secp256k1.ProjectivePoint.fromAffine({\n x: BigInt(`0x${blindedOutputX}`),\n y: BigInt(`0x${blindedOutputY}`),\n }),\n nodeIndex,\n keyShareIndex,\n });\n\n return acc;\n },\n [],\n );\n\n if (blindedOutputShares.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientValidResponses(\n `Insufficient valid blinded outputs, expected: ${TOPRF_EVAL_THRESHOLD}, received: ${blindedOutputShares.length}`,\n );\n }\n\n const seedAndKeyIndex = await findMatchingSeedWithAllCombinations(\n blindedOutputShares,\n userInput,\n blindingFactor,\n thresholdAuthPubKey,\n keyDeriver,\n );\n if (!seedAndKeyIndex) {\n // if seed and key index is not found, check if rate limit error is present in the resultArr\n rateLimitDetails = extractRateLimitErrorFromResults(resultArr);\n if (rateLimitDetails) {\n throw TOPRFError.rateLimitExceeded(rateLimitDetails);\n }\n throw TOPRFError.couldNotDeriveEncryptionKey();\n }\n\n return seedAndKeyIndex;\n};\n\n/**\n * Recovers the seed from the toprf eval responses.\n *\n * @param params - The parameters for the toprf eval request\n * @param params.authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param params.nodeEndpointsMap - Map of node index to endpoint to be used for the toprf eval request.\n * @param params.authConnectionId - The auth connection name used for authentication.\n * @param params.groupedAuthConnectionId - An optional grouped auth connection name used for authentication with aggregate (single id) verifier.\n * @param params.userId - The user id of the user issued by authentication service.\n * @param params.userInput - The user input to be used for the toprf eval request.\n * @param params.keyDeriver - The key deriver to be used for the toprf eval request.\n *\n * @returns - A promise that resolves with the key pair seed and key share index.\n */\nexport const recoverTOPRFSeed = async (params: {\n authTokens: NodeAuthTokens;\n nodeEndpointsMap: Record<number, string>;\n authConnectionId: string;\n groupedAuthConnectionId?: string;\n userId: string;\n userInput: Uint8Array;\n keyDeriver?: KeyDeriver;\n}): Promise<{ seed: Uint8Array; keyShareIndex: number }> => {\n const {\n authTokens,\n nodeEndpointsMap,\n authConnectionId,\n groupedAuthConnectionId,\n userId,\n userInput,\n keyDeriver,\n } = params;\n\n if (authTokens.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientAuthTokens(\n `At least ${TOPRF_EVAL_THRESHOLD} auth tokens are required.`,\n );\n }\n const { a, r } = OPRF.blind(userInput);\n\n const endpointsWithAuthTokens = mergeEndpointsWithAuthTokens(\n authTokens,\n nodeEndpointsMap,\n );\n\n const promises = endpointsWithAuthTokens.map(\n async ({ endpoint, authToken }) => {\n const requestParams = createToprfEvalRequestParams(\n authToken.authToken,\n a.x.toString(16),\n a.y.toString(16),\n authConnectionId,\n userId,\n groupedAuthConnectionId,\n );\n return sendToprfEvalRequest(endpoint, requestParams);\n },\n );\n\n try {\n return await Some<\n ToprfEvalJRPCResponse,\n { seed: Uint8Array; keyShareIndex: number }\n >(promises, async (resultArr) =>\n validateSeed(userInput, r, resultArr, keyDeriver),\n );\n } catch (error) {\n throw getTOPRFError(error as Error);\n }\n};\n"]} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"toprfEvalRequest.d.cts","sourceRoot":"","sources":["../src/toprfEvalRequest.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,yBAAqB;AACnD,OAAO,KAAK,EAGV,qBAAqB,EAEtB,6BAAyB;AAE1B,OAAO,EAAQ,KAAK,UAAU,EAAE,mBAAe;AAwJ/C;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,cACZ,UAAU,kBACL,MAAM,aACX,qBAAqB,EAAE,eACrB,UAAU,KACtB,QAAQ;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAuErD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,WAAkB;IAC7C,UAAU,EAAE,cAAc,CAAC;IAC3B,gBAAgB,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,KAAG,QAAQ;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CA+CtD,CAAC"} | ||
| {"version":3,"file":"toprfEvalRequest.d.cts","sourceRoot":"","sources":["../src/toprfEvalRequest.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,yBAAqB;AACnD,OAAO,KAAK,EAGV,qBAAqB,EAEtB,6BAAyB;AAE1B,OAAO,EAAQ,KAAK,UAAU,EAAE,mBAAe;AAyJ/C;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,cACZ,UAAU,kBACL,MAAM,aACX,qBAAqB,EAAE,eACrB,UAAU,KACtB,QAAQ;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CA6ErD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,WAAkB;IAC7C,UAAU,EAAE,cAAc,CAAC;IAC3B,gBAAgB,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,KAAG,QAAQ;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CA+CtD,CAAC"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"toprfEvalRequest.d.mts","sourceRoot":"","sources":["../src/toprfEvalRequest.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,yBAAqB;AACnD,OAAO,KAAK,EAGV,qBAAqB,EAEtB,6BAAyB;AAE1B,OAAO,EAAQ,KAAK,UAAU,EAAE,mBAAe;AAwJ/C;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,cACZ,UAAU,kBACL,MAAM,aACX,qBAAqB,EAAE,eACrB,UAAU,KACtB,QAAQ;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAuErD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,WAAkB;IAC7C,UAAU,EAAE,cAAc,CAAC;IAC3B,gBAAgB,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,KAAG,QAAQ;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CA+CtD,CAAC"} | ||
| {"version":3,"file":"toprfEvalRequest.d.mts","sourceRoot":"","sources":["../src/toprfEvalRequest.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,yBAAqB;AACnD,OAAO,KAAK,EAGV,qBAAqB,EAEtB,6BAAyB;AAE1B,OAAO,EAAQ,KAAK,UAAU,EAAE,mBAAe;AAyJ/C;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,cACZ,UAAU,kBACL,MAAM,aACX,qBAAqB,EAAE,eACrB,UAAU,KACtB,QAAQ;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CA6ErD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,WAAkB;IAC7C,UAAU,EAAE,cAAc,CAAC;IAC3B,gBAAgB,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,KAAG,QAAQ;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CA+CtD,CAAC"} |
@@ -8,3 +8,3 @@ import { Some, filterCompletedRequests, kCombinations, lagrangeInterpolationForPoints, thresholdSame } from "@metamask/auth-network-utils"; | ||
| import { OPRF } from "./oprf.mjs"; | ||
| import { checkRateLimitErrors, mergeEndpointsWithAuthTokens, postJRPCRequest, getTOPRFError, extractRateLimitErrorFromResults } from "./utils.mjs"; | ||
| import { checkRateLimitErrors, checkAuthTokenErrors, mergeEndpointsWithAuthTokens, postJRPCRequest, getTOPRFError, extractRateLimitErrorFromResults } from "./utils.mjs"; | ||
| /** | ||
@@ -108,2 +108,7 @@ * Creates the parameters for the toprf eval request | ||
| export const validateSeed = async (userInput, blindingFactor, resultArr, keyDeriver) => { | ||
| // Check for auth token errors before filtering responses | ||
| const authTokenError = checkAuthTokenErrors(resultArr); | ||
| if (authTokenError) { | ||
| throw authTokenError; | ||
| } | ||
| // Check for rate limit errors before filtering responses | ||
@@ -110,0 +115,0 @@ let rateLimitDetails = checkRateLimitErrors(resultArr); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"toprfEvalRequest.mjs","sourceRoot":"","sources":["../src/toprfEvalRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Some,\n filterCompletedRequests,\n kCombinations,\n lagrangeInterpolationForPoints,\n thresholdSame,\n} from '@metamask/auth-network-utils';\nimport type { ProjPointType } from '@noble/curves/abstract/weierstrass';\nimport { secp256k1 } from '@noble/curves/secp256k1';\nimport { generateJsonRPCObject } from '@toruslabs/http-helpers';\n\nimport { TOPRF_EVAL_THRESHOLD, JRPC_METHODS } from './constants';\nimport { TOPRFError } from './errors';\nimport type { NodeAuthTokens } from './interfaces';\nimport type {\n ToprfEvalJRPCRequest,\n ToprfEvalJRPCRequestParams,\n ToprfEvalJRPCResponse,\n ToprfEvalResult,\n} from './jrpcInterfaces';\nimport { deriveAuthenticationKeyPair } from './keyDerivation';\nimport { OPRF, type KeyDeriver } from './oprf';\nimport {\n checkRateLimitErrors,\n mergeEndpointsWithAuthTokens,\n postJRPCRequest,\n getTOPRFError,\n extractRateLimitErrorFromResults,\n} from './utils';\n\ntype BlindedOutputShare = {\n blindedOutput: ProjPointType<bigint>;\n nodeIndex: number;\n keyShareIndex: number;\n};\n/**\n * Creates the parameters for the toprf eval request\n *\n * @param authToken - The auth token issued by node to authenticate the request.\n * @param blindedInputX - The blinded input x coordinate to be used for the toprf eval request.\n * @param blindedInputY - The blinded input y coordinate to be used for the toprf eval request.\n * @param authConnectionId - The auth connection name.\n * @param userId - The user id of the user issued by authentication service.\n * @param groupedAuthConnectionId - An optional grouped auth connection name used for authentication with aggregate (single id) verifier.\n * @returns The parameters for the toprf eval jrpc request.\n */\nconst createToprfEvalRequestParams = (\n authToken: string,\n blindedInputX: string,\n blindedInputY: string,\n authConnectionId: string,\n userId: string,\n groupedAuthConnectionId?: string,\n): ToprfEvalJRPCRequestParams => {\n return {\n authToken,\n shareCoefficient: '1', // We apply share coefficient after evaluation so that we can select the share subset after we have responses.\n blindedInputX,\n blindedInputY,\n verifier: groupedAuthConnectionId ?? authConnectionId,\n verifierId: userId,\n };\n};\n\n/**\n * Sends a toprf eval request to the given endpoint\n *\n * @param endpoint - The endpoint to be used for the toprf eval request\n * @param params - The parameters for the toprf eval request\n * @returns Array of toprf eval request promises\n */\nconst sendToprfEvalRequest = async (\n endpoint: string,\n params: ToprfEvalJRPCRequestParams,\n): Promise<ToprfEvalJRPCResponse> => {\n const toprfEvalJRPCRequest = generateJsonRPCObject(\n JRPC_METHODS.TOPRF_EVAL_REQUEST,\n params,\n ) as ToprfEvalJRPCRequest;\n\n return postJRPCRequest<ToprfEvalJRPCResponse>(endpoint, toprfEvalJRPCRequest);\n};\n\n/**\n * Finds the matching seed from the toprf eval responses\n *\n * @param sortedBlindedOutputs - The sorted blinded outputs from the toprf eval responses.\n * @param userInput - The user input i.e. the password.\n * @param blindingFactor - The random scalar used to blind the input.\n * @param thresholdAuthPubKey - The threshold auth pub key derived from the toprf eval responses.\n * @param keyDeriver - The key deriver to be used for key management and authentication.\n *\n * @returns The seed and key share index if found, otherwise null.\n */\nconst findMatchingSeedWithAllCombinations = async (\n sortedBlindedOutputs: BlindedOutputShare[],\n userInput: Uint8Array,\n blindingFactor: bigint,\n thresholdAuthPubKey: string,\n keyDeriver?: KeyDeriver,\n): Promise<{ seed: Uint8Array; keyShareIndex: number } | null> => {\n const allCombis = kCombinations(\n sortedBlindedOutputs.length,\n TOPRF_EVAL_THRESHOLD,\n );\n\n for (const currentCombi of allCombis) {\n const currentCombiPoints = sortedBlindedOutputs.filter((_, index) =>\n currentCombi.includes(index),\n );\n const selectedBlindedOutputs = currentCombiPoints.map(\n (point) => point.blindedOutput,\n );\n const nodeIndexes = currentCombiPoints.map((point) =>\n BigInt(point.nodeIndex),\n );\n\n const blindedOutput = lagrangeInterpolationForPoints(\n secp256k1.CURVE.n,\n selectedBlindedOutputs,\n nodeIndexes,\n );\n\n const recoveredSeed = await OPRF.unblindAndHash(\n userInput,\n blindedOutput,\n blindingFactor,\n keyDeriver,\n );\n const { pk } = deriveAuthenticationKeyPair(recoveredSeed);\n const derivedPubKey = secp256k1.ProjectivePoint.fromHex(pk);\n const thresholdPubKey =\n secp256k1.ProjectivePoint.fromHex(thresholdAuthPubKey);\n\n if (derivedPubKey.equals(thresholdPubKey)) {\n return {\n seed: recoveredSeed,\n keyShareIndex: currentCombiPoints[0].keyShareIndex,\n };\n }\n }\n\n return null;\n};\n\n/**\n * Asserts that the value given is a valid toprf eval result\n *\n * @param value - The value to be asserted\n * @returns True if the value is a valid toprf eval result, otherwise false\n */\nconst assertIsValidToprfEvalResult = (\n value: unknown,\n): value is ToprfEvalResult => {\n if (\n typeof value !== 'object' || // `value` should be an object\n value === null || // `value` should not be null\n !('blindedOutputX' in value) || // `value` should have `blindedOutputX`\n typeof value.blindedOutputX !== 'string' || // `blindedOutputX` should be a string\n !('blindedOutputY' in value) || // `value` should have `blindedOutputY`\n typeof value.blindedOutputY !== 'string' || // `blindedOutputY` should be a string\n !('nodeIndex' in value) || // `value` should have `nodeIndex`\n typeof value.nodeIndex !== 'number' || // `nodeIndex` should be a number\n !('keyShareIndex' in value) || // should have keyShareIndex\n typeof value.keyShareIndex !== 'number' || // `keyShareIndex` should be a number\n !('pubKey' in value) || // should have pubKey\n typeof value.pubKey !== 'string' // `pubKey` should be a string\n ) {\n return false;\n }\n return true;\n};\n\n/**\n * Validates the seed from the toprf eval responses\n *\n * @param userInput - The user input i.e. the password.\n * @param blindingFactor - The random scalar used to blind the input.\n * @param resultArr - The toprf eval request result\n * @param keyDeriver - The key deriver to be used for the toprf eval request.\n *\n * @returns The toprf eval request result and the key share index\n */\nexport const validateSeed = async (\n userInput: Uint8Array,\n blindingFactor: bigint,\n resultArr: ToprfEvalJRPCResponse[],\n keyDeriver?: KeyDeriver,\n): Promise<{ seed: Uint8Array; keyShareIndex: number }> => {\n // Check for rate limit errors before filtering responses\n let rateLimitDetails = checkRateLimitErrors(resultArr);\n if (rateLimitDetails) {\n throw TOPRFError.rateLimitExceeded(rateLimitDetails);\n }\n\n const completedRequests =\n filterCompletedRequests<ToprfEvalJRPCResponse>(resultArr);\n\n if (completedRequests.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientValidResponses(\n `Insufficient toprf eval request results, expected ${TOPRF_EVAL_THRESHOLD} but got ${completedRequests.length}`,\n );\n }\n const thresholdAuthPubKey = thresholdSame(\n completedRequests.map((res) => res.result?.pubKey),\n TOPRF_EVAL_THRESHOLD,\n );\n\n if (!thresholdAuthPubKey) {\n throw TOPRFError.couldNotDeriveThresholdAuthPubKey();\n }\n\n const blindedOutputShares = completedRequests.reduce<BlindedOutputShare[]>(\n (acc, resp) => {\n const evalResult = resp.result;\n if (!assertIsValidToprfEvalResult(evalResult)) {\n return acc;\n }\n\n const { blindedOutputX, blindedOutputY, nodeIndex, keyShareIndex } =\n evalResult;\n\n acc.push({\n blindedOutput: secp256k1.ProjectivePoint.fromAffine({\n x: BigInt(`0x${blindedOutputX}`),\n y: BigInt(`0x${blindedOutputY}`),\n }),\n nodeIndex,\n keyShareIndex,\n });\n\n return acc;\n },\n [],\n );\n\n if (blindedOutputShares.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientValidResponses(\n `Insufficient valid blinded outputs, expected: ${TOPRF_EVAL_THRESHOLD}, received: ${blindedOutputShares.length}`,\n );\n }\n\n const seedAndKeyIndex = await findMatchingSeedWithAllCombinations(\n blindedOutputShares,\n userInput,\n blindingFactor,\n thresholdAuthPubKey,\n keyDeriver,\n );\n if (!seedAndKeyIndex) {\n // if seed and key index is not found, check if rate limit error is present in the resultArr\n rateLimitDetails = extractRateLimitErrorFromResults(resultArr);\n if (rateLimitDetails) {\n throw TOPRFError.rateLimitExceeded(rateLimitDetails);\n }\n throw TOPRFError.couldNotDeriveEncryptionKey();\n }\n\n return seedAndKeyIndex;\n};\n\n/**\n * Recovers the seed from the toprf eval responses.\n *\n * @param params - The parameters for the toprf eval request\n * @param params.authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param params.nodeEndpointsMap - Map of node index to endpoint to be used for the toprf eval request.\n * @param params.authConnectionId - The auth connection name used for authentication.\n * @param params.groupedAuthConnectionId - An optional grouped auth connection name used for authentication with aggregate (single id) verifier.\n * @param params.userId - The user id of the user issued by authentication service.\n * @param params.userInput - The user input to be used for the toprf eval request.\n * @param params.keyDeriver - The key deriver to be used for the toprf eval request.\n *\n * @returns - A promise that resolves with the key pair seed and key share index.\n */\nexport const recoverTOPRFSeed = async (params: {\n authTokens: NodeAuthTokens;\n nodeEndpointsMap: Record<number, string>;\n authConnectionId: string;\n groupedAuthConnectionId?: string;\n userId: string;\n userInput: Uint8Array;\n keyDeriver?: KeyDeriver;\n}): Promise<{ seed: Uint8Array; keyShareIndex: number }> => {\n const {\n authTokens,\n nodeEndpointsMap,\n authConnectionId,\n groupedAuthConnectionId,\n userId,\n userInput,\n keyDeriver,\n } = params;\n\n if (authTokens.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientAuthTokens(\n `At least ${TOPRF_EVAL_THRESHOLD} auth tokens are required.`,\n );\n }\n const { a, r } = OPRF.blind(userInput);\n\n const endpointsWithAuthTokens = mergeEndpointsWithAuthTokens(\n authTokens,\n nodeEndpointsMap,\n );\n\n const promises = endpointsWithAuthTokens.map(\n async ({ endpoint, authToken }) => {\n const requestParams = createToprfEvalRequestParams(\n authToken.authToken,\n a.x.toString(16),\n a.y.toString(16),\n authConnectionId,\n userId,\n groupedAuthConnectionId,\n );\n return sendToprfEvalRequest(endpoint, requestParams);\n },\n );\n\n try {\n return await Some<\n ToprfEvalJRPCResponse,\n { seed: Uint8Array; keyShareIndex: number }\n >(promises, async (resultArr) =>\n validateSeed(userInput, r, resultArr, keyDeriver),\n );\n } catch (error) {\n throw getTOPRFError(error as Error);\n }\n};\n"]} | ||
| {"version":3,"file":"toprfEvalRequest.mjs","sourceRoot":"","sources":["../src/toprfEvalRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Some,\n filterCompletedRequests,\n kCombinations,\n lagrangeInterpolationForPoints,\n thresholdSame,\n} from '@metamask/auth-network-utils';\nimport type { ProjPointType } from '@noble/curves/abstract/weierstrass';\nimport { secp256k1 } from '@noble/curves/secp256k1';\nimport { generateJsonRPCObject } from '@toruslabs/http-helpers';\n\nimport { TOPRF_EVAL_THRESHOLD, JRPC_METHODS } from './constants';\nimport { TOPRFError } from './errors';\nimport type { NodeAuthTokens } from './interfaces';\nimport type {\n ToprfEvalJRPCRequest,\n ToprfEvalJRPCRequestParams,\n ToprfEvalJRPCResponse,\n ToprfEvalResult,\n} from './jrpcInterfaces';\nimport { deriveAuthenticationKeyPair } from './keyDerivation';\nimport { OPRF, type KeyDeriver } from './oprf';\nimport {\n checkRateLimitErrors,\n checkAuthTokenErrors,\n mergeEndpointsWithAuthTokens,\n postJRPCRequest,\n getTOPRFError,\n extractRateLimitErrorFromResults,\n} from './utils';\n\ntype BlindedOutputShare = {\n blindedOutput: ProjPointType<bigint>;\n nodeIndex: number;\n keyShareIndex: number;\n};\n/**\n * Creates the parameters for the toprf eval request\n *\n * @param authToken - The auth token issued by node to authenticate the request.\n * @param blindedInputX - The blinded input x coordinate to be used for the toprf eval request.\n * @param blindedInputY - The blinded input y coordinate to be used for the toprf eval request.\n * @param authConnectionId - The auth connection name.\n * @param userId - The user id of the user issued by authentication service.\n * @param groupedAuthConnectionId - An optional grouped auth connection name used for authentication with aggregate (single id) verifier.\n * @returns The parameters for the toprf eval jrpc request.\n */\nconst createToprfEvalRequestParams = (\n authToken: string,\n blindedInputX: string,\n blindedInputY: string,\n authConnectionId: string,\n userId: string,\n groupedAuthConnectionId?: string,\n): ToprfEvalJRPCRequestParams => {\n return {\n authToken,\n shareCoefficient: '1', // We apply share coefficient after evaluation so that we can select the share subset after we have responses.\n blindedInputX,\n blindedInputY,\n verifier: groupedAuthConnectionId ?? authConnectionId,\n verifierId: userId,\n };\n};\n\n/**\n * Sends a toprf eval request to the given endpoint\n *\n * @param endpoint - The endpoint to be used for the toprf eval request\n * @param params - The parameters for the toprf eval request\n * @returns Array of toprf eval request promises\n */\nconst sendToprfEvalRequest = async (\n endpoint: string,\n params: ToprfEvalJRPCRequestParams,\n): Promise<ToprfEvalJRPCResponse> => {\n const toprfEvalJRPCRequest = generateJsonRPCObject(\n JRPC_METHODS.TOPRF_EVAL_REQUEST,\n params,\n ) as ToprfEvalJRPCRequest;\n\n return postJRPCRequest<ToprfEvalJRPCResponse>(endpoint, toprfEvalJRPCRequest);\n};\n\n/**\n * Finds the matching seed from the toprf eval responses\n *\n * @param sortedBlindedOutputs - The sorted blinded outputs from the toprf eval responses.\n * @param userInput - The user input i.e. the password.\n * @param blindingFactor - The random scalar used to blind the input.\n * @param thresholdAuthPubKey - The threshold auth pub key derived from the toprf eval responses.\n * @param keyDeriver - The key deriver to be used for key management and authentication.\n *\n * @returns The seed and key share index if found, otherwise null.\n */\nconst findMatchingSeedWithAllCombinations = async (\n sortedBlindedOutputs: BlindedOutputShare[],\n userInput: Uint8Array,\n blindingFactor: bigint,\n thresholdAuthPubKey: string,\n keyDeriver?: KeyDeriver,\n): Promise<{ seed: Uint8Array; keyShareIndex: number } | null> => {\n const allCombis = kCombinations(\n sortedBlindedOutputs.length,\n TOPRF_EVAL_THRESHOLD,\n );\n\n for (const currentCombi of allCombis) {\n const currentCombiPoints = sortedBlindedOutputs.filter((_, index) =>\n currentCombi.includes(index),\n );\n const selectedBlindedOutputs = currentCombiPoints.map(\n (point) => point.blindedOutput,\n );\n const nodeIndexes = currentCombiPoints.map((point) =>\n BigInt(point.nodeIndex),\n );\n\n const blindedOutput = lagrangeInterpolationForPoints(\n secp256k1.CURVE.n,\n selectedBlindedOutputs,\n nodeIndexes,\n );\n\n const recoveredSeed = await OPRF.unblindAndHash(\n userInput,\n blindedOutput,\n blindingFactor,\n keyDeriver,\n );\n const { pk } = deriveAuthenticationKeyPair(recoveredSeed);\n const derivedPubKey = secp256k1.ProjectivePoint.fromHex(pk);\n const thresholdPubKey =\n secp256k1.ProjectivePoint.fromHex(thresholdAuthPubKey);\n\n if (derivedPubKey.equals(thresholdPubKey)) {\n return {\n seed: recoveredSeed,\n keyShareIndex: currentCombiPoints[0].keyShareIndex,\n };\n }\n }\n\n return null;\n};\n\n/**\n * Asserts that the value given is a valid toprf eval result\n *\n * @param value - The value to be asserted\n * @returns True if the value is a valid toprf eval result, otherwise false\n */\nconst assertIsValidToprfEvalResult = (\n value: unknown,\n): value is ToprfEvalResult => {\n if (\n typeof value !== 'object' || // `value` should be an object\n value === null || // `value` should not be null\n !('blindedOutputX' in value) || // `value` should have `blindedOutputX`\n typeof value.blindedOutputX !== 'string' || // `blindedOutputX` should be a string\n !('blindedOutputY' in value) || // `value` should have `blindedOutputY`\n typeof value.blindedOutputY !== 'string' || // `blindedOutputY` should be a string\n !('nodeIndex' in value) || // `value` should have `nodeIndex`\n typeof value.nodeIndex !== 'number' || // `nodeIndex` should be a number\n !('keyShareIndex' in value) || // should have keyShareIndex\n typeof value.keyShareIndex !== 'number' || // `keyShareIndex` should be a number\n !('pubKey' in value) || // should have pubKey\n typeof value.pubKey !== 'string' // `pubKey` should be a string\n ) {\n return false;\n }\n return true;\n};\n\n/**\n * Validates the seed from the toprf eval responses\n *\n * @param userInput - The user input i.e. the password.\n * @param blindingFactor - The random scalar used to blind the input.\n * @param resultArr - The toprf eval request result\n * @param keyDeriver - The key deriver to be used for the toprf eval request.\n *\n * @returns The toprf eval request result and the key share index\n */\nexport const validateSeed = async (\n userInput: Uint8Array,\n blindingFactor: bigint,\n resultArr: ToprfEvalJRPCResponse[],\n keyDeriver?: KeyDeriver,\n): Promise<{ seed: Uint8Array; keyShareIndex: number }> => {\n // Check for auth token errors before filtering responses\n const authTokenError = checkAuthTokenErrors(resultArr);\n if (authTokenError) {\n throw authTokenError;\n }\n\n // Check for rate limit errors before filtering responses\n let rateLimitDetails = checkRateLimitErrors(resultArr);\n if (rateLimitDetails) {\n throw TOPRFError.rateLimitExceeded(rateLimitDetails);\n }\n\n const completedRequests =\n filterCompletedRequests<ToprfEvalJRPCResponse>(resultArr);\n\n if (completedRequests.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientValidResponses(\n `Insufficient toprf eval request results, expected ${TOPRF_EVAL_THRESHOLD} but got ${completedRequests.length}`,\n );\n }\n const thresholdAuthPubKey = thresholdSame(\n completedRequests.map((res) => res.result?.pubKey),\n TOPRF_EVAL_THRESHOLD,\n );\n\n if (!thresholdAuthPubKey) {\n throw TOPRFError.couldNotDeriveThresholdAuthPubKey();\n }\n\n const blindedOutputShares = completedRequests.reduce<BlindedOutputShare[]>(\n (acc, resp) => {\n const evalResult = resp.result;\n if (!assertIsValidToprfEvalResult(evalResult)) {\n return acc;\n }\n\n const { blindedOutputX, blindedOutputY, nodeIndex, keyShareIndex } =\n evalResult;\n\n acc.push({\n blindedOutput: secp256k1.ProjectivePoint.fromAffine({\n x: BigInt(`0x${blindedOutputX}`),\n y: BigInt(`0x${blindedOutputY}`),\n }),\n nodeIndex,\n keyShareIndex,\n });\n\n return acc;\n },\n [],\n );\n\n if (blindedOutputShares.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientValidResponses(\n `Insufficient valid blinded outputs, expected: ${TOPRF_EVAL_THRESHOLD}, received: ${blindedOutputShares.length}`,\n );\n }\n\n const seedAndKeyIndex = await findMatchingSeedWithAllCombinations(\n blindedOutputShares,\n userInput,\n blindingFactor,\n thresholdAuthPubKey,\n keyDeriver,\n );\n if (!seedAndKeyIndex) {\n // if seed and key index is not found, check if rate limit error is present in the resultArr\n rateLimitDetails = extractRateLimitErrorFromResults(resultArr);\n if (rateLimitDetails) {\n throw TOPRFError.rateLimitExceeded(rateLimitDetails);\n }\n throw TOPRFError.couldNotDeriveEncryptionKey();\n }\n\n return seedAndKeyIndex;\n};\n\n/**\n * Recovers the seed from the toprf eval responses.\n *\n * @param params - The parameters for the toprf eval request\n * @param params.authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param params.nodeEndpointsMap - Map of node index to endpoint to be used for the toprf eval request.\n * @param params.authConnectionId - The auth connection name used for authentication.\n * @param params.groupedAuthConnectionId - An optional grouped auth connection name used for authentication with aggregate (single id) verifier.\n * @param params.userId - The user id of the user issued by authentication service.\n * @param params.userInput - The user input to be used for the toprf eval request.\n * @param params.keyDeriver - The key deriver to be used for the toprf eval request.\n *\n * @returns - A promise that resolves with the key pair seed and key share index.\n */\nexport const recoverTOPRFSeed = async (params: {\n authTokens: NodeAuthTokens;\n nodeEndpointsMap: Record<number, string>;\n authConnectionId: string;\n groupedAuthConnectionId?: string;\n userId: string;\n userInput: Uint8Array;\n keyDeriver?: KeyDeriver;\n}): Promise<{ seed: Uint8Array; keyShareIndex: number }> => {\n const {\n authTokens,\n nodeEndpointsMap,\n authConnectionId,\n groupedAuthConnectionId,\n userId,\n userInput,\n keyDeriver,\n } = params;\n\n if (authTokens.length < TOPRF_EVAL_THRESHOLD) {\n throw TOPRFError.insufficientAuthTokens(\n `At least ${TOPRF_EVAL_THRESHOLD} auth tokens are required.`,\n );\n }\n const { a, r } = OPRF.blind(userInput);\n\n const endpointsWithAuthTokens = mergeEndpointsWithAuthTokens(\n authTokens,\n nodeEndpointsMap,\n );\n\n const promises = endpointsWithAuthTokens.map(\n async ({ endpoint, authToken }) => {\n const requestParams = createToprfEvalRequestParams(\n authToken.authToken,\n a.x.toString(16),\n a.y.toString(16),\n authConnectionId,\n userId,\n groupedAuthConnectionId,\n );\n return sendToprfEvalRequest(endpoint, requestParams);\n },\n );\n\n try {\n return await Some<\n ToprfEvalJRPCResponse,\n { seed: Uint8Array; keyShareIndex: number }\n >(promises, async (resultArr) =>\n validateSeed(userInput, r, resultArr, keyDeriver),\n );\n } catch (error) {\n throw getTOPRFError(error as Error);\n }\n};\n"]} |
+21
-1
@@ -6,3 +6,3 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.preserveKeyOrder = exports.getTOPRFError = exports.parseJsonRpcError = exports.mergeEndpointsWithAuthTokens = exports.checkRateLimitErrors = exports.extractRateLimitErrorFromResults = exports.getMaxRateLimitError = exports.createNodeEndpointsMap = exports.generateShareImportItems = exports.createKeyChangeShareImportItems = exports.createNewUserShareImportItems = exports.createKeyChangeProof = exports.createEthereumSignature = exports.prepareNodeShares = exports.decryptAuthToken = exports.postJRPCRequest = exports.bigIntToBN = void 0; | ||
| exports.preserveKeyOrder = exports.getTOPRFError = exports.parseJsonRpcError = exports.mergeEndpointsWithAuthTokens = exports.checkAuthTokenErrors = exports.checkRateLimitErrors = exports.extractRateLimitErrorFromResults = exports.getMaxRateLimitError = exports.createNodeEndpointsMap = exports.generateShareImportItems = exports.createKeyChangeShareImportItems = exports.createNewUserShareImportItems = exports.createKeyChangeProof = exports.createEthereumSignature = exports.prepareNodeShares = exports.decryptAuthToken = exports.postJRPCRequest = exports.bigIntToBN = void 0; | ||
| const auth_network_utils_1 = require("@metamask/auth-network-utils"); | ||
@@ -382,2 +382,22 @@ const secp256k1_1 = require("@noble/curves/secp256k1"); | ||
| /** | ||
| * Checks responses for auth token errors (expired or invalid). | ||
| * | ||
| * @param resultArr - The result array to check for auth token errors. | ||
| * @returns The parsed error if auth token error is found, undefined otherwise. | ||
| */ | ||
| function checkAuthTokenErrors(resultArr) { | ||
| const errorResponses = (0, auth_network_utils_1.filterErrorResponses)(resultArr); | ||
| for (const res of errorResponses) { | ||
| if ((0, auth_network_utils_1.isJSONRPCError)(res.error)) { | ||
| const parsedError = parseJsonRpcError(res.error); | ||
| if (parsedError.code === errors_1.TOPRFErrorCode.AuthTokenExpired || | ||
| parsedError.code === errors_1.TOPRFErrorCode.InvalidAuthToken) { | ||
| return parsedError; | ||
| } | ||
| } | ||
| } | ||
| return undefined; | ||
| } | ||
| exports.checkAuthTokenErrors = checkAuthTokenErrors; | ||
| /** | ||
| * Merges the auth tokens with the endpoints. | ||
@@ -384,0 +404,0 @@ * |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"utils.cjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n EciesHex,\n JRPCRequest,\n JSONValue,\n ShareMap,\n JSONRPCError,\n} from '@metamask/auth-network-utils';\nimport {\n SomeError,\n encParamsHexToBuf,\n encryptedParamsBufToHex,\n filterErrorResponses,\n generateRandomPolynomial,\n getSecp256K1Curve,\n isJSONRPCError,\n toCamelCaseKeys,\n toSnakeCaseKeys,\n} from '@metamask/auth-network-utils';\nimport { secp256k1 as secp256k1Noble } from '@noble/curves/secp256k1';\nimport { keccak_256 as keccak256 } from '@noble/hashes/sha3';\nimport { decrypt, encrypt } from '@toruslabs/eccrypto';\nimport { post } from '@toruslabs/http-helpers';\nimport BN from 'bn.js';\nimport type * as EC from 'elliptic';\n\nimport { GENERATE_SHARE_THRESHOLD, JsonRpcErrorCodes } from './constants';\nimport { TOPRFError } from './errors';\nimport type { ITOPRFError, RateLimitErrorData } from './errors';\nimport type {\n KeyChangeProof,\n NodeAuthToken,\n NodeAuthTokens,\n} from './interfaces';\nimport type { ShareImportItem, ToprfEvalJRPCResponse } from './jrpcInterfaces';\n\ntype EncryptedData = {\n data: string;\n metadata: Omit<EciesHex, 'ciphertext'>;\n};\n\n/**\n * Converts a BigInt to BN\n *\n * @param value - BigInt value to convert\n * @returns BN instance\n */\nexport const bigIntToBN = (value: bigint): BN => {\n return new BN(value.toString());\n};\n\n/**\n * Common post function that handles snake_case conversion of request params\n * and camelCase conversion of response result.\n *\n * @param endpoint - The endpoint to make the request to\n * @param request - The request object to send. The params are converted to snake_case.\n *\n * @returns The response with camelCase converted result\n */\nexport const postJRPCRequest = async <\n Response extends {\n id: number;\n jsonrpc: '2.0';\n result?: JSONValue | undefined;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n },\n>(\n endpoint: string,\n request: JRPCRequest<JSONValue>,\n): Promise<Response> => {\n const req = { ...request };\n req.params = toSnakeCaseKeys(request.params);\n\n return post<Response>(endpoint, req, {}, { logTracingHeader: false })\n .then((res) => {\n if (res.result) {\n res.result = toCamelCaseKeys(res.result);\n }\n return res;\n })\n .catch((er: unknown) => {\n return {\n id: request.id,\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Internal error',\n data: er,\n },\n } as Response;\n });\n};\n\n/**\n * Decrypts the auth token using the session private key\n *\n * @param authToken - The auth token to be decrypted.\n * @param sessionPrivateKey - The session private key to be used for the decryption.\n *\n * @returns The decrypted auth token.\n */\nexport const decryptAuthToken = async (\n authToken: string,\n sessionPrivateKey: Uint8Array,\n): Promise<string> => {\n const authTokenData = JSON.parse(authToken) as EncryptedData;\n const metadata = encParamsHexToBuf(authTokenData.metadata);\n\n const decryptedAuthToken = await decrypt(Buffer.from(sessionPrivateKey), {\n ...metadata,\n ciphertext: Buffer.from(authTokenData.data, 'hex'),\n });\n return Buffer.from(decryptedAuthToken).toString('base64');\n};\n\n/**\n * Generates len(nodeIndexes) number of shares for a given private key with a given threshold.\n *\n * @param ecCurve - The elliptic curve to be used for the secret sharing.\n * @param nodeIndexes - The node indexes to be used for the secret sharing.\n * @param privKey - The private key to be used for secret sharing.\n * @param threshold - The threshold for the secret sharing.\n *\n * @returns Map of node indexes to shares.\n */\nconst generateShares = (\n ecCurve: EC.ec,\n nodeIndexes: number[],\n privKey: BN,\n threshold: number,\n): ShareMap => {\n const nodeIndexesBn = nodeIndexes.map((index) => new BN(index));\n const degree = threshold - 1;\n const poly = generateRandomPolynomial(ecCurve, degree, privKey);\n return poly.generateShares(nodeIndexesBn);\n};\n\n/**\n * Encrypts given data using pub key.\n *\n * @param data - Data to be encrypted in buffer format.\n * @param pubKey - Encryption pub key buffer.\n * @returns The encrypted data, encrypted with the given node's public key.\n */\nconst encryptData = async (\n data: Buffer,\n pubKey: Buffer,\n): Promise<EncryptedData> => {\n const encryptedData = await encrypt(pubKey, data, { padding: true });\n const encryptedDataHex = encryptedParamsBufToHex(encryptedData);\n return {\n data: Buffer.from(encryptedData.ciphertext).toString('hex'),\n metadata: {\n ...encryptedDataHex,\n },\n };\n};\n\n/**\n * Prepares shares for the given nodes, calculating threshold and converting parameters\n *\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param privKey - Private key to use for shares\n * @returns The prepared shares and node indexes\n */\nexport const prepareNodeShares = (\n nodeEndpointsMap: Record<number, string>,\n privKey: bigint,\n): { shares: ShareMap; nodeIndexes: number[] } => {\n const privKeyBN = bigIntToBN(privKey);\n const ecCurve = getSecp256K1Curve();\n const allNodeIndexes = Object.keys(nodeEndpointsMap).map((val: string) =>\n parseInt(val, 10),\n );\n const threshold = GENERATE_SHARE_THRESHOLD;\n const shares = generateShares(ecCurve, allNodeIndexes, privKeyBN, threshold);\n\n return { shares, nodeIndexes: allNodeIndexes };\n};\n\n/**\n * Formats a share value into a 32-byte buffer with padding and base64 encoding\n *\n * @param shareValue - BN share value to format\n * @returns Base64 string of padded share\n */\nconst formatShareForSigning = (shareValue: BN): string => {\n // Convert to padded 32-byte buffer with value right-aligned\n const buffer = shareValue.toArrayLike(Buffer, 'be', 32);\n\n // Convert to base64\n return buffer.toString('base64');\n};\n\n/**\n * Creates an Ethereum format signature (r+s+v)\n *\n * @param dataHash - Hash to sign\n * @param privateKeyBigInt - Private key as bigint\n * @returns Signature as r+s+v hex string\n */\nexport const createEthereumSignature = (\n dataHash: Uint8Array,\n privateKeyBigInt: bigint,\n): string => {\n const privateKeyHex = privateKeyBigInt.toString(16).padStart(64, '0');\n const signResult = secp256k1Noble.sign(dataHash, privateKeyHex);\n\n const signature = signResult.toCompactHex();\n const recV = (signResult.recovery + 27).toString(16).padStart(2, '0');\n\n return signature + recV;\n};\n\n/**\n * Creates a signature for key change using the share and old private key\n *\n * @param shareValue - Raw share value to sign\n * @param keyShareIndex - Key index for the share\n * @param nodeIndex - Node index\n * @param oldAuthPrivKey - Old auth private key for signing\n * @returns The signature and timestamp as KeyChangeProof\n */\nexport const createKeyChangeProof = (\n shareValue: BN,\n keyShareIndex: number,\n nodeIndex: number,\n oldAuthPrivKey: bigint,\n): KeyChangeProof => {\n const timestamp = Math.floor(Date.now() / 1000);\n const shareBase64 = formatShareForSigning(shareValue);\n\n const dataToSign = toSnakeCaseKeys({\n shareData: shareBase64,\n keyShareIndex,\n nodeIndex,\n timestamp,\n });\n\n const jsonData = JSON.stringify(dataToSign);\n const dataHash = keccak256(jsonData);\n const signature = createEthereumSignature(dataHash, oldAuthPrivKey);\n\n return {\n oldKeySignature: signature,\n signatureTimestamp: timestamp,\n };\n};\n\n/**\n * Generate standard share import items without key change proof\n *\n * @param shares - The raw shares generated for each node\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param authTokens - Auth tokens for each node\n * @param keyShareIndex - Key index for the shares\n * @returns Share import items for standard flow\n */\nexport const createNewUserShareImportItems = async (\n shares: ShareMap,\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n keyShareIndex: number,\n): Promise<ShareImportItem[]> => {\n return Promise.all(\n authTokens.map(async (tokenData) => {\n const { nodePubKey, nodeIndex, authToken } = tokenData;\n\n // Get the raw share for this node\n const keyShare = new BN(nodeIndex).toString('hex', 64);\n const share = shares[keyShare];\n const shareJson = share.toJSON() as Record<string, string>;\n\n // Encrypt the share\n const encryptedShare = await encryptData(\n Buffer.from(shareJson.share, 'hex'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Encrypt the auth token\n const encryptedAuthToken = await encryptData(\n Buffer.from(authToken, 'base64'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Return the standard share import item\n return {\n encryptedShare: JSON.stringify(encryptedShare),\n encryptedAuthToken: JSON.stringify(encryptedAuthToken),\n keyShareIndex,\n nodeIndex,\n sssEndpoint: nodeEndpointsMap[nodeIndex],\n };\n }),\n );\n};\n\n/**\n * Generate key change share import items with proofs\n *\n * @param shares - The raw shares generated for each node\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param authTokens - Auth tokens for each node\n * @param keyShareIndex - Key index for the shares\n * @param oldAuthPrivKey - Old private key for signing\n * @returns Share import items for key change flow\n */\nexport const createKeyChangeShareImportItems = async (\n shares: ShareMap,\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n keyShareIndex: number,\n oldAuthPrivKey: bigint,\n): Promise<ShareImportItem<'keyChange'>[]> => {\n return Promise.all(\n authTokens.map(async (tokenData) => {\n const { nodePubKey, nodeIndex, authToken } = tokenData;\n\n // Get the raw share for this node\n const keyShare = new BN(nodeIndex).toString('hex', 64);\n const share = shares[keyShare];\n const shareJson = share.toJSON() as Record<string, string>;\n\n // Create key change proof\n const shareValue = new BN(shareJson.share, 16);\n const keyChangeProof = createKeyChangeProof(\n shareValue,\n keyShareIndex,\n nodeIndex,\n oldAuthPrivKey,\n );\n\n // Encrypt the share\n const encryptedShare = await encryptData(\n Buffer.from(shareJson.share, 'hex'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Encrypt the auth token\n const encryptedAuthToken = await encryptData(\n Buffer.from(authToken, 'base64'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Return the key change share import item\n return {\n encryptedShare: JSON.stringify(encryptedShare),\n encryptedAuthToken: JSON.stringify(encryptedAuthToken),\n keyShareIndex,\n nodeIndex,\n sssEndpoint: nodeEndpointsMap[nodeIndex],\n ...keyChangeProof,\n };\n }),\n );\n};\n\n/**\n * Generates encrypted share import items for each node\n *\n * @param nodeEndpointsMap - Map of node indexes to endpoints.\n * @param authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param privKey - The private key to be used for the share import items.\n * @param keyShareIndex - The key share index to be used for the share import items.\n * @param args - Additional arguments based on ShareType.\n * When ShareType is 'keyChange', this must include the old auth private key for signing.\n *\n * @returns The share import items containing the encrypted shares. Will be type\n * ShareImportItem<'standard'> when using standard flow or\n * ShareImportItem<'keyChange'> when using key change flow.\n */\nexport const generateShareImportItems = async <\n ShareType extends 'standard' | 'keyChange' = 'standard',\n>(\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n privKey: bigint,\n keyShareIndex: number,\n ...args: ShareType extends 'keyChange' ? [oldAuthPrivKey: bigint] : []\n): Promise<ShareImportItem<ShareType>[]> => {\n // First prepare the shares for all nodes\n const { shares } = prepareNodeShares(nodeEndpointsMap, privKey);\n\n const oldAuthPrivKey = args[0];\n\n // Generate appropriate share import items based on whether it's a key change\n if (oldAuthPrivKey !== undefined) {\n return createKeyChangeShareImportItems(\n shares,\n nodeEndpointsMap,\n authTokens,\n keyShareIndex,\n oldAuthPrivKey,\n ) as unknown as ShareImportItem<ShareType>[];\n }\n\n return createNewUserShareImportItems(\n shares,\n nodeEndpointsMap,\n authTokens,\n keyShareIndex,\n ) as unknown as ShareImportItem<ShareType>[];\n};\n\n/**\n * Creates a map of node indexes to endpoints\n *\n * @param nodeEndpoints - The endpoints of the nodes.\n * @param nodeIndexes - The indexes of the nodes.\n *\n * @returns A map of node indexes to endpoints.\n */\nexport const createNodeEndpointsMap = (\n nodeEndpoints: string[],\n nodeIndexes: number[],\n): Record<number, string> => {\n return nodeIndexes.reduce<Record<number, string>>((acc, index) => {\n acc[index] = nodeEndpoints[index - 1];\n return acc;\n }, {});\n};\n\n/**\n * Compares two rate limit errors and returns the one with the longest remaining time.\n *\n * @param error1 - The first rate limit error\n * @param error2 - The second rate limit error\n * @returns The rate limit error with the longest remaining time\n */\nexport function getMaxRateLimitError(\n error1: RateLimitErrorData,\n error2: RateLimitErrorData,\n): RateLimitErrorData {\n if (error1.remainingTime > error2.remainingTime) {\n return error1;\n }\n return error2;\n}\n\n/**\n * Extracts rate limit details from a toprf eval result\n *\n * @param results - TOPRF Eval results\n * @returns Rate limit details if found, undefined otherwise\n */\nexport function extractRateLimitErrorFromResults(\n results: ToprfEvalJRPCResponse[],\n): RateLimitErrorData | undefined {\n let maxRateLimit: RateLimitErrorData | undefined;\n for (const result of results) {\n if (\n result.result?.lockTimeSeconds &&\n result.result.lockTimeSeconds > 0 &&\n result.result.guessCount\n ) {\n const rateLimitError = {\n remainingTime: result.result.lockTimeSeconds,\n message: 'Rate limit exceeded',\n lockTime: result.result.lockTimeSeconds,\n guessCount: result.result.guessCount,\n };\n\n if (maxRateLimit) {\n maxRateLimit = getMaxRateLimitError(maxRateLimit, rateLimitError);\n } else {\n maxRateLimit = rateLimitError;\n }\n }\n }\n\n return maxRateLimit;\n}\n\n/**\n * Extracts rate limit details from a JSON-RPC error response if it's a rate limit error.\n *\n * @param error - The error object from a JSON-RPC response\n * @returns Rate limit details if found, undefined otherwise\n */\nfunction extractRateLimitDetails(\n error: unknown,\n): RateLimitErrorData | undefined {\n if (\n !isJSONRPCError(error) ||\n error.code !== -32602 ||\n error.message !== 'Rate limit exceeded' ||\n !error.data\n ) {\n return undefined;\n }\n\n const data = toCamelCaseKeys(error.data as JSONValue) as Record<\n string,\n unknown\n >;\n\n if (\n typeof data?.message !== 'string' ||\n typeof data?.remainingTime !== 'number' ||\n typeof data?.lockTime !== 'number' ||\n typeof data?.guessCount !== 'number'\n ) {\n return undefined;\n }\n\n return {\n message: data.message,\n remainingTime: data.remainingTime,\n lockTime: data.lockTime,\n guessCount: data.guessCount,\n };\n}\n\n/**\n * Checks responses for rate limit errors and returns details if found.\n * Examines all responses and returns the rate limit with the longest remaining time.\n *\n * @param resultArr - The result array to check for rate limit errors.\n * @returns Rate limit details if found, undefined otherwise.\n */\nexport function checkRateLimitErrors<Type>(\n resultArr: Type[],\n): RateLimitErrorData | undefined {\n const errorResponses = filterErrorResponses(resultArr);\n let maxRateLimit: RateLimitErrorData | undefined;\n\n for (const res of errorResponses) {\n const rateLimitDetails = extractRateLimitDetails(res.error);\n\n if (!rateLimitDetails) {\n continue;\n }\n\n if (maxRateLimit) {\n maxRateLimit = getMaxRateLimitError(maxRateLimit, rateLimitDetails);\n } else {\n maxRateLimit = rateLimitDetails;\n }\n }\n\n return maxRateLimit;\n}\n\n/**\n * Merges the auth tokens with the endpoints.\n *\n * @param authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param nodeEndpointsMap - Map of node index to endpoint to be used for the get pub key request.\n *\n * @returns The merged auth tokens and endpoints.\n *\n * @throws If the endpoint is not found for a node index.\n */\nexport function mergeEndpointsWithAuthTokens(\n authTokens: NodeAuthTokens,\n nodeEndpointsMap: Record<number, string>,\n): { endpoint: string; authToken: NodeAuthToken }[] {\n return authTokens.map((authToken) => {\n const endpoint = nodeEndpointsMap[authToken.nodeIndex];\n if (!endpoint) {\n throw TOPRFError.endpointNotFound(\n `Endpoint not found for node index ${authToken.nodeIndex}`,\n );\n }\n return {\n endpoint,\n authToken,\n };\n });\n}\n\n/**\n * Parses a JSON-RPC error and returns TOPRFError instance.\n *\n * @param rpcError - The error object from a JSON-RPC response\n * @returns TOPRFError instance\n */\nexport function parseJsonRpcError(rpcError: JSONRPCError): ITOPRFError {\n if (rpcError.code === JsonRpcErrorCodes.ErrorCodeInvalidParams) {\n // Check for expired auth token first since it's a specific case of auth token error\n if (rpcError.message.toLowerCase().includes('auth token expired')) {\n return TOPRFError.authTokenExpired();\n }\n\n // Check for general auth token validation failures\n if (rpcError.message.toLowerCase().includes('invalid auth token')) {\n return TOPRFError.invalidAuthToken();\n }\n\n let errorDescription = rpcError.message;\n if (typeof rpcError.data === 'string') {\n errorDescription = rpcError.data;\n } else if (rpcError.data) {\n const data = toCamelCaseKeys(rpcError.data as JSONValue) as Record<\n string,\n unknown\n >;\n errorDescription = JSON.stringify(data);\n }\n\n return TOPRFError.jsonRpcError(errorDescription);\n } else if (rpcError.code === JsonRpcErrorCodes.ErrorCodeInternal) {\n const errorDescription = rpcError.data ?? rpcError.message;\n return TOPRFError.jsonRpcError(errorDescription as string);\n }\n\n return TOPRFError.default(rpcError.message);\n}\n\n/**\n * Parses a SomeError and returns the predicate error if it exists.\n *\n * @param error - The error object to parse\n * @returns The predicate error if it exists, otherwise the original error\n */\nexport function getTOPRFError(error: Error): Error {\n if (\n error instanceof SomeError &&\n error.predicate &&\n error.predicate instanceof TOPRFError\n ) {\n return error.predicate;\n }\n\n return error;\n}\n\n/**\n * Preserves the key order of the object\n *\n * @param _a - The first object\n * @param _a.key - The key of the first object\n * @param _a.value - The value of the first object\n * @param _b - The second object\n * @param _b.key - The key of the second object\n * @param _b.value - The value of the second object\n * @returns 0\n */\nexport function preserveKeyOrder(\n _a: { key: string; value: unknown },\n _b: { key: string; value: unknown },\n): number {\n return 0;\n}\n"]} | ||
| {"version":3,"file":"utils.cjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n EciesHex,\n JRPCRequest,\n JSONValue,\n ShareMap,\n JSONRPCError,\n} from '@metamask/auth-network-utils';\nimport {\n SomeError,\n encParamsHexToBuf,\n encryptedParamsBufToHex,\n filterErrorResponses,\n generateRandomPolynomial,\n getSecp256K1Curve,\n isJSONRPCError,\n toCamelCaseKeys,\n toSnakeCaseKeys,\n} from '@metamask/auth-network-utils';\nimport { secp256k1 as secp256k1Noble } from '@noble/curves/secp256k1';\nimport { keccak_256 as keccak256 } from '@noble/hashes/sha3';\nimport { decrypt, encrypt } from '@toruslabs/eccrypto';\nimport { post } from '@toruslabs/http-helpers';\nimport BN from 'bn.js';\nimport type * as EC from 'elliptic';\n\nimport { GENERATE_SHARE_THRESHOLD, JsonRpcErrorCodes } from './constants';\nimport { TOPRFError, TOPRFErrorCode } from './errors';\nimport type { ITOPRFError, RateLimitErrorData } from './errors';\nimport type {\n KeyChangeProof,\n NodeAuthToken,\n NodeAuthTokens,\n} from './interfaces';\nimport type { ShareImportItem, ToprfEvalJRPCResponse } from './jrpcInterfaces';\n\ntype EncryptedData = {\n data: string;\n metadata: Omit<EciesHex, 'ciphertext'>;\n};\n\n/**\n * Converts a BigInt to BN\n *\n * @param value - BigInt value to convert\n * @returns BN instance\n */\nexport const bigIntToBN = (value: bigint): BN => {\n return new BN(value.toString());\n};\n\n/**\n * Common post function that handles snake_case conversion of request params\n * and camelCase conversion of response result.\n *\n * @param endpoint - The endpoint to make the request to\n * @param request - The request object to send. The params are converted to snake_case.\n *\n * @returns The response with camelCase converted result\n */\nexport const postJRPCRequest = async <\n Response extends {\n id: number;\n jsonrpc: '2.0';\n result?: JSONValue | undefined;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n },\n>(\n endpoint: string,\n request: JRPCRequest<JSONValue>,\n): Promise<Response> => {\n const req = { ...request };\n req.params = toSnakeCaseKeys(request.params);\n\n return post<Response>(endpoint, req, {}, { logTracingHeader: false })\n .then((res) => {\n if (res.result) {\n res.result = toCamelCaseKeys(res.result);\n }\n return res;\n })\n .catch((er: unknown) => {\n return {\n id: request.id,\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Internal error',\n data: er,\n },\n } as Response;\n });\n};\n\n/**\n * Decrypts the auth token using the session private key\n *\n * @param authToken - The auth token to be decrypted.\n * @param sessionPrivateKey - The session private key to be used for the decryption.\n *\n * @returns The decrypted auth token.\n */\nexport const decryptAuthToken = async (\n authToken: string,\n sessionPrivateKey: Uint8Array,\n): Promise<string> => {\n const authTokenData = JSON.parse(authToken) as EncryptedData;\n const metadata = encParamsHexToBuf(authTokenData.metadata);\n\n const decryptedAuthToken = await decrypt(Buffer.from(sessionPrivateKey), {\n ...metadata,\n ciphertext: Buffer.from(authTokenData.data, 'hex'),\n });\n return Buffer.from(decryptedAuthToken).toString('base64');\n};\n\n/**\n * Generates len(nodeIndexes) number of shares for a given private key with a given threshold.\n *\n * @param ecCurve - The elliptic curve to be used for the secret sharing.\n * @param nodeIndexes - The node indexes to be used for the secret sharing.\n * @param privKey - The private key to be used for secret sharing.\n * @param threshold - The threshold for the secret sharing.\n *\n * @returns Map of node indexes to shares.\n */\nconst generateShares = (\n ecCurve: EC.ec,\n nodeIndexes: number[],\n privKey: BN,\n threshold: number,\n): ShareMap => {\n const nodeIndexesBn = nodeIndexes.map((index) => new BN(index));\n const degree = threshold - 1;\n const poly = generateRandomPolynomial(ecCurve, degree, privKey);\n return poly.generateShares(nodeIndexesBn);\n};\n\n/**\n * Encrypts given data using pub key.\n *\n * @param data - Data to be encrypted in buffer format.\n * @param pubKey - Encryption pub key buffer.\n * @returns The encrypted data, encrypted with the given node's public key.\n */\nconst encryptData = async (\n data: Buffer,\n pubKey: Buffer,\n): Promise<EncryptedData> => {\n const encryptedData = await encrypt(pubKey, data, { padding: true });\n const encryptedDataHex = encryptedParamsBufToHex(encryptedData);\n return {\n data: Buffer.from(encryptedData.ciphertext).toString('hex'),\n metadata: {\n ...encryptedDataHex,\n },\n };\n};\n\n/**\n * Prepares shares for the given nodes, calculating threshold and converting parameters\n *\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param privKey - Private key to use for shares\n * @returns The prepared shares and node indexes\n */\nexport const prepareNodeShares = (\n nodeEndpointsMap: Record<number, string>,\n privKey: bigint,\n): { shares: ShareMap; nodeIndexes: number[] } => {\n const privKeyBN = bigIntToBN(privKey);\n const ecCurve = getSecp256K1Curve();\n const allNodeIndexes = Object.keys(nodeEndpointsMap).map((val: string) =>\n parseInt(val, 10),\n );\n const threshold = GENERATE_SHARE_THRESHOLD;\n const shares = generateShares(ecCurve, allNodeIndexes, privKeyBN, threshold);\n\n return { shares, nodeIndexes: allNodeIndexes };\n};\n\n/**\n * Formats a share value into a 32-byte buffer with padding and base64 encoding\n *\n * @param shareValue - BN share value to format\n * @returns Base64 string of padded share\n */\nconst formatShareForSigning = (shareValue: BN): string => {\n // Convert to padded 32-byte buffer with value right-aligned\n const buffer = shareValue.toArrayLike(Buffer, 'be', 32);\n\n // Convert to base64\n return buffer.toString('base64');\n};\n\n/**\n * Creates an Ethereum format signature (r+s+v)\n *\n * @param dataHash - Hash to sign\n * @param privateKeyBigInt - Private key as bigint\n * @returns Signature as r+s+v hex string\n */\nexport const createEthereumSignature = (\n dataHash: Uint8Array,\n privateKeyBigInt: bigint,\n): string => {\n const privateKeyHex = privateKeyBigInt.toString(16).padStart(64, '0');\n const signResult = secp256k1Noble.sign(dataHash, privateKeyHex);\n\n const signature = signResult.toCompactHex();\n const recV = (signResult.recovery + 27).toString(16).padStart(2, '0');\n\n return signature + recV;\n};\n\n/**\n * Creates a signature for key change using the share and old private key\n *\n * @param shareValue - Raw share value to sign\n * @param keyShareIndex - Key index for the share\n * @param nodeIndex - Node index\n * @param oldAuthPrivKey - Old auth private key for signing\n * @returns The signature and timestamp as KeyChangeProof\n */\nexport const createKeyChangeProof = (\n shareValue: BN,\n keyShareIndex: number,\n nodeIndex: number,\n oldAuthPrivKey: bigint,\n): KeyChangeProof => {\n const timestamp = Math.floor(Date.now() / 1000);\n const shareBase64 = formatShareForSigning(shareValue);\n\n const dataToSign = toSnakeCaseKeys({\n shareData: shareBase64,\n keyShareIndex,\n nodeIndex,\n timestamp,\n });\n\n const jsonData = JSON.stringify(dataToSign);\n const dataHash = keccak256(jsonData);\n const signature = createEthereumSignature(dataHash, oldAuthPrivKey);\n\n return {\n oldKeySignature: signature,\n signatureTimestamp: timestamp,\n };\n};\n\n/**\n * Generate standard share import items without key change proof\n *\n * @param shares - The raw shares generated for each node\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param authTokens - Auth tokens for each node\n * @param keyShareIndex - Key index for the shares\n * @returns Share import items for standard flow\n */\nexport const createNewUserShareImportItems = async (\n shares: ShareMap,\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n keyShareIndex: number,\n): Promise<ShareImportItem[]> => {\n return Promise.all(\n authTokens.map(async (tokenData) => {\n const { nodePubKey, nodeIndex, authToken } = tokenData;\n\n // Get the raw share for this node\n const keyShare = new BN(nodeIndex).toString('hex', 64);\n const share = shares[keyShare];\n const shareJson = share.toJSON() as Record<string, string>;\n\n // Encrypt the share\n const encryptedShare = await encryptData(\n Buffer.from(shareJson.share, 'hex'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Encrypt the auth token\n const encryptedAuthToken = await encryptData(\n Buffer.from(authToken, 'base64'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Return the standard share import item\n return {\n encryptedShare: JSON.stringify(encryptedShare),\n encryptedAuthToken: JSON.stringify(encryptedAuthToken),\n keyShareIndex,\n nodeIndex,\n sssEndpoint: nodeEndpointsMap[nodeIndex],\n };\n }),\n );\n};\n\n/**\n * Generate key change share import items with proofs\n *\n * @param shares - The raw shares generated for each node\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param authTokens - Auth tokens for each node\n * @param keyShareIndex - Key index for the shares\n * @param oldAuthPrivKey - Old private key for signing\n * @returns Share import items for key change flow\n */\nexport const createKeyChangeShareImportItems = async (\n shares: ShareMap,\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n keyShareIndex: number,\n oldAuthPrivKey: bigint,\n): Promise<ShareImportItem<'keyChange'>[]> => {\n return Promise.all(\n authTokens.map(async (tokenData) => {\n const { nodePubKey, nodeIndex, authToken } = tokenData;\n\n // Get the raw share for this node\n const keyShare = new BN(nodeIndex).toString('hex', 64);\n const share = shares[keyShare];\n const shareJson = share.toJSON() as Record<string, string>;\n\n // Create key change proof\n const shareValue = new BN(shareJson.share, 16);\n const keyChangeProof = createKeyChangeProof(\n shareValue,\n keyShareIndex,\n nodeIndex,\n oldAuthPrivKey,\n );\n\n // Encrypt the share\n const encryptedShare = await encryptData(\n Buffer.from(shareJson.share, 'hex'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Encrypt the auth token\n const encryptedAuthToken = await encryptData(\n Buffer.from(authToken, 'base64'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Return the key change share import item\n return {\n encryptedShare: JSON.stringify(encryptedShare),\n encryptedAuthToken: JSON.stringify(encryptedAuthToken),\n keyShareIndex,\n nodeIndex,\n sssEndpoint: nodeEndpointsMap[nodeIndex],\n ...keyChangeProof,\n };\n }),\n );\n};\n\n/**\n * Generates encrypted share import items for each node\n *\n * @param nodeEndpointsMap - Map of node indexes to endpoints.\n * @param authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param privKey - The private key to be used for the share import items.\n * @param keyShareIndex - The key share index to be used for the share import items.\n * @param args - Additional arguments based on ShareType.\n * When ShareType is 'keyChange', this must include the old auth private key for signing.\n *\n * @returns The share import items containing the encrypted shares. Will be type\n * ShareImportItem<'standard'> when using standard flow or\n * ShareImportItem<'keyChange'> when using key change flow.\n */\nexport const generateShareImportItems = async <\n ShareType extends 'standard' | 'keyChange' = 'standard',\n>(\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n privKey: bigint,\n keyShareIndex: number,\n ...args: ShareType extends 'keyChange' ? [oldAuthPrivKey: bigint] : []\n): Promise<ShareImportItem<ShareType>[]> => {\n // First prepare the shares for all nodes\n const { shares } = prepareNodeShares(nodeEndpointsMap, privKey);\n\n const oldAuthPrivKey = args[0];\n\n // Generate appropriate share import items based on whether it's a key change\n if (oldAuthPrivKey !== undefined) {\n return createKeyChangeShareImportItems(\n shares,\n nodeEndpointsMap,\n authTokens,\n keyShareIndex,\n oldAuthPrivKey,\n ) as unknown as ShareImportItem<ShareType>[];\n }\n\n return createNewUserShareImportItems(\n shares,\n nodeEndpointsMap,\n authTokens,\n keyShareIndex,\n ) as unknown as ShareImportItem<ShareType>[];\n};\n\n/**\n * Creates a map of node indexes to endpoints\n *\n * @param nodeEndpoints - The endpoints of the nodes.\n * @param nodeIndexes - The indexes of the nodes.\n *\n * @returns A map of node indexes to endpoints.\n */\nexport const createNodeEndpointsMap = (\n nodeEndpoints: string[],\n nodeIndexes: number[],\n): Record<number, string> => {\n return nodeIndexes.reduce<Record<number, string>>((acc, index) => {\n acc[index] = nodeEndpoints[index - 1];\n return acc;\n }, {});\n};\n\n/**\n * Compares two rate limit errors and returns the one with the longest remaining time.\n *\n * @param error1 - The first rate limit error\n * @param error2 - The second rate limit error\n * @returns The rate limit error with the longest remaining time\n */\nexport function getMaxRateLimitError(\n error1: RateLimitErrorData,\n error2: RateLimitErrorData,\n): RateLimitErrorData {\n if (error1.remainingTime > error2.remainingTime) {\n return error1;\n }\n return error2;\n}\n\n/**\n * Extracts rate limit details from a toprf eval result\n *\n * @param results - TOPRF Eval results\n * @returns Rate limit details if found, undefined otherwise\n */\nexport function extractRateLimitErrorFromResults(\n results: ToprfEvalJRPCResponse[],\n): RateLimitErrorData | undefined {\n let maxRateLimit: RateLimitErrorData | undefined;\n for (const result of results) {\n if (\n result.result?.lockTimeSeconds &&\n result.result.lockTimeSeconds > 0 &&\n result.result.guessCount\n ) {\n const rateLimitError = {\n remainingTime: result.result.lockTimeSeconds,\n message: 'Rate limit exceeded',\n lockTime: result.result.lockTimeSeconds,\n guessCount: result.result.guessCount,\n };\n\n if (maxRateLimit) {\n maxRateLimit = getMaxRateLimitError(maxRateLimit, rateLimitError);\n } else {\n maxRateLimit = rateLimitError;\n }\n }\n }\n\n return maxRateLimit;\n}\n\n/**\n * Extracts rate limit details from a JSON-RPC error response if it's a rate limit error.\n *\n * @param error - The error object from a JSON-RPC response\n * @returns Rate limit details if found, undefined otherwise\n */\nfunction extractRateLimitDetails(\n error: unknown,\n): RateLimitErrorData | undefined {\n if (\n !isJSONRPCError(error) ||\n error.code !== -32602 ||\n error.message !== 'Rate limit exceeded' ||\n !error.data\n ) {\n return undefined;\n }\n\n const data = toCamelCaseKeys(error.data as JSONValue) as Record<\n string,\n unknown\n >;\n\n if (\n typeof data?.message !== 'string' ||\n typeof data?.remainingTime !== 'number' ||\n typeof data?.lockTime !== 'number' ||\n typeof data?.guessCount !== 'number'\n ) {\n return undefined;\n }\n\n return {\n message: data.message,\n remainingTime: data.remainingTime,\n lockTime: data.lockTime,\n guessCount: data.guessCount,\n };\n}\n\n/**\n * Checks responses for rate limit errors and returns details if found.\n * Examines all responses and returns the rate limit with the longest remaining time.\n *\n * @param resultArr - The result array to check for rate limit errors.\n * @returns Rate limit details if found, undefined otherwise.\n */\nexport function checkRateLimitErrors<Type>(\n resultArr: Type[],\n): RateLimitErrorData | undefined {\n const errorResponses = filterErrorResponses(resultArr);\n let maxRateLimit: RateLimitErrorData | undefined;\n\n for (const res of errorResponses) {\n const rateLimitDetails = extractRateLimitDetails(res.error);\n\n if (!rateLimitDetails) {\n continue;\n }\n\n if (maxRateLimit) {\n maxRateLimit = getMaxRateLimitError(maxRateLimit, rateLimitDetails);\n } else {\n maxRateLimit = rateLimitDetails;\n }\n }\n\n return maxRateLimit;\n}\n\n/**\n * Checks responses for auth token errors (expired or invalid).\n *\n * @param resultArr - The result array to check for auth token errors.\n * @returns The parsed error if auth token error is found, undefined otherwise.\n */\nexport function checkAuthTokenErrors<Type>(\n resultArr: Type[],\n): ITOPRFError | undefined {\n const errorResponses = filterErrorResponses(resultArr);\n\n for (const res of errorResponses) {\n if (isJSONRPCError(res.error)) {\n const parsedError = parseJsonRpcError(res.error);\n if (\n parsedError.code === TOPRFErrorCode.AuthTokenExpired ||\n parsedError.code === TOPRFErrorCode.InvalidAuthToken\n ) {\n return parsedError;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Merges the auth tokens with the endpoints.\n *\n * @param authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param nodeEndpointsMap - Map of node index to endpoint to be used for the get pub key request.\n *\n * @returns The merged auth tokens and endpoints.\n *\n * @throws If the endpoint is not found for a node index.\n */\nexport function mergeEndpointsWithAuthTokens(\n authTokens: NodeAuthTokens,\n nodeEndpointsMap: Record<number, string>,\n): { endpoint: string; authToken: NodeAuthToken }[] {\n return authTokens.map((authToken) => {\n const endpoint = nodeEndpointsMap[authToken.nodeIndex];\n if (!endpoint) {\n throw TOPRFError.endpointNotFound(\n `Endpoint not found for node index ${authToken.nodeIndex}`,\n );\n }\n return {\n endpoint,\n authToken,\n };\n });\n}\n\n/**\n * Parses a JSON-RPC error and returns TOPRFError instance.\n *\n * @param rpcError - The error object from a JSON-RPC response\n * @returns TOPRFError instance\n */\nexport function parseJsonRpcError(rpcError: JSONRPCError): ITOPRFError {\n if (rpcError.code === JsonRpcErrorCodes.ErrorCodeInvalidParams) {\n // Check for expired auth token first since it's a specific case of auth token error\n if (rpcError.message.toLowerCase().includes('auth token expired')) {\n return TOPRFError.authTokenExpired();\n }\n\n // Check for general auth token validation failures\n if (rpcError.message.toLowerCase().includes('invalid auth token')) {\n return TOPRFError.invalidAuthToken();\n }\n\n let errorDescription = rpcError.message;\n if (typeof rpcError.data === 'string') {\n errorDescription = rpcError.data;\n } else if (rpcError.data) {\n const data = toCamelCaseKeys(rpcError.data as JSONValue) as Record<\n string,\n unknown\n >;\n errorDescription = JSON.stringify(data);\n }\n\n return TOPRFError.jsonRpcError(errorDescription);\n } else if (rpcError.code === JsonRpcErrorCodes.ErrorCodeInternal) {\n const errorDescription = rpcError.data ?? rpcError.message;\n return TOPRFError.jsonRpcError(errorDescription as string);\n }\n\n return TOPRFError.default(rpcError.message);\n}\n\n/**\n * Parses a SomeError and returns the predicate error if it exists.\n *\n * @param error - The error object to parse\n * @returns The predicate error if it exists, otherwise the original error\n */\nexport function getTOPRFError(error: Error): Error {\n if (\n error instanceof SomeError &&\n error.predicate &&\n error.predicate instanceof TOPRFError\n ) {\n return error.predicate;\n }\n\n return error;\n}\n\n/**\n * Preserves the key order of the object\n *\n * @param _a - The first object\n * @param _a.key - The key of the first object\n * @param _a.value - The value of the first object\n * @param _b - The second object\n * @param _b.key - The key of the second object\n * @param _b.value - The value of the second object\n * @returns 0\n */\nexport function preserveKeyOrder(\n _a: { key: string; value: unknown },\n _b: { key: string; value: unknown },\n): number {\n return 0;\n}\n"]} |
+7
-0
@@ -139,2 +139,9 @@ import type { JRPCRequest, JSONValue, ShareMap, JSONRPCError } from "@metamask/auth-network-utils"; | ||
| /** | ||
| * Checks responses for auth token errors (expired or invalid). | ||
| * | ||
| * @param resultArr - The result array to check for auth token errors. | ||
| * @returns The parsed error if auth token error is found, undefined otherwise. | ||
| */ | ||
| export declare function checkAuthTokenErrors<Type>(resultArr: Type[]): ITOPRFError | undefined; | ||
| /** | ||
| * Merges the auth tokens with the endpoints. | ||
@@ -141,0 +148,0 @@ * |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"utils.d.cts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"utils.d.cts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} |
+7
-0
@@ -139,2 +139,9 @@ import type { JRPCRequest, JSONValue, ShareMap, JSONRPCError } from "@metamask/auth-network-utils"; | ||
| /** | ||
| * Checks responses for auth token errors (expired or invalid). | ||
| * | ||
| * @param resultArr - The result array to check for auth token errors. | ||
| * @returns The parsed error if auth token error is found, undefined otherwise. | ||
| */ | ||
| export declare function checkAuthTokenErrors<Type>(resultArr: Type[]): ITOPRFError | undefined; | ||
| /** | ||
| * Merges the auth tokens with the endpoints. | ||
@@ -141,0 +148,0 @@ * |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"utils.d.mts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"utils.d.mts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} |
+20
-1
@@ -15,3 +15,3 @@ function $importDefault(module) { | ||
| import { GENERATE_SHARE_THRESHOLD, JsonRpcErrorCodes } from "./constants.mjs"; | ||
| import { TOPRFError } from "./errors.mjs"; | ||
| import { TOPRFError, TOPRFErrorCode } from "./errors.mjs"; | ||
| /** | ||
@@ -370,2 +370,21 @@ * Converts a BigInt to BN | ||
| /** | ||
| * Checks responses for auth token errors (expired or invalid). | ||
| * | ||
| * @param resultArr - The result array to check for auth token errors. | ||
| * @returns The parsed error if auth token error is found, undefined otherwise. | ||
| */ | ||
| export function checkAuthTokenErrors(resultArr) { | ||
| const errorResponses = filterErrorResponses(resultArr); | ||
| for (const res of errorResponses) { | ||
| if (isJSONRPCError(res.error)) { | ||
| const parsedError = parseJsonRpcError(res.error); | ||
| if (parsedError.code === TOPRFErrorCode.AuthTokenExpired || | ||
| parsedError.code === TOPRFErrorCode.InvalidAuthToken) { | ||
| return parsedError; | ||
| } | ||
| } | ||
| } | ||
| return undefined; | ||
| } | ||
| /** | ||
| * Merges the auth tokens with the endpoints. | ||
@@ -372,0 +391,0 @@ * |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"utils.mjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n EciesHex,\n JRPCRequest,\n JSONValue,\n ShareMap,\n JSONRPCError,\n} from '@metamask/auth-network-utils';\nimport {\n SomeError,\n encParamsHexToBuf,\n encryptedParamsBufToHex,\n filterErrorResponses,\n generateRandomPolynomial,\n getSecp256K1Curve,\n isJSONRPCError,\n toCamelCaseKeys,\n toSnakeCaseKeys,\n} from '@metamask/auth-network-utils';\nimport { secp256k1 as secp256k1Noble } from '@noble/curves/secp256k1';\nimport { keccak_256 as keccak256 } from '@noble/hashes/sha3';\nimport { decrypt, encrypt } from '@toruslabs/eccrypto';\nimport { post } from '@toruslabs/http-helpers';\nimport BN from 'bn.js';\nimport type * as EC from 'elliptic';\n\nimport { GENERATE_SHARE_THRESHOLD, JsonRpcErrorCodes } from './constants';\nimport { TOPRFError } from './errors';\nimport type { ITOPRFError, RateLimitErrorData } from './errors';\nimport type {\n KeyChangeProof,\n NodeAuthToken,\n NodeAuthTokens,\n} from './interfaces';\nimport type { ShareImportItem, ToprfEvalJRPCResponse } from './jrpcInterfaces';\n\ntype EncryptedData = {\n data: string;\n metadata: Omit<EciesHex, 'ciphertext'>;\n};\n\n/**\n * Converts a BigInt to BN\n *\n * @param value - BigInt value to convert\n * @returns BN instance\n */\nexport const bigIntToBN = (value: bigint): BN => {\n return new BN(value.toString());\n};\n\n/**\n * Common post function that handles snake_case conversion of request params\n * and camelCase conversion of response result.\n *\n * @param endpoint - The endpoint to make the request to\n * @param request - The request object to send. The params are converted to snake_case.\n *\n * @returns The response with camelCase converted result\n */\nexport const postJRPCRequest = async <\n Response extends {\n id: number;\n jsonrpc: '2.0';\n result?: JSONValue | undefined;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n },\n>(\n endpoint: string,\n request: JRPCRequest<JSONValue>,\n): Promise<Response> => {\n const req = { ...request };\n req.params = toSnakeCaseKeys(request.params);\n\n return post<Response>(endpoint, req, {}, { logTracingHeader: false })\n .then((res) => {\n if (res.result) {\n res.result = toCamelCaseKeys(res.result);\n }\n return res;\n })\n .catch((er: unknown) => {\n return {\n id: request.id,\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Internal error',\n data: er,\n },\n } as Response;\n });\n};\n\n/**\n * Decrypts the auth token using the session private key\n *\n * @param authToken - The auth token to be decrypted.\n * @param sessionPrivateKey - The session private key to be used for the decryption.\n *\n * @returns The decrypted auth token.\n */\nexport const decryptAuthToken = async (\n authToken: string,\n sessionPrivateKey: Uint8Array,\n): Promise<string> => {\n const authTokenData = JSON.parse(authToken) as EncryptedData;\n const metadata = encParamsHexToBuf(authTokenData.metadata);\n\n const decryptedAuthToken = await decrypt(Buffer.from(sessionPrivateKey), {\n ...metadata,\n ciphertext: Buffer.from(authTokenData.data, 'hex'),\n });\n return Buffer.from(decryptedAuthToken).toString('base64');\n};\n\n/**\n * Generates len(nodeIndexes) number of shares for a given private key with a given threshold.\n *\n * @param ecCurve - The elliptic curve to be used for the secret sharing.\n * @param nodeIndexes - The node indexes to be used for the secret sharing.\n * @param privKey - The private key to be used for secret sharing.\n * @param threshold - The threshold for the secret sharing.\n *\n * @returns Map of node indexes to shares.\n */\nconst generateShares = (\n ecCurve: EC.ec,\n nodeIndexes: number[],\n privKey: BN,\n threshold: number,\n): ShareMap => {\n const nodeIndexesBn = nodeIndexes.map((index) => new BN(index));\n const degree = threshold - 1;\n const poly = generateRandomPolynomial(ecCurve, degree, privKey);\n return poly.generateShares(nodeIndexesBn);\n};\n\n/**\n * Encrypts given data using pub key.\n *\n * @param data - Data to be encrypted in buffer format.\n * @param pubKey - Encryption pub key buffer.\n * @returns The encrypted data, encrypted with the given node's public key.\n */\nconst encryptData = async (\n data: Buffer,\n pubKey: Buffer,\n): Promise<EncryptedData> => {\n const encryptedData = await encrypt(pubKey, data, { padding: true });\n const encryptedDataHex = encryptedParamsBufToHex(encryptedData);\n return {\n data: Buffer.from(encryptedData.ciphertext).toString('hex'),\n metadata: {\n ...encryptedDataHex,\n },\n };\n};\n\n/**\n * Prepares shares for the given nodes, calculating threshold and converting parameters\n *\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param privKey - Private key to use for shares\n * @returns The prepared shares and node indexes\n */\nexport const prepareNodeShares = (\n nodeEndpointsMap: Record<number, string>,\n privKey: bigint,\n): { shares: ShareMap; nodeIndexes: number[] } => {\n const privKeyBN = bigIntToBN(privKey);\n const ecCurve = getSecp256K1Curve();\n const allNodeIndexes = Object.keys(nodeEndpointsMap).map((val: string) =>\n parseInt(val, 10),\n );\n const threshold = GENERATE_SHARE_THRESHOLD;\n const shares = generateShares(ecCurve, allNodeIndexes, privKeyBN, threshold);\n\n return { shares, nodeIndexes: allNodeIndexes };\n};\n\n/**\n * Formats a share value into a 32-byte buffer with padding and base64 encoding\n *\n * @param shareValue - BN share value to format\n * @returns Base64 string of padded share\n */\nconst formatShareForSigning = (shareValue: BN): string => {\n // Convert to padded 32-byte buffer with value right-aligned\n const buffer = shareValue.toArrayLike(Buffer, 'be', 32);\n\n // Convert to base64\n return buffer.toString('base64');\n};\n\n/**\n * Creates an Ethereum format signature (r+s+v)\n *\n * @param dataHash - Hash to sign\n * @param privateKeyBigInt - Private key as bigint\n * @returns Signature as r+s+v hex string\n */\nexport const createEthereumSignature = (\n dataHash: Uint8Array,\n privateKeyBigInt: bigint,\n): string => {\n const privateKeyHex = privateKeyBigInt.toString(16).padStart(64, '0');\n const signResult = secp256k1Noble.sign(dataHash, privateKeyHex);\n\n const signature = signResult.toCompactHex();\n const recV = (signResult.recovery + 27).toString(16).padStart(2, '0');\n\n return signature + recV;\n};\n\n/**\n * Creates a signature for key change using the share and old private key\n *\n * @param shareValue - Raw share value to sign\n * @param keyShareIndex - Key index for the share\n * @param nodeIndex - Node index\n * @param oldAuthPrivKey - Old auth private key for signing\n * @returns The signature and timestamp as KeyChangeProof\n */\nexport const createKeyChangeProof = (\n shareValue: BN,\n keyShareIndex: number,\n nodeIndex: number,\n oldAuthPrivKey: bigint,\n): KeyChangeProof => {\n const timestamp = Math.floor(Date.now() / 1000);\n const shareBase64 = formatShareForSigning(shareValue);\n\n const dataToSign = toSnakeCaseKeys({\n shareData: shareBase64,\n keyShareIndex,\n nodeIndex,\n timestamp,\n });\n\n const jsonData = JSON.stringify(dataToSign);\n const dataHash = keccak256(jsonData);\n const signature = createEthereumSignature(dataHash, oldAuthPrivKey);\n\n return {\n oldKeySignature: signature,\n signatureTimestamp: timestamp,\n };\n};\n\n/**\n * Generate standard share import items without key change proof\n *\n * @param shares - The raw shares generated for each node\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param authTokens - Auth tokens for each node\n * @param keyShareIndex - Key index for the shares\n * @returns Share import items for standard flow\n */\nexport const createNewUserShareImportItems = async (\n shares: ShareMap,\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n keyShareIndex: number,\n): Promise<ShareImportItem[]> => {\n return Promise.all(\n authTokens.map(async (tokenData) => {\n const { nodePubKey, nodeIndex, authToken } = tokenData;\n\n // Get the raw share for this node\n const keyShare = new BN(nodeIndex).toString('hex', 64);\n const share = shares[keyShare];\n const shareJson = share.toJSON() as Record<string, string>;\n\n // Encrypt the share\n const encryptedShare = await encryptData(\n Buffer.from(shareJson.share, 'hex'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Encrypt the auth token\n const encryptedAuthToken = await encryptData(\n Buffer.from(authToken, 'base64'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Return the standard share import item\n return {\n encryptedShare: JSON.stringify(encryptedShare),\n encryptedAuthToken: JSON.stringify(encryptedAuthToken),\n keyShareIndex,\n nodeIndex,\n sssEndpoint: nodeEndpointsMap[nodeIndex],\n };\n }),\n );\n};\n\n/**\n * Generate key change share import items with proofs\n *\n * @param shares - The raw shares generated for each node\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param authTokens - Auth tokens for each node\n * @param keyShareIndex - Key index for the shares\n * @param oldAuthPrivKey - Old private key for signing\n * @returns Share import items for key change flow\n */\nexport const createKeyChangeShareImportItems = async (\n shares: ShareMap,\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n keyShareIndex: number,\n oldAuthPrivKey: bigint,\n): Promise<ShareImportItem<'keyChange'>[]> => {\n return Promise.all(\n authTokens.map(async (tokenData) => {\n const { nodePubKey, nodeIndex, authToken } = tokenData;\n\n // Get the raw share for this node\n const keyShare = new BN(nodeIndex).toString('hex', 64);\n const share = shares[keyShare];\n const shareJson = share.toJSON() as Record<string, string>;\n\n // Create key change proof\n const shareValue = new BN(shareJson.share, 16);\n const keyChangeProof = createKeyChangeProof(\n shareValue,\n keyShareIndex,\n nodeIndex,\n oldAuthPrivKey,\n );\n\n // Encrypt the share\n const encryptedShare = await encryptData(\n Buffer.from(shareJson.share, 'hex'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Encrypt the auth token\n const encryptedAuthToken = await encryptData(\n Buffer.from(authToken, 'base64'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Return the key change share import item\n return {\n encryptedShare: JSON.stringify(encryptedShare),\n encryptedAuthToken: JSON.stringify(encryptedAuthToken),\n keyShareIndex,\n nodeIndex,\n sssEndpoint: nodeEndpointsMap[nodeIndex],\n ...keyChangeProof,\n };\n }),\n );\n};\n\n/**\n * Generates encrypted share import items for each node\n *\n * @param nodeEndpointsMap - Map of node indexes to endpoints.\n * @param authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param privKey - The private key to be used for the share import items.\n * @param keyShareIndex - The key share index to be used for the share import items.\n * @param args - Additional arguments based on ShareType.\n * When ShareType is 'keyChange', this must include the old auth private key for signing.\n *\n * @returns The share import items containing the encrypted shares. Will be type\n * ShareImportItem<'standard'> when using standard flow or\n * ShareImportItem<'keyChange'> when using key change flow.\n */\nexport const generateShareImportItems = async <\n ShareType extends 'standard' | 'keyChange' = 'standard',\n>(\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n privKey: bigint,\n keyShareIndex: number,\n ...args: ShareType extends 'keyChange' ? [oldAuthPrivKey: bigint] : []\n): Promise<ShareImportItem<ShareType>[]> => {\n // First prepare the shares for all nodes\n const { shares } = prepareNodeShares(nodeEndpointsMap, privKey);\n\n const oldAuthPrivKey = args[0];\n\n // Generate appropriate share import items based on whether it's a key change\n if (oldAuthPrivKey !== undefined) {\n return createKeyChangeShareImportItems(\n shares,\n nodeEndpointsMap,\n authTokens,\n keyShareIndex,\n oldAuthPrivKey,\n ) as unknown as ShareImportItem<ShareType>[];\n }\n\n return createNewUserShareImportItems(\n shares,\n nodeEndpointsMap,\n authTokens,\n keyShareIndex,\n ) as unknown as ShareImportItem<ShareType>[];\n};\n\n/**\n * Creates a map of node indexes to endpoints\n *\n * @param nodeEndpoints - The endpoints of the nodes.\n * @param nodeIndexes - The indexes of the nodes.\n *\n * @returns A map of node indexes to endpoints.\n */\nexport const createNodeEndpointsMap = (\n nodeEndpoints: string[],\n nodeIndexes: number[],\n): Record<number, string> => {\n return nodeIndexes.reduce<Record<number, string>>((acc, index) => {\n acc[index] = nodeEndpoints[index - 1];\n return acc;\n }, {});\n};\n\n/**\n * Compares two rate limit errors and returns the one with the longest remaining time.\n *\n * @param error1 - The first rate limit error\n * @param error2 - The second rate limit error\n * @returns The rate limit error with the longest remaining time\n */\nexport function getMaxRateLimitError(\n error1: RateLimitErrorData,\n error2: RateLimitErrorData,\n): RateLimitErrorData {\n if (error1.remainingTime > error2.remainingTime) {\n return error1;\n }\n return error2;\n}\n\n/**\n * Extracts rate limit details from a toprf eval result\n *\n * @param results - TOPRF Eval results\n * @returns Rate limit details if found, undefined otherwise\n */\nexport function extractRateLimitErrorFromResults(\n results: ToprfEvalJRPCResponse[],\n): RateLimitErrorData | undefined {\n let maxRateLimit: RateLimitErrorData | undefined;\n for (const result of results) {\n if (\n result.result?.lockTimeSeconds &&\n result.result.lockTimeSeconds > 0 &&\n result.result.guessCount\n ) {\n const rateLimitError = {\n remainingTime: result.result.lockTimeSeconds,\n message: 'Rate limit exceeded',\n lockTime: result.result.lockTimeSeconds,\n guessCount: result.result.guessCount,\n };\n\n if (maxRateLimit) {\n maxRateLimit = getMaxRateLimitError(maxRateLimit, rateLimitError);\n } else {\n maxRateLimit = rateLimitError;\n }\n }\n }\n\n return maxRateLimit;\n}\n\n/**\n * Extracts rate limit details from a JSON-RPC error response if it's a rate limit error.\n *\n * @param error - The error object from a JSON-RPC response\n * @returns Rate limit details if found, undefined otherwise\n */\nfunction extractRateLimitDetails(\n error: unknown,\n): RateLimitErrorData | undefined {\n if (\n !isJSONRPCError(error) ||\n error.code !== -32602 ||\n error.message !== 'Rate limit exceeded' ||\n !error.data\n ) {\n return undefined;\n }\n\n const data = toCamelCaseKeys(error.data as JSONValue) as Record<\n string,\n unknown\n >;\n\n if (\n typeof data?.message !== 'string' ||\n typeof data?.remainingTime !== 'number' ||\n typeof data?.lockTime !== 'number' ||\n typeof data?.guessCount !== 'number'\n ) {\n return undefined;\n }\n\n return {\n message: data.message,\n remainingTime: data.remainingTime,\n lockTime: data.lockTime,\n guessCount: data.guessCount,\n };\n}\n\n/**\n * Checks responses for rate limit errors and returns details if found.\n * Examines all responses and returns the rate limit with the longest remaining time.\n *\n * @param resultArr - The result array to check for rate limit errors.\n * @returns Rate limit details if found, undefined otherwise.\n */\nexport function checkRateLimitErrors<Type>(\n resultArr: Type[],\n): RateLimitErrorData | undefined {\n const errorResponses = filterErrorResponses(resultArr);\n let maxRateLimit: RateLimitErrorData | undefined;\n\n for (const res of errorResponses) {\n const rateLimitDetails = extractRateLimitDetails(res.error);\n\n if (!rateLimitDetails) {\n continue;\n }\n\n if (maxRateLimit) {\n maxRateLimit = getMaxRateLimitError(maxRateLimit, rateLimitDetails);\n } else {\n maxRateLimit = rateLimitDetails;\n }\n }\n\n return maxRateLimit;\n}\n\n/**\n * Merges the auth tokens with the endpoints.\n *\n * @param authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param nodeEndpointsMap - Map of node index to endpoint to be used for the get pub key request.\n *\n * @returns The merged auth tokens and endpoints.\n *\n * @throws If the endpoint is not found for a node index.\n */\nexport function mergeEndpointsWithAuthTokens(\n authTokens: NodeAuthTokens,\n nodeEndpointsMap: Record<number, string>,\n): { endpoint: string; authToken: NodeAuthToken }[] {\n return authTokens.map((authToken) => {\n const endpoint = nodeEndpointsMap[authToken.nodeIndex];\n if (!endpoint) {\n throw TOPRFError.endpointNotFound(\n `Endpoint not found for node index ${authToken.nodeIndex}`,\n );\n }\n return {\n endpoint,\n authToken,\n };\n });\n}\n\n/**\n * Parses a JSON-RPC error and returns TOPRFError instance.\n *\n * @param rpcError - The error object from a JSON-RPC response\n * @returns TOPRFError instance\n */\nexport function parseJsonRpcError(rpcError: JSONRPCError): ITOPRFError {\n if (rpcError.code === JsonRpcErrorCodes.ErrorCodeInvalidParams) {\n // Check for expired auth token first since it's a specific case of auth token error\n if (rpcError.message.toLowerCase().includes('auth token expired')) {\n return TOPRFError.authTokenExpired();\n }\n\n // Check for general auth token validation failures\n if (rpcError.message.toLowerCase().includes('invalid auth token')) {\n return TOPRFError.invalidAuthToken();\n }\n\n let errorDescription = rpcError.message;\n if (typeof rpcError.data === 'string') {\n errorDescription = rpcError.data;\n } else if (rpcError.data) {\n const data = toCamelCaseKeys(rpcError.data as JSONValue) as Record<\n string,\n unknown\n >;\n errorDescription = JSON.stringify(data);\n }\n\n return TOPRFError.jsonRpcError(errorDescription);\n } else if (rpcError.code === JsonRpcErrorCodes.ErrorCodeInternal) {\n const errorDescription = rpcError.data ?? rpcError.message;\n return TOPRFError.jsonRpcError(errorDescription as string);\n }\n\n return TOPRFError.default(rpcError.message);\n}\n\n/**\n * Parses a SomeError and returns the predicate error if it exists.\n *\n * @param error - The error object to parse\n * @returns The predicate error if it exists, otherwise the original error\n */\nexport function getTOPRFError(error: Error): Error {\n if (\n error instanceof SomeError &&\n error.predicate &&\n error.predicate instanceof TOPRFError\n ) {\n return error.predicate;\n }\n\n return error;\n}\n\n/**\n * Preserves the key order of the object\n *\n * @param _a - The first object\n * @param _a.key - The key of the first object\n * @param _a.value - The value of the first object\n * @param _b - The second object\n * @param _b.key - The key of the second object\n * @param _b.value - The value of the second object\n * @returns 0\n */\nexport function preserveKeyOrder(\n _a: { key: string; value: unknown },\n _b: { key: string; value: unknown },\n): number {\n return 0;\n}\n"]} | ||
| {"version":3,"file":"utils.mjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;AAOA,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EAChB,qCAAqC;AACtC,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,gCAAgC;AACtE,OAAO,EAAE,UAAU,IAAI,SAAS,EAAE,2BAA2B;AAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,4BAA4B;AACvD,OAAO,EAAE,IAAI,EAAE,gCAAgC;AAC/C,OAAO,GAAE,cAAc;;AAGvB,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,wBAAoB;AAC1E,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,qBAAiB;AActD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAM,EAAE;IAC9C,OAAO,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAYlC,QAAgB,EAChB,OAA+B,EACZ,EAAE;IACrB,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3B,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAO,IAAI,CAAW,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;SAClE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QACZ,IAAI,GAAG,CAAC,MAAM,EAAE;YACd,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC1C;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,EAAW,EAAE,EAAE;QACrB,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,KAAK;gBACZ,OAAO,EAAE,gBAAgB;gBACzB,IAAI,EAAE,EAAE;aACT;SACU,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,SAAiB,EACjB,iBAA6B,EACZ,EAAE;IACnB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAkB,CAAC;IAC7D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE3D,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;QACvE,GAAG,QAAQ;QACX,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC;KACnD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,cAAc,GAAG,CACrB,OAAc,EACd,WAAqB,EACrB,OAAW,EACX,SAAiB,EACP,EAAE;IACZ,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,KAAK,EACvB,IAAY,EACZ,MAAc,EACU,EAAE;IAC1B,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;IAChE,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC3D,QAAQ,EAAE;YACR,GAAG,gBAAgB;SACpB;KACF,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,gBAAwC,EACxC,OAAe,EAC8B,EAAE;IAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAW,EAAE,EAAE,CACvE,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAClB,CAAC;IACF,MAAM,SAAS,GAAG,wBAAwB,CAAC;IAC3C,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAE7E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACjD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,qBAAqB,GAAG,CAAC,UAAc,EAAU,EAAE;IACvD,4DAA4D;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAExD,oBAAoB;IACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,QAAoB,EACpB,gBAAwB,EAChB,EAAE;IACV,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAEhE,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEtE,OAAO,SAAS,GAAG,IAAI,CAAC;AAC1B,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,UAAc,EACd,aAAqB,EACrB,SAAiB,EACjB,cAAsB,EACN,EAAE;IAClB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,eAAe,CAAC;QACjC,SAAS,EAAE,WAAW;QACtB,aAAa;QACb,SAAS;QACT,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAEpE,OAAO;QACL,eAAe,EAAE,SAAS;QAC1B,kBAAkB,EAAE,SAAS;KAC9B,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,EAChD,MAAgB,EAChB,gBAAwC,EACxC,UAA0B,EAC1B,aAAqB,EACO,EAAE;IAC9B,OAAO,OAAO,CAAC,GAAG,CAChB,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QACjC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;QAEvD,kCAAkC;QAClC,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAA4B,CAAC;QAE3D,oBAAoB;QACpB,MAAM,cAAc,GAAG,MAAM,WAAW,CACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,EACnC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAC/B,CAAC;QAEF,yBAAyB;QACzB,MAAM,kBAAkB,GAAG,MAAM,WAAW,CAC1C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAChC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAC/B,CAAC;QAEF,wCAAwC;QACxC,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;YAC9C,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;YACtD,aAAa;YACb,SAAS;YACT,WAAW,EAAE,gBAAgB,CAAC,SAAS,CAAC;SACzC,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,KAAK,EAClD,MAAgB,EAChB,gBAAwC,EACxC,UAA0B,EAC1B,aAAqB,EACrB,cAAsB,EACmB,EAAE;IAC3C,OAAO,OAAO,CAAC,GAAG,CAChB,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QACjC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;QAEvD,kCAAkC;QAClC,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAA4B,CAAC;QAE3D,0BAA0B;QAC1B,MAAM,UAAU,GAAG,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,cAAc,GAAG,oBAAoB,CACzC,UAAU,EACV,aAAa,EACb,SAAS,EACT,cAAc,CACf,CAAC;QAEF,oBAAoB;QACpB,MAAM,cAAc,GAAG,MAAM,WAAW,CACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,EACnC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAC/B,CAAC;QAEF,yBAAyB;QACzB,MAAM,kBAAkB,GAAG,MAAM,WAAW,CAC1C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAChC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAC/B,CAAC;QAEF,0CAA0C;QAC1C,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;YAC9C,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;YACtD,aAAa;YACb,SAAS;YACT,WAAW,EAAE,gBAAgB,CAAC,SAAS,CAAC;YACxC,GAAG,cAAc;SAClB,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAG3C,gBAAwC,EACxC,UAA0B,EAC1B,OAAe,EACf,aAAqB,EACrB,GAAG,IAAmE,EAC/B,EAAE;IACzC,yCAAyC;IACzC,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAEhE,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/B,6EAA6E;IAC7E,IAAI,cAAc,KAAK,SAAS,EAAE;QAChC,OAAO,+BAA+B,CACpC,MAAM,EACN,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,cAAc,CAC4B,CAAC;KAC9C;IAED,OAAO,6BAA6B,CAClC,MAAM,EACN,gBAAgB,EAChB,UAAU,EACV,aAAa,CAC6B,CAAC;AAC/C,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,aAAuB,EACvB,WAAqB,EACG,EAAE;IAC1B,OAAO,WAAW,CAAC,MAAM,CAAyB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC/D,GAAG,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACtC,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAA0B,EAC1B,MAA0B;IAE1B,IAAI,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE;QAC/C,OAAO,MAAM,CAAC;KACf;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gCAAgC,CAC9C,OAAgC;IAEhC,IAAI,YAA4C,CAAC;IACjD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,IACE,MAAM,CAAC,MAAM,EAAE,eAAe;YAC9B,MAAM,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,UAAU,EACxB;YACA,MAAM,cAAc,GAAG;gBACrB,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe;gBAC5C,OAAO,EAAE,qBAAqB;gBAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe;gBACvC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;aACrC,CAAC;YAEF,IAAI,YAAY,EAAE;gBAChB,YAAY,GAAG,oBAAoB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;aACnE;iBAAM;gBACL,YAAY,GAAG,cAAc,CAAC;aAC/B;SACF;KACF;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAC9B,KAAc;IAEd,IACE,CAAC,cAAc,CAAC,KAAK,CAAC;QACtB,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK;QACrB,KAAK,CAAC,OAAO,KAAK,qBAAqB;QACvC,CAAC,KAAK,CAAC,IAAI,EACX;QACA,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,IAAiB,CAGnD,CAAC;IAEF,IACE,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ;QACjC,OAAO,IAAI,EAAE,aAAa,KAAK,QAAQ;QACvC,OAAO,IAAI,EAAE,QAAQ,KAAK,QAAQ;QAClC,OAAO,IAAI,EAAE,UAAU,KAAK,QAAQ,EACpC;QACA,OAAO,SAAS,CAAC;KAClB;IAED,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAiB;IAEjB,MAAM,cAAc,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,YAA4C,CAAC;IAEjD,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE;QAChC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE5D,IAAI,CAAC,gBAAgB,EAAE;YACrB,SAAS;SACV;QAED,IAAI,YAAY,EAAE;YAChB,YAAY,GAAG,oBAAoB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;SACrE;aAAM;YACL,YAAY,GAAG,gBAAgB,CAAC;SACjC;KACF;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAiB;IAEjB,MAAM,cAAc,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAEvD,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE;QAChC,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC7B,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACjD,IACE,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;gBACpD,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB,EACpD;gBACA,OAAO,WAAW,CAAC;aACpB;SACF;KACF;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,4BAA4B,CAC1C,UAA0B,EAC1B,gBAAwC;IAExC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,UAAU,CAAC,gBAAgB,CAC/B,qCAAqC,SAAS,CAAC,SAAS,EAAE,CAC3D,CAAC;SACH;QACD,OAAO;YACL,QAAQ;YACR,SAAS;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAsB;IACtD,IAAI,QAAQ,CAAC,IAAI,KAAK,iBAAiB,CAAC,sBAAsB,EAAE;QAC9D,oFAAoF;QACpF,IAAI,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;YACjE,OAAO,UAAU,CAAC,gBAAgB,EAAE,CAAC;SACtC;QAED,mDAAmD;QACnD,IAAI,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;YACjE,OAAO,UAAU,CAAC,gBAAgB,EAAE,CAAC;SACtC;QAED,IAAI,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC;QACxC,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE;YACrC,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC;SAClC;aAAM,IAAI,QAAQ,CAAC,IAAI,EAAE;YACxB,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAiB,CAGtD,CAAC;YACF,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SACzC;QAED,OAAO,UAAU,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;KAClD;SAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,iBAAiB,CAAC,iBAAiB,EAAE;QAChE,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC;QAC3D,OAAO,UAAU,CAAC,YAAY,CAAC,gBAA0B,CAAC,CAAC;KAC5D;IAED,OAAO,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAY;IACxC,IACE,KAAK,YAAY,SAAS;QAC1B,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,SAAS,YAAY,UAAU,EACrC;QACA,OAAO,KAAK,CAAC,SAAS,CAAC;KACxB;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAmC,EACnC,EAAmC;IAEnC,OAAO,CAAC,CAAC;AACX,CAAC","sourcesContent":["import type {\n EciesHex,\n JRPCRequest,\n JSONValue,\n ShareMap,\n JSONRPCError,\n} from '@metamask/auth-network-utils';\nimport {\n SomeError,\n encParamsHexToBuf,\n encryptedParamsBufToHex,\n filterErrorResponses,\n generateRandomPolynomial,\n getSecp256K1Curve,\n isJSONRPCError,\n toCamelCaseKeys,\n toSnakeCaseKeys,\n} from '@metamask/auth-network-utils';\nimport { secp256k1 as secp256k1Noble } from '@noble/curves/secp256k1';\nimport { keccak_256 as keccak256 } from '@noble/hashes/sha3';\nimport { decrypt, encrypt } from '@toruslabs/eccrypto';\nimport { post } from '@toruslabs/http-helpers';\nimport BN from 'bn.js';\nimport type * as EC from 'elliptic';\n\nimport { GENERATE_SHARE_THRESHOLD, JsonRpcErrorCodes } from './constants';\nimport { TOPRFError, TOPRFErrorCode } from './errors';\nimport type { ITOPRFError, RateLimitErrorData } from './errors';\nimport type {\n KeyChangeProof,\n NodeAuthToken,\n NodeAuthTokens,\n} from './interfaces';\nimport type { ShareImportItem, ToprfEvalJRPCResponse } from './jrpcInterfaces';\n\ntype EncryptedData = {\n data: string;\n metadata: Omit<EciesHex, 'ciphertext'>;\n};\n\n/**\n * Converts a BigInt to BN\n *\n * @param value - BigInt value to convert\n * @returns BN instance\n */\nexport const bigIntToBN = (value: bigint): BN => {\n return new BN(value.toString());\n};\n\n/**\n * Common post function that handles snake_case conversion of request params\n * and camelCase conversion of response result.\n *\n * @param endpoint - The endpoint to make the request to\n * @param request - The request object to send. The params are converted to snake_case.\n *\n * @returns The response with camelCase converted result\n */\nexport const postJRPCRequest = async <\n Response extends {\n id: number;\n jsonrpc: '2.0';\n result?: JSONValue | undefined;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n },\n>(\n endpoint: string,\n request: JRPCRequest<JSONValue>,\n): Promise<Response> => {\n const req = { ...request };\n req.params = toSnakeCaseKeys(request.params);\n\n return post<Response>(endpoint, req, {}, { logTracingHeader: false })\n .then((res) => {\n if (res.result) {\n res.result = toCamelCaseKeys(res.result);\n }\n return res;\n })\n .catch((er: unknown) => {\n return {\n id: request.id,\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Internal error',\n data: er,\n },\n } as Response;\n });\n};\n\n/**\n * Decrypts the auth token using the session private key\n *\n * @param authToken - The auth token to be decrypted.\n * @param sessionPrivateKey - The session private key to be used for the decryption.\n *\n * @returns The decrypted auth token.\n */\nexport const decryptAuthToken = async (\n authToken: string,\n sessionPrivateKey: Uint8Array,\n): Promise<string> => {\n const authTokenData = JSON.parse(authToken) as EncryptedData;\n const metadata = encParamsHexToBuf(authTokenData.metadata);\n\n const decryptedAuthToken = await decrypt(Buffer.from(sessionPrivateKey), {\n ...metadata,\n ciphertext: Buffer.from(authTokenData.data, 'hex'),\n });\n return Buffer.from(decryptedAuthToken).toString('base64');\n};\n\n/**\n * Generates len(nodeIndexes) number of shares for a given private key with a given threshold.\n *\n * @param ecCurve - The elliptic curve to be used for the secret sharing.\n * @param nodeIndexes - The node indexes to be used for the secret sharing.\n * @param privKey - The private key to be used for secret sharing.\n * @param threshold - The threshold for the secret sharing.\n *\n * @returns Map of node indexes to shares.\n */\nconst generateShares = (\n ecCurve: EC.ec,\n nodeIndexes: number[],\n privKey: BN,\n threshold: number,\n): ShareMap => {\n const nodeIndexesBn = nodeIndexes.map((index) => new BN(index));\n const degree = threshold - 1;\n const poly = generateRandomPolynomial(ecCurve, degree, privKey);\n return poly.generateShares(nodeIndexesBn);\n};\n\n/**\n * Encrypts given data using pub key.\n *\n * @param data - Data to be encrypted in buffer format.\n * @param pubKey - Encryption pub key buffer.\n * @returns The encrypted data, encrypted with the given node's public key.\n */\nconst encryptData = async (\n data: Buffer,\n pubKey: Buffer,\n): Promise<EncryptedData> => {\n const encryptedData = await encrypt(pubKey, data, { padding: true });\n const encryptedDataHex = encryptedParamsBufToHex(encryptedData);\n return {\n data: Buffer.from(encryptedData.ciphertext).toString('hex'),\n metadata: {\n ...encryptedDataHex,\n },\n };\n};\n\n/**\n * Prepares shares for the given nodes, calculating threshold and converting parameters\n *\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param privKey - Private key to use for shares\n * @returns The prepared shares and node indexes\n */\nexport const prepareNodeShares = (\n nodeEndpointsMap: Record<number, string>,\n privKey: bigint,\n): { shares: ShareMap; nodeIndexes: number[] } => {\n const privKeyBN = bigIntToBN(privKey);\n const ecCurve = getSecp256K1Curve();\n const allNodeIndexes = Object.keys(nodeEndpointsMap).map((val: string) =>\n parseInt(val, 10),\n );\n const threshold = GENERATE_SHARE_THRESHOLD;\n const shares = generateShares(ecCurve, allNodeIndexes, privKeyBN, threshold);\n\n return { shares, nodeIndexes: allNodeIndexes };\n};\n\n/**\n * Formats a share value into a 32-byte buffer with padding and base64 encoding\n *\n * @param shareValue - BN share value to format\n * @returns Base64 string of padded share\n */\nconst formatShareForSigning = (shareValue: BN): string => {\n // Convert to padded 32-byte buffer with value right-aligned\n const buffer = shareValue.toArrayLike(Buffer, 'be', 32);\n\n // Convert to base64\n return buffer.toString('base64');\n};\n\n/**\n * Creates an Ethereum format signature (r+s+v)\n *\n * @param dataHash - Hash to sign\n * @param privateKeyBigInt - Private key as bigint\n * @returns Signature as r+s+v hex string\n */\nexport const createEthereumSignature = (\n dataHash: Uint8Array,\n privateKeyBigInt: bigint,\n): string => {\n const privateKeyHex = privateKeyBigInt.toString(16).padStart(64, '0');\n const signResult = secp256k1Noble.sign(dataHash, privateKeyHex);\n\n const signature = signResult.toCompactHex();\n const recV = (signResult.recovery + 27).toString(16).padStart(2, '0');\n\n return signature + recV;\n};\n\n/**\n * Creates a signature for key change using the share and old private key\n *\n * @param shareValue - Raw share value to sign\n * @param keyShareIndex - Key index for the share\n * @param nodeIndex - Node index\n * @param oldAuthPrivKey - Old auth private key for signing\n * @returns The signature and timestamp as KeyChangeProof\n */\nexport const createKeyChangeProof = (\n shareValue: BN,\n keyShareIndex: number,\n nodeIndex: number,\n oldAuthPrivKey: bigint,\n): KeyChangeProof => {\n const timestamp = Math.floor(Date.now() / 1000);\n const shareBase64 = formatShareForSigning(shareValue);\n\n const dataToSign = toSnakeCaseKeys({\n shareData: shareBase64,\n keyShareIndex,\n nodeIndex,\n timestamp,\n });\n\n const jsonData = JSON.stringify(dataToSign);\n const dataHash = keccak256(jsonData);\n const signature = createEthereumSignature(dataHash, oldAuthPrivKey);\n\n return {\n oldKeySignature: signature,\n signatureTimestamp: timestamp,\n };\n};\n\n/**\n * Generate standard share import items without key change proof\n *\n * @param shares - The raw shares generated for each node\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param authTokens - Auth tokens for each node\n * @param keyShareIndex - Key index for the shares\n * @returns Share import items for standard flow\n */\nexport const createNewUserShareImportItems = async (\n shares: ShareMap,\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n keyShareIndex: number,\n): Promise<ShareImportItem[]> => {\n return Promise.all(\n authTokens.map(async (tokenData) => {\n const { nodePubKey, nodeIndex, authToken } = tokenData;\n\n // Get the raw share for this node\n const keyShare = new BN(nodeIndex).toString('hex', 64);\n const share = shares[keyShare];\n const shareJson = share.toJSON() as Record<string, string>;\n\n // Encrypt the share\n const encryptedShare = await encryptData(\n Buffer.from(shareJson.share, 'hex'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Encrypt the auth token\n const encryptedAuthToken = await encryptData(\n Buffer.from(authToken, 'base64'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Return the standard share import item\n return {\n encryptedShare: JSON.stringify(encryptedShare),\n encryptedAuthToken: JSON.stringify(encryptedAuthToken),\n keyShareIndex,\n nodeIndex,\n sssEndpoint: nodeEndpointsMap[nodeIndex],\n };\n }),\n );\n};\n\n/**\n * Generate key change share import items with proofs\n *\n * @param shares - The raw shares generated for each node\n * @param nodeEndpointsMap - Map of node indexes to endpoints\n * @param authTokens - Auth tokens for each node\n * @param keyShareIndex - Key index for the shares\n * @param oldAuthPrivKey - Old private key for signing\n * @returns Share import items for key change flow\n */\nexport const createKeyChangeShareImportItems = async (\n shares: ShareMap,\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n keyShareIndex: number,\n oldAuthPrivKey: bigint,\n): Promise<ShareImportItem<'keyChange'>[]> => {\n return Promise.all(\n authTokens.map(async (tokenData) => {\n const { nodePubKey, nodeIndex, authToken } = tokenData;\n\n // Get the raw share for this node\n const keyShare = new BN(nodeIndex).toString('hex', 64);\n const share = shares[keyShare];\n const shareJson = share.toJSON() as Record<string, string>;\n\n // Create key change proof\n const shareValue = new BN(shareJson.share, 16);\n const keyChangeProof = createKeyChangeProof(\n shareValue,\n keyShareIndex,\n nodeIndex,\n oldAuthPrivKey,\n );\n\n // Encrypt the share\n const encryptedShare = await encryptData(\n Buffer.from(shareJson.share, 'hex'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Encrypt the auth token\n const encryptedAuthToken = await encryptData(\n Buffer.from(authToken, 'base64'),\n Buffer.from(nodePubKey, 'hex'),\n );\n\n // Return the key change share import item\n return {\n encryptedShare: JSON.stringify(encryptedShare),\n encryptedAuthToken: JSON.stringify(encryptedAuthToken),\n keyShareIndex,\n nodeIndex,\n sssEndpoint: nodeEndpointsMap[nodeIndex],\n ...keyChangeProof,\n };\n }),\n );\n};\n\n/**\n * Generates encrypted share import items for each node\n *\n * @param nodeEndpointsMap - Map of node indexes to endpoints.\n * @param authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param privKey - The private key to be used for the share import items.\n * @param keyShareIndex - The key share index to be used for the share import items.\n * @param args - Additional arguments based on ShareType.\n * When ShareType is 'keyChange', this must include the old auth private key for signing.\n *\n * @returns The share import items containing the encrypted shares. Will be type\n * ShareImportItem<'standard'> when using standard flow or\n * ShareImportItem<'keyChange'> when using key change flow.\n */\nexport const generateShareImportItems = async <\n ShareType extends 'standard' | 'keyChange' = 'standard',\n>(\n nodeEndpointsMap: Record<number, string>,\n authTokens: NodeAuthTokens,\n privKey: bigint,\n keyShareIndex: number,\n ...args: ShareType extends 'keyChange' ? [oldAuthPrivKey: bigint] : []\n): Promise<ShareImportItem<ShareType>[]> => {\n // First prepare the shares for all nodes\n const { shares } = prepareNodeShares(nodeEndpointsMap, privKey);\n\n const oldAuthPrivKey = args[0];\n\n // Generate appropriate share import items based on whether it's a key change\n if (oldAuthPrivKey !== undefined) {\n return createKeyChangeShareImportItems(\n shares,\n nodeEndpointsMap,\n authTokens,\n keyShareIndex,\n oldAuthPrivKey,\n ) as unknown as ShareImportItem<ShareType>[];\n }\n\n return createNewUserShareImportItems(\n shares,\n nodeEndpointsMap,\n authTokens,\n keyShareIndex,\n ) as unknown as ShareImportItem<ShareType>[];\n};\n\n/**\n * Creates a map of node indexes to endpoints\n *\n * @param nodeEndpoints - The endpoints of the nodes.\n * @param nodeIndexes - The indexes of the nodes.\n *\n * @returns A map of node indexes to endpoints.\n */\nexport const createNodeEndpointsMap = (\n nodeEndpoints: string[],\n nodeIndexes: number[],\n): Record<number, string> => {\n return nodeIndexes.reduce<Record<number, string>>((acc, index) => {\n acc[index] = nodeEndpoints[index - 1];\n return acc;\n }, {});\n};\n\n/**\n * Compares two rate limit errors and returns the one with the longest remaining time.\n *\n * @param error1 - The first rate limit error\n * @param error2 - The second rate limit error\n * @returns The rate limit error with the longest remaining time\n */\nexport function getMaxRateLimitError(\n error1: RateLimitErrorData,\n error2: RateLimitErrorData,\n): RateLimitErrorData {\n if (error1.remainingTime > error2.remainingTime) {\n return error1;\n }\n return error2;\n}\n\n/**\n * Extracts rate limit details from a toprf eval result\n *\n * @param results - TOPRF Eval results\n * @returns Rate limit details if found, undefined otherwise\n */\nexport function extractRateLimitErrorFromResults(\n results: ToprfEvalJRPCResponse[],\n): RateLimitErrorData | undefined {\n let maxRateLimit: RateLimitErrorData | undefined;\n for (const result of results) {\n if (\n result.result?.lockTimeSeconds &&\n result.result.lockTimeSeconds > 0 &&\n result.result.guessCount\n ) {\n const rateLimitError = {\n remainingTime: result.result.lockTimeSeconds,\n message: 'Rate limit exceeded',\n lockTime: result.result.lockTimeSeconds,\n guessCount: result.result.guessCount,\n };\n\n if (maxRateLimit) {\n maxRateLimit = getMaxRateLimitError(maxRateLimit, rateLimitError);\n } else {\n maxRateLimit = rateLimitError;\n }\n }\n }\n\n return maxRateLimit;\n}\n\n/**\n * Extracts rate limit details from a JSON-RPC error response if it's a rate limit error.\n *\n * @param error - The error object from a JSON-RPC response\n * @returns Rate limit details if found, undefined otherwise\n */\nfunction extractRateLimitDetails(\n error: unknown,\n): RateLimitErrorData | undefined {\n if (\n !isJSONRPCError(error) ||\n error.code !== -32602 ||\n error.message !== 'Rate limit exceeded' ||\n !error.data\n ) {\n return undefined;\n }\n\n const data = toCamelCaseKeys(error.data as JSONValue) as Record<\n string,\n unknown\n >;\n\n if (\n typeof data?.message !== 'string' ||\n typeof data?.remainingTime !== 'number' ||\n typeof data?.lockTime !== 'number' ||\n typeof data?.guessCount !== 'number'\n ) {\n return undefined;\n }\n\n return {\n message: data.message,\n remainingTime: data.remainingTime,\n lockTime: data.lockTime,\n guessCount: data.guessCount,\n };\n}\n\n/**\n * Checks responses for rate limit errors and returns details if found.\n * Examines all responses and returns the rate limit with the longest remaining time.\n *\n * @param resultArr - The result array to check for rate limit errors.\n * @returns Rate limit details if found, undefined otherwise.\n */\nexport function checkRateLimitErrors<Type>(\n resultArr: Type[],\n): RateLimitErrorData | undefined {\n const errorResponses = filterErrorResponses(resultArr);\n let maxRateLimit: RateLimitErrorData | undefined;\n\n for (const res of errorResponses) {\n const rateLimitDetails = extractRateLimitDetails(res.error);\n\n if (!rateLimitDetails) {\n continue;\n }\n\n if (maxRateLimit) {\n maxRateLimit = getMaxRateLimitError(maxRateLimit, rateLimitDetails);\n } else {\n maxRateLimit = rateLimitDetails;\n }\n }\n\n return maxRateLimit;\n}\n\n/**\n * Checks responses for auth token errors (expired or invalid).\n *\n * @param resultArr - The result array to check for auth token errors.\n * @returns The parsed error if auth token error is found, undefined otherwise.\n */\nexport function checkAuthTokenErrors<Type>(\n resultArr: Type[],\n): ITOPRFError | undefined {\n const errorResponses = filterErrorResponses(resultArr);\n\n for (const res of errorResponses) {\n if (isJSONRPCError(res.error)) {\n const parsedError = parseJsonRpcError(res.error);\n if (\n parsedError.code === TOPRFErrorCode.AuthTokenExpired ||\n parsedError.code === TOPRFErrorCode.InvalidAuthToken\n ) {\n return parsedError;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Merges the auth tokens with the endpoints.\n *\n * @param authTokens - The auth tokens issued by the nodes on authenticating the user.\n * @param nodeEndpointsMap - Map of node index to endpoint to be used for the get pub key request.\n *\n * @returns The merged auth tokens and endpoints.\n *\n * @throws If the endpoint is not found for a node index.\n */\nexport function mergeEndpointsWithAuthTokens(\n authTokens: NodeAuthTokens,\n nodeEndpointsMap: Record<number, string>,\n): { endpoint: string; authToken: NodeAuthToken }[] {\n return authTokens.map((authToken) => {\n const endpoint = nodeEndpointsMap[authToken.nodeIndex];\n if (!endpoint) {\n throw TOPRFError.endpointNotFound(\n `Endpoint not found for node index ${authToken.nodeIndex}`,\n );\n }\n return {\n endpoint,\n authToken,\n };\n });\n}\n\n/**\n * Parses a JSON-RPC error and returns TOPRFError instance.\n *\n * @param rpcError - The error object from a JSON-RPC response\n * @returns TOPRFError instance\n */\nexport function parseJsonRpcError(rpcError: JSONRPCError): ITOPRFError {\n if (rpcError.code === JsonRpcErrorCodes.ErrorCodeInvalidParams) {\n // Check for expired auth token first since it's a specific case of auth token error\n if (rpcError.message.toLowerCase().includes('auth token expired')) {\n return TOPRFError.authTokenExpired();\n }\n\n // Check for general auth token validation failures\n if (rpcError.message.toLowerCase().includes('invalid auth token')) {\n return TOPRFError.invalidAuthToken();\n }\n\n let errorDescription = rpcError.message;\n if (typeof rpcError.data === 'string') {\n errorDescription = rpcError.data;\n } else if (rpcError.data) {\n const data = toCamelCaseKeys(rpcError.data as JSONValue) as Record<\n string,\n unknown\n >;\n errorDescription = JSON.stringify(data);\n }\n\n return TOPRFError.jsonRpcError(errorDescription);\n } else if (rpcError.code === JsonRpcErrorCodes.ErrorCodeInternal) {\n const errorDescription = rpcError.data ?? rpcError.message;\n return TOPRFError.jsonRpcError(errorDescription as string);\n }\n\n return TOPRFError.default(rpcError.message);\n}\n\n/**\n * Parses a SomeError and returns the predicate error if it exists.\n *\n * @param error - The error object to parse\n * @returns The predicate error if it exists, otherwise the original error\n */\nexport function getTOPRFError(error: Error): Error {\n if (\n error instanceof SomeError &&\n error.predicate &&\n error.predicate instanceof TOPRFError\n ) {\n return error.predicate;\n }\n\n return error;\n}\n\n/**\n * Preserves the key order of the object\n *\n * @param _a - The first object\n * @param _a.key - The key of the first object\n * @param _a.value - The value of the first object\n * @param _b - The second object\n * @param _b.key - The key of the second object\n * @param _b.value - The value of the second object\n * @returns 0\n */\nexport function preserveKeyOrder(\n _a: { key: string; value: unknown },\n _b: { key: string; value: unknown },\n): number {\n return 0;\n}\n"]} |
+1
-1
| { | ||
| "name": "@metamask/toprf-secure-backup", | ||
| "version": "0.8.0", | ||
| "version": "0.9.0", | ||
| "description": "The MetaMask Node module template", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
927941
0.67%5516
0.91%