New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@toruslabs/torus.js

Package Overview
Dependencies
Maintainers
0
Versions
138
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@toruslabs/torus.js - npm Package Compare versions

Comparing version 15.0.0-alpha.1 to 15.0.0

dist/types/TorusUtilsExtraParams.d.ts

13

dist/lib.cjs/helpers/common.js

@@ -6,5 +6,12 @@ 'use strict';

var elliptic = require('elliptic');
var keccak = require('ethereum-cryptography/keccak');
var stringify = require('json-stable-stringify');
var keyUtils = require('./keyUtils.js');
function keccak256(a) {
const hash = Buffer.from(keccak.keccak256(a)).toString("hex");
return `0x${hash}`;
}
const generatePrivateKey = (ecCurve, buf) => {
return ecCurve.genKeyPair().getPrivate().toArrayLike(buf);
};
const getKeyCurve = keyType => {

@@ -92,3 +99,3 @@ if (keyType === constants.KEY_TYPE.ED25519) {

const verifierIdStr = `${verifier}${verifierId}`;
const hashedVerifierId = keyUtils.keccak256(Buffer.from(verifierIdStr, "utf8")).slice(2);
const hashedVerifierId = keccak256(Buffer.from(verifierIdStr, "utf8")).slice(2);
const proxyEndpointNum = new BN.BN(hashedVerifierId, "hex").mod(new BN.BN(endpoints.length)).toNumber();

@@ -168,5 +175,7 @@ return proxyEndpointNum;

exports.encParamsHexToBuf = encParamsHexToBuf;
exports.generatePrivateKey = generatePrivateKey;
exports.getKeyCurve = getKeyCurve;
exports.getProxyCoordinatorEndpointIndex = getProxyCoordinatorEndpointIndex;
exports.kCombinations = kCombinations;
exports.keccak256 = keccak256;
exports.normalizeKeysResult = normalizeKeysResult;

@@ -173,0 +182,0 @@ exports.retryCommitment = retryCommitment;

67

dist/lib.cjs/helpers/keyUtils.js

@@ -16,9 +16,2 @@ 'use strict';

function keccak256(a) {
const hash = Buffer.from(keccak.keccak256(a)).toString("hex");
return `0x${hash}`;
}
const generatePrivateKey = (ecCurve, buf) => {
return ecCurve.genKeyPair().getPrivate().toArrayLike(buf);
};
function stripHexPrefix(str) {

@@ -76,17 +69,2 @@ return str.startsWith("0x") ? str.slice(2) : str;

}
const getSecpKeyFromEd25519 = ed25519Scalar => {
const secp256k1Curve = common.getKeyCurve(constants.KEY_TYPE.SECP256K1);
const ed25519Key = ed25519Scalar.toString("hex", 64);
const keyHash = keccak.keccak256(Buffer.from(ed25519Key, "hex"));
const secpKey = new BN(keyHash).umod(secp256k1Curve.curve.n).toString("hex", 64);
const bufferKey = Buffer.from(secpKey, "hex");
const secpKeyPair = secp256k1Curve.keyFromPrivate(bufferKey);
if (bufferKey.length < 32) {
throw new Error("Invalid key length, please try again");
}
return {
scalar: secpKeyPair.getPrivate(),
point: secpKeyPair.getPublic()
};
};
function encodeEd25519Point(point) {

@@ -102,3 +80,3 @@ const ed25519Curve = common.getKeyCurve(constants.KEY_TYPE.ED25519);

const finalEd25519Key = getEd25519ExtendedPublicKey(ed25519Seed);
const encryptionKey = getSecpKeyFromEd25519(finalEd25519Key.scalar);
const encryptionKey = metadataUtils.getSecpKeyFromEd25519(finalEd25519Key.scalar);
const encryptedSeed = await eccrypto.encrypt(Buffer.from(encryptionKey.point.encodeCompressed("hex"), "hex"), ed25519Seed);

@@ -114,3 +92,3 @@ const encData = {

const oauthKeyPair = ed25519Curve.keyFromPrivate(oauthKey.toArrayLike(Buffer));
const metadataSigningKey = getSecpKeyFromEd25519(oauthKeyPair.getPrivate());
const metadataSigningKey = metadataUtils.getSecpKeyFromEd25519(oauthKeyPair.getPrivate());
return {

@@ -131,7 +109,7 @@ oAuthKeyScalar: oauthKeyPair.getPrivate(),

const scalar = new BN(scalarBuffer);
const randomNonce = new BN(generatePrivateKey(secp256k1Curve, Buffer));
const oAuthKey = scalar.sub(randomNonce).umod(secp256k1Curve.curve.n);
const oAuthKeyPair = secp256k1Curve.keyFromPrivate(oAuthKey.toString("hex").padStart(64, "0"));
const randomNonce = new BN(common.generatePrivateKey(secp256k1Curve, Buffer));
const oAuthKey = scalar.sub(randomNonce).umod(secp256k1Curve.n);
const oAuthKeyPair = secp256k1Curve.keyFromPrivate(oAuthKey.toArrayLike(Buffer));
const oAuthPubKey = oAuthKeyPair.getPublic();
const finalUserKeyPair = secp256k1Curve.keyFromPrivate(scalar.toString("hex", 64));
const finalUserKeyPair = secp256k1Curve.keyFromPrivate(scalar.toString("hex", 64), "hex");
return {

@@ -149,8 +127,6 @@ oAuthKeyScalar: oAuthKeyPair.getPrivate(),

};
function generateAddressFromPrivKey(keyType, privateKey) {
const ecCurve = common.getKeyCurve(keyType);
const key = ecCurve.keyFromPrivate(privateKey.toString("hex", 64), "hex");
function generateAddressFromEcKey(keyType, key) {
if (keyType === constants.KEY_TYPE.SECP256K1) {
const publicKey = key.getPublic().encode("hex", false).slice(2);
const evmAddressLower = `0x${keccak256(Buffer.from(publicKey, "hex")).slice(64 - 38)}`;
const evmAddressLower = `0x${common.keccak256(Buffer.from(publicKey, "hex")).slice(64 - 38)}`;
return toChecksumAddress(evmAddressLower);

@@ -164,2 +140,7 @@ } else if (keyType === constants.KEY_TYPE.ED25519) {

}
function generateAddressFromPrivKey(keyType, privateKey) {
const ecCurve = common.getKeyCurve(keyType);
const key = ecCurve.keyFromPrivate(privateKey.toString("hex", 64), "hex");
return generateAddressFromEcKey(keyType, key);
}
function generateAddressFromPubKey(keyType, publicKeyX, publicKeyY) {

@@ -171,12 +152,3 @@ const ecCurve = common.getKeyCurve(keyType);

});
if (keyType === constants.KEY_TYPE.SECP256K1) {
const publicKey = key.getPublic().encode("hex", false).slice(2);
const evmAddressLower = `0x${keccak256(Buffer.from(publicKey, "hex")).slice(64 - 38)}`;
return toChecksumAddress(evmAddressLower);
} else if (keyType === constants.KEY_TYPE.ED25519) {
const publicKey = encodeEd25519Point(key.getPublic());
const address = base58.encode(publicKey);
return address;
}
throw new Error(`Invalid keyType: ${keyType}`);
return generateAddressFromEcKey(keyType, key);
}

@@ -186,7 +158,7 @@ function getPostboxKeyFrom1OutOf1(ecCurve, privKey, nonce) {

const nonceBN = new BN(nonce, 16);
return privKeyBN.sub(nonceBN).umod(ecCurve.curve.n).toString("hex");
return privKeyBN.sub(nonceBN).umod(ecCurve.n).toString("hex");
}
function derivePubKey(ecCurve, sk) {
const skHex = sk.toString(16, 64);
return ecCurve.keyFromPrivate(skHex).getPublic();
return ecCurve.keyFromPrivate(skHex, "hex").getPublic();
}

@@ -210,3 +182,3 @@ const getEncryptionEC = () => {

}
const oAuthPubKey = ecCurve.keyFromPrivate(oAuthKey.toString("hex").padStart(64, "0")).getPublic();
const oAuthPubKey = ecCurve.keyFromPrivate(oAuthKey.toString("hex", 64), "hex").getPublic();
const poly = langrangeInterpolatePoly.generateRandomPolynomial(ecCurve, degree, oAuthKey);

@@ -230,3 +202,3 @@ const shares = poly.generateShares(nodeIndexesBn);

const encShares = await Promise.all(encPromises);
for (let i = 0; i < nodeIndexesBn.length; i++) {
for (let i = 0; i < nodeIndexesBn.length; i += 1) {
const shareJson = shares[nodeIndexesBn[i].toString("hex", 64)].toJSON();

@@ -259,3 +231,2 @@ const encParams = encShares[i];

exports.generateEd25519KeyData = generateEd25519KeyData;
exports.generatePrivateKey = generatePrivateKey;
exports.generateSecp256k1KeyData = generateSecp256k1KeyData;

@@ -266,5 +237,3 @@ exports.generateShares = generateShares;

exports.getPostboxKeyFrom1OutOf1 = getPostboxKeyFrom1OutOf1;
exports.getSecpKeyFromEd25519 = getSecpKeyFromEd25519;
exports.keccak256 = keccak256;
exports.stripHexPrefix = stripHexPrefix;
exports.toChecksumAddress = toChecksumAddress;

@@ -6,6 +6,6 @@ 'use strict';

var Polynomial = require('../Polynomial.js');
var keyUtils = require('./keyUtils.js');
var common = require('./common.js');
function generatePrivateExcludingIndexes(shareIndexes, ecCurve) {
const key = new BN(keyUtils.generatePrivateKey(ecCurve, Buffer));
const key = new BN(common.generatePrivateKey(ecCurve, Buffer));
if (shareIndexes.find(el => el.eq(key))) {

@@ -26,5 +26,5 @@ return generatePrivateExcludingIndexes(shareIndexes, ecCurve);

tmp = tmp.sub(innerPoints[j].x);
tmp = tmp.umod(ecCurve.curve.n);
tmp = tmp.umod(ecCurve.n);
result = result.mul(tmp);
result = result.umod(ecCurve.curve.n);
result = result.umod(ecCurve.n);
}

@@ -40,3 +40,3 @@ }

}
coefficients[0] = d.invm(ecCurve.curve.n);
coefficients[0] = d.invm(ecCurve.n);
for (let k = 0; k < innerPoints.length; k += 1) {

@@ -53,6 +53,6 @@ const newCoefficients = generateEmptyBNArray(innerPoints.length);

for (; j >= 0; j -= 1) {
newCoefficients[j + 1] = newCoefficients[j + 1].add(coefficients[j]).umod(ecCurve.curve.n);
newCoefficients[j + 1] = newCoefficients[j + 1].add(coefficients[j]).umod(ecCurve.n);
let tmp = new BN(innerPoints[k].x);
tmp = tmp.mul(coefficients[j]).umod(ecCurve.curve.n);
newCoefficients[j] = newCoefficients[j].sub(tmp).umod(ecCurve.curve.n);
tmp = tmp.mul(coefficients[j]).umod(ecCurve.n);
newCoefficients[j] = newCoefficients[j].sub(tmp).umod(ecCurve.n);
}

@@ -77,3 +77,3 @@ coefficients = newCoefficients;

tmp = tmp.mul(coefficients[k]);
polynomial[k] = polynomial[k].add(tmp).umod(ecCurve.curve.n);
polynomial[k] = polynomial[k].add(tmp).umod(ecCurve.n);
}

@@ -97,13 +97,13 @@ }

upper = upper.mul(nodeIndex[j].neg());
upper = upper.umod(ecCurve.curve.n);
upper = upper.umod(ecCurve.n);
let temp = nodeIndex[i].sub(nodeIndex[j]);
temp = temp.umod(ecCurve.curve.n);
lower = lower.mul(temp).umod(ecCurve.curve.n);
temp = temp.umod(ecCurve.n);
lower = lower.mul(temp).umod(ecCurve.n);
}
}
let delta = upper.mul(lower.invm(ecCurve.curve.n)).umod(ecCurve.curve.n);
delta = delta.mul(shares[i]).umod(ecCurve.curve.n);
let delta = upper.mul(lower.invm(ecCurve.n)).umod(ecCurve.n);
delta = delta.mul(shares[i]).umod(ecCurve.n);
secret = secret.add(delta);
}
return secret.umod(ecCurve.curve.n);
return secret.umod(ecCurve.n);
}

@@ -140,3 +140,3 @@

}
points[shareIndex.toString("hex", 64)] = new Point(shareIndex, new BN(keyUtils.generatePrivateKey(ecCurve, Buffer)), ecCurve);
points[shareIndex.toString("hex", 64)] = new Point(shareIndex, new BN(common.generatePrivateKey(ecCurve, Buffer)), ecCurve);
}

@@ -143,0 +143,0 @@ points["0"] = new Point(new BN(0), actualS, ecCurve);

@@ -8,2 +8,3 @@ 'use strict';

var BN = require('bn.js');
var keccak = require('ethereum-cryptography/keccak');
var stringify = require('json-stable-stringify');

@@ -13,4 +14,18 @@ var log = require('loglevel');

var common = require('./common.js');
var keyUtils = require('./keyUtils.js');
const getSecpKeyFromEd25519 = ed25519Scalar => {
const secp256k1Curve = common.getKeyCurve(constants.KEY_TYPE.SECP256K1);
const ed25519Key = ed25519Scalar.toString("hex", 64);
const keyHash = keccak.keccak256(Buffer.from(ed25519Key, "hex"));
const secpKey = new BN(keyHash).umod(secp256k1Curve.n).toString("hex", 64);
const bufferKey = Buffer.from(secpKey, "hex");
const secpKeyPair = secp256k1Curve.keyFromPrivate(bufferKey);
if (bufferKey.length < 32) {
throw new Error(`Key length must be less than 32. got ${bufferKey.length}`);
}
return {
scalar: secpKeyPair.getPrivate(),
point: secpKeyPair.getPublic()
};
};
function convertMetadataToNonce(params) {

@@ -37,2 +52,3 @@ if (!params || !params.message) {

} catch (error) {
// ciphertext can be any length. not just 64. depends on input. we have this for legacy reason
const ciphertextHexPadding = ciphertextHex.padStart(64, "0");

@@ -47,3 +63,3 @@ log.warn("Failed to decrypt padded share cipher", error);

function generateMetadataParams(ecCurve, serverTimeOffset, message, privateKey) {
const key = ecCurve.keyFromPrivate(privateKey.toString("hex", 64));
const key = ecCurve.keyFromPrivate(privateKey.toString("hex", 64), "hex");
const setData = {

@@ -53,3 +69,3 @@ data: message,

};
const sig = key.sign(keyUtils.keccak256(Buffer.from(stringify(setData), "utf8")).slice(2));
const sig = key.sign(common.keccak256(Buffer.from(stringify(setData), "utf8")).slice(2));
return {

@@ -80,3 +96,3 @@ pub_key_X: key.getPublic().getX().toString("hex"),

// metadata only uses secp for sig validation
const key = common.getKeyCurve(constants.KEY_TYPE.SECP256K1).keyFromPrivate(privateKey.toString("hex", 64));
const key = common.getKeyCurve(constants.KEY_TYPE.SECP256K1).keyFromPrivate(privateKey.toString("hex", 64), "hex");
const setData = {

@@ -94,3 +110,3 @@ operation,

}
const sig = key.sign(keyUtils.keccak256(Buffer.from(stringify(setData), "utf8")).slice(2));
const sig = key.sign(common.keccak256(Buffer.from(stringify(setData), "utf8")).slice(2));
return {

@@ -146,3 +162,3 @@ pub_key_X: key.getPublic().getX().toString("hex", 64),

set_data: {
operation: "getNonce"
operation
},

@@ -159,12 +175,9 @@ key_type: keyType

const decryptSeedData = async (seedBase64, finalUserKey) => {
const decryptionKey = keyUtils.getSecpKeyFromEd25519(finalUserKey);
const decryptionKey = getSecpKeyFromEd25519(finalUserKey);
const seedUtf8 = Buffer.from(seedBase64, "base64").toString("utf-8");
const seedJson = JSON.parse(seedUtf8);
const bufferMetadata = {
ephemPublicKey: Buffer.from(seedJson.metadata.ephemPublicKey, "hex"),
iv: Buffer.from(seedJson.metadata.iv, "hex"),
mac: Buffer.from(seedJson.metadata.mac, "hex"),
const bufferMetadata = _objectSpread(_objectSpread({}, common.encParamsHexToBuf(seedJson.metadata)), {}, {
mode: "AES256"
};
const bufferKey = Buffer.from(decryptionKey.scalar.toString("hex", 64), "hex");
});
const bufferKey = decryptionKey.scalar.toArrayLike(Buffer);
const decText = await eccrypto.decrypt(bufferKey, _objectSpread(_objectSpread({}, bufferMetadata), {}, {

@@ -188,3 +201,3 @@ ciphertext: Buffer.from(seedJson.enc_text, "hex")

if (privKey) {
const key = common.getKeyCurve(constants.KEY_TYPE.SECP256K1).keyFromPrivate(privKey.toString("hex", 64));
const key = common.getKeyCurve(constants.KEY_TYPE.SECP256K1).keyFromPrivate(privKey.toString("hex", 64), "hex");
const setData = {

@@ -194,3 +207,3 @@ operation: "getOrSetNonce",

};
const sig = key.sign(keyUtils.keccak256(Buffer.from(stringify(setData), "utf8")).slice(2));
const sig = key.sign(common.keccak256(Buffer.from(stringify(setData), "utf8")).slice(2));
data = _objectSpread(_objectSpread({}, data), {}, {

@@ -217,1 +230,2 @@ set_data: setData,

exports.getOrSetSapphireMetadataNonce = getOrSetSapphireMetadataNonce;
exports.getSecpKeyFromEd25519 = getSecpKeyFromEd25519;

@@ -152,3 +152,5 @@ 'use strict';

let finalImportedShares = [];
if (newImportedShares.length > 0) {
const threeFourthsThreshold = ~~(endpoints.length * 3 / 4) + 1;
const halfThreshold = ~~(endpoints.length / 2) + 1;
if ((newImportedShares === null || newImportedShares === void 0 ? void 0 : newImportedShares.length) > 0) {
if (newImportedShares.length !== endpoints.length) {

@@ -159,7 +161,8 @@ throw new Error("Invalid imported shares length");

} else if (!useDkg) {
const bufferKey = keyType === constants$1.KEY_TYPE.SECP256K1 ? keyUtils.generatePrivateKey(ecCurve, Buffer) : await random.getRandomBytes(32);
// TODO: why use getrandombytes here?
const bufferKey = keyType === constants$1.KEY_TYPE.SECP256K1 ? common.generatePrivateKey(ecCurve, Buffer) : await random.getRandomBytes(32);
const generatedShares = await keyUtils.generateShares(ecCurve, keyType, serverTimeOffset, indexes, nodePubkeys, Buffer.from(bufferKey));
finalImportedShares = [...finalImportedShares, ...generatedShares];
}
const tokenCommitment = keyUtils.keccak256(Buffer.from(idToken, "utf8"));
const tokenCommitment = common.keccak256(Buffer.from(idToken, "utf8"));

@@ -218,3 +221,3 @@ // make commitment requests to endpoints

}
} else if (!overrideExistingKey && completedRequests.length >= ~~(endpoints.length * 3 / 4) + 1) {
} else if (!overrideExistingKey && completedRequests.length >= threeFourthsThreshold) {
const nodeSigs = [];

@@ -228,3 +231,3 @@ for (let i = 0; i < completedRequests.length; i += 1) {

}
const existingPubKey = common.thresholdSame(nodeSigs.map(x => x && x.pub_key_x), ~~(endpoints.length / 2) + 1);
const existingPubKey = common.thresholdSame(nodeSigs.map(x => x && x.pub_key_x), halfThreshold);
const proxyEndpointNum = common.getProxyCoordinatorEndpointIndex(endpoints, verifier, verifierParams.verifier_id);

@@ -250,3 +253,3 @@ // for import shares, proxy node response is required.

}
} else if (completedRequests.length >= ~~(endpoints.length * 3 / 4) + 1) {
} else if (completedRequests.length >= threeFourthsThreshold) {
// this case is for dkg keys

@@ -276,3 +279,3 @@ const requiredNodeResult = completedRequests.find(resp => {

// if user's account already
const existingPubKey = common.thresholdSame(nodeSigs.map(x => x && x.pub_key_x), ~~(endpoints.length / 2) + 1);
const existingPubKey = common.thresholdSame(nodeSigs.map(x => x && x.pub_key_x), halfThreshold);

@@ -376,3 +379,3 @@ // can only import shares if override existing key is allowed or for new non dkg registration

});
const thresholdPublicKey = common.thresholdSame(pubkeys, ~~(endpoints.length / 2) + 1);
const thresholdPublicKey = common.thresholdSame(pubkeys, halfThreshold);
if (!thresholdPublicKey) {

@@ -392,3 +395,3 @@ throw new Error("invalid result from nodes, threshold number of public key results are not matching");

});
const thresholdReqCount = canImportedShares ? endpoints.length : ~~(endpoints.length / 2) + 1;
const thresholdReqCount = canImportedShares ? endpoints.length : halfThreshold;
// optimistically run lagrange interpolation once threshold number of shares have been received

@@ -461,5 +464,4 @@ // this is matched against the user public key to ensure that shares are consistent

});
const minThresholdRequired = ~~(endpoints.length / 2) + 1;
if (!verifierParams.extended_verifier_id && validSigs.length < minThresholdRequired) {
throw new Error(`Insufficient number of signatures from nodes, required: ${minThresholdRequired}, found: ${validSigs.length}`);
if (!verifierParams.extended_verifier_id && validSigs.length < halfThreshold) {
throw new Error(`Insufficient number of signatures from nodes, required: ${halfThreshold}, found: ${validSigs.length}`);
}

@@ -472,4 +474,4 @@ const validTokens = sessionTokensResolved.filter(token => {

});
if (!verifierParams.extended_verifier_id && validTokens.length < minThresholdRequired) {
throw new Error(`Insufficient number of session tokens from nodes, required: ${minThresholdRequired}, found: ${validTokens.length}`);
if (!verifierParams.extended_verifier_id && validTokens.length < halfThreshold) {
throw new Error(`Insufficient number of session tokens from nodes, required: ${halfThreshold}, found: ${validTokens.length}`);
}

@@ -495,3 +497,3 @@ sessionTokensResolved.forEach((x, index) => {

// run lagrange interpolation on all subsets, faster in the optimistic scenario than berlekamp-welch due to early exit
const allCombis = common.kCombinations(decryptedShares.length, ~~(endpoints.length / 2) + 1);
const allCombis = common.kCombinations(decryptedShares.length, halfThreshold);
let privateKey = null;

@@ -516,3 +518,3 @@ for (let j = 0; j < allCombis.length; j += 1) {

}
const thresholdIsNewKey = common.thresholdSame(isNewKeyResponses, ~~(endpoints.length / 2) + 1);
const thresholdIsNewKey = common.thresholdSame(isNewKeyResponses, halfThreshold);

@@ -603,3 +605,3 @@ // Convert each string timestamp to a number

});
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.curve.n);
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.n);
finalPubKey = ecCurve.keyFromPrivate(privateKeyWithNonce.toString(16, 64), "hex").getPublic();

@@ -614,3 +616,3 @@ }

});
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.curve.n);
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.n);
finalPubKey = ecCurve.keyFromPrivate(privateKeyWithNonce.toString(16, 64), "hex").getPublic();

@@ -648,3 +650,3 @@ }

if (typeOfUser === "v1" || typeOfUser === "v2" && metadataNonce.gt(new BN(0))) {
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.curve.n);
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.n);
keyWithNonce = privateKeyWithNonce.toString("hex", 64);

@@ -672,3 +674,3 @@ }

point
} = keyUtils.getSecpKeyFromEd25519(privateKey);
} = metadataUtils.getSecpKeyFromEd25519(privateKey);
postboxKey = scalar;

@@ -675,0 +677,0 @@ postboxPubX = point.getX().toString(16, 64);

@@ -27,5 +27,7 @@ 'use strict';

exports.encParamsHexToBuf = common.encParamsHexToBuf;
exports.generatePrivateKey = common.generatePrivateKey;
exports.getKeyCurve = common.getKeyCurve;
exports.getProxyCoordinatorEndpointIndex = common.getProxyCoordinatorEndpointIndex;
exports.kCombinations = common.kCombinations;
exports.keccak256 = common.keccak256;
exports.normalizeKeysResult = common.normalizeKeysResult;

@@ -41,3 +43,2 @@ exports.retryCommitment = common.retryCommitment;

exports.generateEd25519KeyData = keyUtils.generateEd25519KeyData;
exports.generatePrivateKey = keyUtils.generatePrivateKey;
exports.generateSecp256k1KeyData = keyUtils.generateSecp256k1KeyData;

@@ -48,4 +49,2 @@ exports.generateShares = keyUtils.generateShares;

exports.getPostboxKeyFrom1OutOf1 = keyUtils.getPostboxKeyFrom1OutOf1;
exports.getSecpKeyFromEd25519 = keyUtils.getSecpKeyFromEd25519;
exports.keccak256 = keyUtils.keccak256;
exports.stripHexPrefix = keyUtils.stripHexPrefix;

@@ -66,3 +65,4 @@ exports.toChecksumAddress = keyUtils.toChecksumAddress;

exports.getOrSetSapphireMetadataNonce = metadataUtils.getOrSetSapphireMetadataNonce;
exports.getSecpKeyFromEd25519 = metadataUtils.getSecpKeyFromEd25519;
exports.GetPubKeyOrKeyAssign = nodeUtils.GetPubKeyOrKeyAssign;
exports.retrieveOrImportShare = nodeUtils.retrieveOrImportShare;

@@ -25,5 +25,5 @@ 'use strict';

sum = sum.add(tmp);
sum = sum.umod(this.ecCurve.curve.n);
sum = sum.umod(this.ecCurve.n);
xi = xi.mul(new BN(tmpX));
xi = xi.umod(this.ecCurve.curve.n);
xi = xi.umod(this.ecCurve.n);
}

@@ -30,0 +30,0 @@ return sum;

'use strict';
var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
var _defineProperty = require('@babel/runtime/helpers/defineProperty');

@@ -75,3 +74,13 @@ var constants = require('@toruslabs/constants');

}
async retrieveShares(endpoints, indexes, verifier, verifierParams, idToken, nodePubkeys, extraParams = {}, useDkg) {
async retrieveShares(params) {
const {
verifier,
verifierParams,
idToken,
nodePubkeys,
indexes,
endpoints,
useDkg,
extraParams = {}
} = params;
if (nodePubkeys.length === 0) {

@@ -99,2 +108,5 @@ throw new Error("nodePubkeys param is required");

}
if (!extraParams.session_token_exp_second) {
extraParams.session_token_exp_second = Torus.sessionTime;
}
return nodeUtils.retrieveOrImportShare({

@@ -118,5 +130,3 @@ legacyMetadataHost: this.legacyMetadataHost,

nodePubkeys,
extraParams: _objectSpread(_objectSpread({}, extraParams), {}, {
session_token_exp_second: Torus.sessionTime
})
extraParams
});

@@ -140,6 +150,19 @@ }

}
async importPrivateKey(endpoints, nodeIndexes, nodePubkeys, verifier, verifierParams, idToken, newPrivateKey, extraParams = {}) {
async importPrivateKey(params) {
const {
nodeIndexes,
newPrivateKey,
verifier,
verifierParams,
idToken,
nodePubkeys,
endpoints,
extraParams = {}
} = params;
if (endpoints.length !== nodeIndexes.length) {
throw new Error(`length of endpoints array must be same as length of nodeIndexes array`);
}
if (!extraParams.session_token_exp_second) {
extraParams.session_token_exp_second = Torus.sessionTime;
}
let privKeyBuffer;

@@ -153,3 +176,3 @@ if (this.keyType === constants.KEY_TYPE.SECP256K1) {

if (this.keyType === constants.KEY_TYPE.ED25519) {
privKeyBuffer = Buffer.from(newPrivateKey, "hex");
privKeyBuffer = Buffer.from(newPrivateKey.padStart(64, "0"), "hex");
if (privKeyBuffer.length !== 32) {

@@ -188,5 +211,3 @@ throw new Error("Invalid private key length for given ed25519 key");

nodePubkeys,
extraParams: _objectSpread(_objectSpread({}, extraParams), {}, {
session_token_exp_second: Torus.sessionTime
})
extraParams
});

@@ -193,0 +214,0 @@ }

import { KEY_TYPE } from '@toruslabs/constants';
import { BN } from 'bn.js';
import { ec } from 'elliptic';
import { keccak256 as keccak256$1 } from 'ethereum-cryptography/keccak';
import stringify from 'json-stable-stringify';
import { keccak256 } from './keyUtils.js';
function keccak256(a) {
const hash = Buffer.from(keccak256$1(a)).toString("hex");
return `0x${hash}`;
}
const generatePrivateKey = (ecCurve, buf) => {
return ecCurve.genKeyPair().getPrivate().toArrayLike(buf);
};
const getKeyCurve = keyType => {

@@ -161,2 +168,2 @@ if (keyType === KEY_TYPE.ED25519) {

export { calculateMedian, encParamsBufToHex, encParamsHexToBuf, getKeyCurve, getProxyCoordinatorEndpointIndex, kCombinations, normalizeKeysResult, retryCommitment, thresholdSame, waitFor };
export { calculateMedian, encParamsBufToHex, encParamsHexToBuf, generatePrivateKey, getKeyCurve, getProxyCoordinatorEndpointIndex, kCombinations, keccak256, normalizeKeysResult, retryCommitment, thresholdSame, waitFor };

@@ -6,17 +6,10 @@ import { KEY_TYPE } from '@toruslabs/constants';

import { ec } from 'elliptic';
import { keccak256 as keccak256$1 } from 'ethereum-cryptography/keccak';
import { keccak256 } from 'ethereum-cryptography/keccak';
import { sha512 } from 'ethereum-cryptography/sha512';
import stringify from 'json-stable-stringify';
import log from 'loglevel';
import { getKeyCurve, encParamsBufToHex } from './common.js';
import { getKeyCurve, encParamsBufToHex, generatePrivateKey, keccak256 as keccak256$1 } from './common.js';
import { generateRandomPolynomial } from './langrangeInterpolatePoly.js';
import { generateNonceMetadataParams } from './metadataUtils.js';
import { getSecpKeyFromEd25519, generateNonceMetadataParams } from './metadataUtils.js';
function keccak256(a) {
const hash = Buffer.from(keccak256$1(a)).toString("hex");
return `0x${hash}`;
}
const generatePrivateKey = (ecCurve, buf) => {
return ecCurve.genKeyPair().getPrivate().toArrayLike(buf);
};
function stripHexPrefix(str) {

@@ -28,3 +21,3 @@ return str.startsWith("0x") ? str.slice(2) : str;

const buf = Buffer.from(address, "utf8");
const hash = Buffer.from(keccak256$1(buf)).toString("hex");
const hash = Buffer.from(keccak256(buf)).toString("hex");
let ret = "0x";

@@ -75,17 +68,2 @@ for (let i = 0; i < address.length; i++) {

}
const getSecpKeyFromEd25519 = ed25519Scalar => {
const secp256k1Curve = getKeyCurve(KEY_TYPE.SECP256K1);
const ed25519Key = ed25519Scalar.toString("hex", 64);
const keyHash = keccak256$1(Buffer.from(ed25519Key, "hex"));
const secpKey = new BN(keyHash).umod(secp256k1Curve.curve.n).toString("hex", 64);
const bufferKey = Buffer.from(secpKey, "hex");
const secpKeyPair = secp256k1Curve.keyFromPrivate(bufferKey);
if (bufferKey.length < 32) {
throw new Error("Invalid key length, please try again");
}
return {
scalar: secpKeyPair.getPrivate(),
point: secpKeyPair.getPublic()
};
};
function encodeEd25519Point(point) {

@@ -129,6 +107,6 @@ const ed25519Curve = getKeyCurve(KEY_TYPE.ED25519);

const randomNonce = new BN(generatePrivateKey(secp256k1Curve, Buffer));
const oAuthKey = scalar.sub(randomNonce).umod(secp256k1Curve.curve.n);
const oAuthKeyPair = secp256k1Curve.keyFromPrivate(oAuthKey.toString("hex").padStart(64, "0"));
const oAuthKey = scalar.sub(randomNonce).umod(secp256k1Curve.n);
const oAuthKeyPair = secp256k1Curve.keyFromPrivate(oAuthKey.toArrayLike(Buffer));
const oAuthPubKey = oAuthKeyPair.getPublic();
const finalUserKeyPair = secp256k1Curve.keyFromPrivate(scalar.toString("hex", 64));
const finalUserKeyPair = secp256k1Curve.keyFromPrivate(scalar.toString("hex", 64), "hex");
return {

@@ -146,8 +124,6 @@ oAuthKeyScalar: oAuthKeyPair.getPrivate(),

};
function generateAddressFromPrivKey(keyType, privateKey) {
const ecCurve = getKeyCurve(keyType);
const key = ecCurve.keyFromPrivate(privateKey.toString("hex", 64), "hex");
function generateAddressFromEcKey(keyType, key) {
if (keyType === KEY_TYPE.SECP256K1) {
const publicKey = key.getPublic().encode("hex", false).slice(2);
const evmAddressLower = `0x${keccak256(Buffer.from(publicKey, "hex")).slice(64 - 38)}`;
const evmAddressLower = `0x${keccak256$1(Buffer.from(publicKey, "hex")).slice(64 - 38)}`;
return toChecksumAddress(evmAddressLower);

@@ -161,2 +137,7 @@ } else if (keyType === KEY_TYPE.ED25519) {

}
function generateAddressFromPrivKey(keyType, privateKey) {
const ecCurve = getKeyCurve(keyType);
const key = ecCurve.keyFromPrivate(privateKey.toString("hex", 64), "hex");
return generateAddressFromEcKey(keyType, key);
}
function generateAddressFromPubKey(keyType, publicKeyX, publicKeyY) {

@@ -168,12 +149,3 @@ const ecCurve = getKeyCurve(keyType);

});
if (keyType === KEY_TYPE.SECP256K1) {
const publicKey = key.getPublic().encode("hex", false).slice(2);
const evmAddressLower = `0x${keccak256(Buffer.from(publicKey, "hex")).slice(64 - 38)}`;
return toChecksumAddress(evmAddressLower);
} else if (keyType === KEY_TYPE.ED25519) {
const publicKey = encodeEd25519Point(key.getPublic());
const address = base58.encode(publicKey);
return address;
}
throw new Error(`Invalid keyType: ${keyType}`);
return generateAddressFromEcKey(keyType, key);
}

@@ -183,7 +155,7 @@ function getPostboxKeyFrom1OutOf1(ecCurve, privKey, nonce) {

const nonceBN = new BN(nonce, 16);
return privKeyBN.sub(nonceBN).umod(ecCurve.curve.n).toString("hex");
return privKeyBN.sub(nonceBN).umod(ecCurve.n).toString("hex");
}
function derivePubKey(ecCurve, sk) {
const skHex = sk.toString(16, 64);
return ecCurve.keyFromPrivate(skHex).getPublic();
return ecCurve.keyFromPrivate(skHex, "hex").getPublic();
}

@@ -207,3 +179,3 @@ const getEncryptionEC = () => {

}
const oAuthPubKey = ecCurve.keyFromPrivate(oAuthKey.toString("hex").padStart(64, "0")).getPublic();
const oAuthPubKey = ecCurve.keyFromPrivate(oAuthKey.toString("hex", 64), "hex").getPublic();
const poly = generateRandomPolynomial(ecCurve, degree, oAuthKey);

@@ -227,3 +199,3 @@ const shares = poly.generateShares(nodeIndexesBn);

const encShares = await Promise.all(encPromises);
for (let i = 0; i < nodeIndexesBn.length; i++) {
for (let i = 0; i < nodeIndexesBn.length; i += 1) {
const shareJson = shares[nodeIndexesBn[i].toString("hex", 64)].toJSON();

@@ -251,2 +223,2 @@ const encParams = encShares[i];

export { derivePubKey, encodeEd25519Point, generateAddressFromPrivKey, generateAddressFromPubKey, generateEd25519KeyData, generatePrivateKey, generateSecp256k1KeyData, generateShares, getEd25519ExtendedPublicKey, getEncryptionEC, getPostboxKeyFrom1OutOf1, getSecpKeyFromEd25519, keccak256, stripHexPrefix, toChecksumAddress };
export { derivePubKey, encodeEd25519Point, generateAddressFromPrivKey, generateAddressFromPubKey, generateEd25519KeyData, generateSecp256k1KeyData, generateShares, getEd25519ExtendedPublicKey, getEncryptionEC, getPostboxKeyFrom1OutOf1, stripHexPrefix, toChecksumAddress };
import BN from 'bn.js';
import Point from '../Point.js';
import Polynomial from '../Polynomial.js';
import { generatePrivateKey } from './keyUtils.js';
import { generatePrivateKey } from './common.js';

@@ -23,5 +23,5 @@ function generatePrivateExcludingIndexes(shareIndexes, ecCurve) {

tmp = tmp.sub(innerPoints[j].x);
tmp = tmp.umod(ecCurve.curve.n);
tmp = tmp.umod(ecCurve.n);
result = result.mul(tmp);
result = result.umod(ecCurve.curve.n);
result = result.umod(ecCurve.n);
}

@@ -37,3 +37,3 @@ }

}
coefficients[0] = d.invm(ecCurve.curve.n);
coefficients[0] = d.invm(ecCurve.n);
for (let k = 0; k < innerPoints.length; k += 1) {

@@ -50,6 +50,6 @@ const newCoefficients = generateEmptyBNArray(innerPoints.length);

for (; j >= 0; j -= 1) {
newCoefficients[j + 1] = newCoefficients[j + 1].add(coefficients[j]).umod(ecCurve.curve.n);
newCoefficients[j + 1] = newCoefficients[j + 1].add(coefficients[j]).umod(ecCurve.n);
let tmp = new BN(innerPoints[k].x);
tmp = tmp.mul(coefficients[j]).umod(ecCurve.curve.n);
newCoefficients[j] = newCoefficients[j].sub(tmp).umod(ecCurve.curve.n);
tmp = tmp.mul(coefficients[j]).umod(ecCurve.n);
newCoefficients[j] = newCoefficients[j].sub(tmp).umod(ecCurve.n);
}

@@ -74,3 +74,3 @@ coefficients = newCoefficients;

tmp = tmp.mul(coefficients[k]);
polynomial[k] = polynomial[k].add(tmp).umod(ecCurve.curve.n);
polynomial[k] = polynomial[k].add(tmp).umod(ecCurve.n);
}

@@ -94,13 +94,13 @@ }

upper = upper.mul(nodeIndex[j].neg());
upper = upper.umod(ecCurve.curve.n);
upper = upper.umod(ecCurve.n);
let temp = nodeIndex[i].sub(nodeIndex[j]);
temp = temp.umod(ecCurve.curve.n);
lower = lower.mul(temp).umod(ecCurve.curve.n);
temp = temp.umod(ecCurve.n);
lower = lower.mul(temp).umod(ecCurve.n);
}
}
let delta = upper.mul(lower.invm(ecCurve.curve.n)).umod(ecCurve.curve.n);
delta = delta.mul(shares[i]).umod(ecCurve.curve.n);
let delta = upper.mul(lower.invm(ecCurve.n)).umod(ecCurve.n);
delta = delta.mul(shares[i]).umod(ecCurve.n);
secret = secret.add(delta);
}
return secret.umod(ecCurve.curve.n);
return secret.umod(ecCurve.n);
}

@@ -107,0 +107,0 @@

@@ -6,8 +6,23 @@ import _objectSpread from '@babel/runtime/helpers/objectSpread2';

import BN from 'bn.js';
import { keccak256 } from 'ethereum-cryptography/keccak';
import stringify from 'json-stable-stringify';
import log from 'loglevel';
import { SAPPHIRE_DEVNET_METADATA_URL, SAPPHIRE_METADATA_URL } from '../constants.js';
import { encParamsHexToBuf, getKeyCurve } from './common.js';
import { keccak256, getSecpKeyFromEd25519 } from './keyUtils.js';
import { getKeyCurve, encParamsHexToBuf, keccak256 as keccak256$1 } from './common.js';
const getSecpKeyFromEd25519 = ed25519Scalar => {
const secp256k1Curve = getKeyCurve(KEY_TYPE.SECP256K1);
const ed25519Key = ed25519Scalar.toString("hex", 64);
const keyHash = keccak256(Buffer.from(ed25519Key, "hex"));
const secpKey = new BN(keyHash).umod(secp256k1Curve.n).toString("hex", 64);
const bufferKey = Buffer.from(secpKey, "hex");
const secpKeyPair = secp256k1Curve.keyFromPrivate(bufferKey);
if (bufferKey.length < 32) {
throw new Error(`Key length must be less than 32. got ${bufferKey.length}`);
}
return {
scalar: secpKeyPair.getPrivate(),
point: secpKeyPair.getPublic()
};
};
function convertMetadataToNonce(params) {

@@ -34,2 +49,3 @@ if (!params || !params.message) {

} catch (error) {
// ciphertext can be any length. not just 64. depends on input. we have this for legacy reason
const ciphertextHexPadding = ciphertextHex.padStart(64, "0");

@@ -44,3 +60,3 @@ log.warn("Failed to decrypt padded share cipher", error);

function generateMetadataParams(ecCurve, serverTimeOffset, message, privateKey) {
const key = ecCurve.keyFromPrivate(privateKey.toString("hex", 64));
const key = ecCurve.keyFromPrivate(privateKey.toString("hex", 64), "hex");
const setData = {

@@ -50,3 +66,3 @@ data: message,

};
const sig = key.sign(keccak256(Buffer.from(stringify(setData), "utf8")).slice(2));
const sig = key.sign(keccak256$1(Buffer.from(stringify(setData), "utf8")).slice(2));
return {

@@ -77,3 +93,3 @@ pub_key_X: key.getPublic().getX().toString("hex"),

// metadata only uses secp for sig validation
const key = getKeyCurve(KEY_TYPE.SECP256K1).keyFromPrivate(privateKey.toString("hex", 64));
const key = getKeyCurve(KEY_TYPE.SECP256K1).keyFromPrivate(privateKey.toString("hex", 64), "hex");
const setData = {

@@ -91,3 +107,3 @@ operation,

}
const sig = key.sign(keccak256(Buffer.from(stringify(setData), "utf8")).slice(2));
const sig = key.sign(keccak256$1(Buffer.from(stringify(setData), "utf8")).slice(2));
return {

@@ -143,3 +159,3 @@ pub_key_X: key.getPublic().getX().toString("hex", 64),

set_data: {
operation: "getNonce"
operation
},

@@ -159,9 +175,6 @@ key_type: keyType

const seedJson = JSON.parse(seedUtf8);
const bufferMetadata = {
ephemPublicKey: Buffer.from(seedJson.metadata.ephemPublicKey, "hex"),
iv: Buffer.from(seedJson.metadata.iv, "hex"),
mac: Buffer.from(seedJson.metadata.mac, "hex"),
const bufferMetadata = _objectSpread(_objectSpread({}, encParamsHexToBuf(seedJson.metadata)), {}, {
mode: "AES256"
};
const bufferKey = Buffer.from(decryptionKey.scalar.toString("hex", 64), "hex");
});
const bufferKey = decryptionKey.scalar.toArrayLike(Buffer);
const decText = await decrypt(bufferKey, _objectSpread(_objectSpread({}, bufferMetadata), {}, {

@@ -185,3 +198,3 @@ ciphertext: Buffer.from(seedJson.enc_text, "hex")

if (privKey) {
const key = getKeyCurve(KEY_TYPE.SECP256K1).keyFromPrivate(privKey.toString("hex", 64));
const key = getKeyCurve(KEY_TYPE.SECP256K1).keyFromPrivate(privKey.toString("hex", 64), "hex");
const setData = {

@@ -191,3 +204,3 @@ operation: "getOrSetNonce",

};
const sig = key.sign(keccak256(Buffer.from(stringify(setData), "utf8")).slice(2));
const sig = key.sign(keccak256$1(Buffer.from(stringify(setData), "utf8")).slice(2));
data = _objectSpread(_objectSpread({}, data), {}, {

@@ -204,2 +217,2 @@ set_data: setData,

export { convertMetadataToNonce, decryptNodeData, decryptNodeDataWithPadding, decryptSeedData, generateMetadataParams, generateNonceMetadataParams, getMetadata, getNonce, getOrSetNonce, getOrSetSapphireMetadataNonce };
export { convertMetadataToNonce, decryptNodeData, decryptNodeDataWithPadding, decryptSeedData, generateMetadataParams, generateNonceMetadataParams, getMetadata, getNonce, getOrSetNonce, getOrSetSapphireMetadataNonce, getSecpKeyFromEd25519 };

@@ -11,6 +11,6 @@ import _objectSpread from '@babel/runtime/helpers/objectSpread2';

import { Some } from '../some.js';
import { retryCommitment, thresholdSame, getProxyCoordinatorEndpointIndex, normalizeKeysResult, calculateMedian, kCombinations } from './common.js';
import { generatePrivateKey, generateShares, keccak256, derivePubKey, generateAddressFromPrivKey, generateAddressFromPubKey, getSecpKeyFromEd25519 } from './keyUtils.js';
import { generatePrivateKey, keccak256, retryCommitment, thresholdSame, getProxyCoordinatorEndpointIndex, normalizeKeysResult, calculateMedian, kCombinations } from './common.js';
import { generateShares, derivePubKey, generateAddressFromPrivKey, generateAddressFromPubKey } from './keyUtils.js';
import { lagrangeInterpolation } from './langrangeInterpolatePoly.js';
import { getOrSetSapphireMetadataNonce, getOrSetNonce, getMetadata, decryptSeedData, decryptNodeData, decryptNodeDataWithPadding } from './metadataUtils.js';
import { getOrSetSapphireMetadataNonce, getOrSetNonce, getMetadata, decryptSeedData, getSecpKeyFromEd25519, decryptNodeData, decryptNodeDataWithPadding } from './metadataUtils.js';

@@ -151,3 +151,5 @@ const GetPubKeyOrKeyAssign = async params => {

let finalImportedShares = [];
if (newImportedShares.length > 0) {
const threeFourthsThreshold = ~~(endpoints.length * 3 / 4) + 1;
const halfThreshold = ~~(endpoints.length / 2) + 1;
if ((newImportedShares === null || newImportedShares === void 0 ? void 0 : newImportedShares.length) > 0) {
if (newImportedShares.length !== endpoints.length) {

@@ -158,2 +160,3 @@ throw new Error("Invalid imported shares length");

} else if (!useDkg) {
// TODO: why use getrandombytes here?
const bufferKey = keyType === KEY_TYPE.SECP256K1 ? generatePrivateKey(ecCurve, Buffer) : await getRandomBytes(32);

@@ -217,3 +220,3 @@ const generatedShares = await generateShares(ecCurve, keyType, serverTimeOffset, indexes, nodePubkeys, Buffer.from(bufferKey));

}
} else if (!overrideExistingKey && completedRequests.length >= ~~(endpoints.length * 3 / 4) + 1) {
} else if (!overrideExistingKey && completedRequests.length >= threeFourthsThreshold) {
const nodeSigs = [];

@@ -227,3 +230,3 @@ for (let i = 0; i < completedRequests.length; i += 1) {

}
const existingPubKey = thresholdSame(nodeSigs.map(x => x && x.pub_key_x), ~~(endpoints.length / 2) + 1);
const existingPubKey = thresholdSame(nodeSigs.map(x => x && x.pub_key_x), halfThreshold);
const proxyEndpointNum = getProxyCoordinatorEndpointIndex(endpoints, verifier, verifierParams.verifier_id);

@@ -249,3 +252,3 @@ // for import shares, proxy node response is required.

}
} else if (completedRequests.length >= ~~(endpoints.length * 3 / 4) + 1) {
} else if (completedRequests.length >= threeFourthsThreshold) {
// this case is for dkg keys

@@ -275,3 +278,3 @@ const requiredNodeResult = completedRequests.find(resp => {

// if user's account already
const existingPubKey = thresholdSame(nodeSigs.map(x => x && x.pub_key_x), ~~(endpoints.length / 2) + 1);
const existingPubKey = thresholdSame(nodeSigs.map(x => x && x.pub_key_x), halfThreshold);

@@ -375,3 +378,3 @@ // can only import shares if override existing key is allowed or for new non dkg registration

});
const thresholdPublicKey = thresholdSame(pubkeys, ~~(endpoints.length / 2) + 1);
const thresholdPublicKey = thresholdSame(pubkeys, halfThreshold);
if (!thresholdPublicKey) {

@@ -391,3 +394,3 @@ throw new Error("invalid result from nodes, threshold number of public key results are not matching");

});
const thresholdReqCount = canImportedShares ? endpoints.length : ~~(endpoints.length / 2) + 1;
const thresholdReqCount = canImportedShares ? endpoints.length : halfThreshold;
// optimistically run lagrange interpolation once threshold number of shares have been received

@@ -460,5 +463,4 @@ // this is matched against the user public key to ensure that shares are consistent

});
const minThresholdRequired = ~~(endpoints.length / 2) + 1;
if (!verifierParams.extended_verifier_id && validSigs.length < minThresholdRequired) {
throw new Error(`Insufficient number of signatures from nodes, required: ${minThresholdRequired}, found: ${validSigs.length}`);
if (!verifierParams.extended_verifier_id && validSigs.length < halfThreshold) {
throw new Error(`Insufficient number of signatures from nodes, required: ${halfThreshold}, found: ${validSigs.length}`);
}

@@ -471,4 +473,4 @@ const validTokens = sessionTokensResolved.filter(token => {

});
if (!verifierParams.extended_verifier_id && validTokens.length < minThresholdRequired) {
throw new Error(`Insufficient number of session tokens from nodes, required: ${minThresholdRequired}, found: ${validTokens.length}`);
if (!verifierParams.extended_verifier_id && validTokens.length < halfThreshold) {
throw new Error(`Insufficient number of session tokens from nodes, required: ${halfThreshold}, found: ${validTokens.length}`);
}

@@ -494,3 +496,3 @@ sessionTokensResolved.forEach((x, index) => {

// run lagrange interpolation on all subsets, faster in the optimistic scenario than berlekamp-welch due to early exit
const allCombis = kCombinations(decryptedShares.length, ~~(endpoints.length / 2) + 1);
const allCombis = kCombinations(decryptedShares.length, halfThreshold);
let privateKey = null;

@@ -515,3 +517,3 @@ for (let j = 0; j < allCombis.length; j += 1) {

}
const thresholdIsNewKey = thresholdSame(isNewKeyResponses, ~~(endpoints.length / 2) + 1);
const thresholdIsNewKey = thresholdSame(isNewKeyResponses, halfThreshold);

@@ -602,3 +604,3 @@ // Convert each string timestamp to a number

});
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.curve.n);
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.n);
finalPubKey = ecCurve.keyFromPrivate(privateKeyWithNonce.toString(16, 64), "hex").getPublic();

@@ -613,3 +615,3 @@ }

});
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.curve.n);
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.n);
finalPubKey = ecCurve.keyFromPrivate(privateKeyWithNonce.toString(16, 64), "hex").getPublic();

@@ -647,3 +649,3 @@ }

if (typeOfUser === "v1" || typeOfUser === "v2" && metadataNonce.gt(new BN(0))) {
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.curve.n);
const privateKeyWithNonce = oAuthKey.add(metadataNonce).umod(ecCurve.n);
keyWithNonce = privateKeyWithNonce.toString("hex", 64);

@@ -650,0 +652,0 @@ }

@@ -6,7 +6,7 @@ export { JRPC_METHODS, SAPPHIRE_DEVNET_METADATA_URL, SAPPHIRE_METADATA_URL } from './constants.js';

export { default as Torus } from './torus.js';
export { calculateMedian, encParamsBufToHex, encParamsHexToBuf, getKeyCurve, getProxyCoordinatorEndpointIndex, kCombinations, normalizeKeysResult, retryCommitment, thresholdSame, waitFor } from './helpers/common.js';
export { calculateMedian, encParamsBufToHex, encParamsHexToBuf, generatePrivateKey, getKeyCurve, getProxyCoordinatorEndpointIndex, kCombinations, keccak256, normalizeKeysResult, retryCommitment, thresholdSame, waitFor } from './helpers/common.js';
export { GetOrSetNonceError } from './helpers/errorUtils.js';
export { derivePubKey, encodeEd25519Point, generateAddressFromPrivKey, generateAddressFromPubKey, generateEd25519KeyData, generatePrivateKey, generateSecp256k1KeyData, generateShares, getEd25519ExtendedPublicKey, getEncryptionEC, getPostboxKeyFrom1OutOf1, getSecpKeyFromEd25519, keccak256, stripHexPrefix, toChecksumAddress } from './helpers/keyUtils.js';
export { derivePubKey, encodeEd25519Point, generateAddressFromPrivKey, generateAddressFromPubKey, generateEd25519KeyData, generateSecp256k1KeyData, generateShares, getEd25519ExtendedPublicKey, getEncryptionEC, getPostboxKeyFrom1OutOf1, stripHexPrefix, toChecksumAddress } from './helpers/keyUtils.js';
export { generateRandomPolynomial, lagrangeInterpolatePolynomial, lagrangeInterpolation } from './helpers/langrangeInterpolatePoly.js';
export { convertMetadataToNonce, decryptNodeData, decryptNodeDataWithPadding, decryptSeedData, generateMetadataParams, generateNonceMetadataParams, getMetadata, getNonce, getOrSetNonce, getOrSetSapphireMetadataNonce } from './helpers/metadataUtils.js';
export { convertMetadataToNonce, decryptNodeData, decryptNodeDataWithPadding, decryptSeedData, generateMetadataParams, generateNonceMetadataParams, getMetadata, getNonce, getOrSetNonce, getOrSetSapphireMetadataNonce, getSecpKeyFromEd25519 } from './helpers/metadataUtils.js';
export { GetPubKeyOrKeyAssign, retrieveOrImportShare } from './helpers/nodeUtils.js';

@@ -23,5 +23,5 @@ import _defineProperty from '@babel/runtime/helpers/defineProperty';

sum = sum.add(tmp);
sum = sum.umod(this.ecCurve.curve.n);
sum = sum.umod(this.ecCurve.n);
xi = xi.mul(new BN(tmpX));
xi = xi.umod(this.ecCurve.curve.n);
xi = xi.umod(this.ecCurve.n);
}

@@ -28,0 +28,0 @@ return sum;

@@ -1,2 +0,1 @@

import _objectSpread from '@babel/runtime/helpers/objectSpread2';
import _defineProperty from '@babel/runtime/helpers/defineProperty';

@@ -73,3 +72,13 @@ import { KEY_TYPE, LEGACY_NETWORKS_ROUTE_MAP, SIGNER_MAP, METADATA_MAP } from '@toruslabs/constants';

}
async retrieveShares(endpoints, indexes, verifier, verifierParams, idToken, nodePubkeys, extraParams = {}, useDkg) {
async retrieveShares(params) {
const {
verifier,
verifierParams,
idToken,
nodePubkeys,
indexes,
endpoints,
useDkg,
extraParams = {}
} = params;
if (nodePubkeys.length === 0) {

@@ -97,2 +106,5 @@ throw new Error("nodePubkeys param is required");

}
if (!extraParams.session_token_exp_second) {
extraParams.session_token_exp_second = Torus.sessionTime;
}
return retrieveOrImportShare({

@@ -116,5 +128,3 @@ legacyMetadataHost: this.legacyMetadataHost,

nodePubkeys,
extraParams: _objectSpread(_objectSpread({}, extraParams), {}, {
session_token_exp_second: Torus.sessionTime
})
extraParams
});

@@ -138,6 +148,19 @@ }

}
async importPrivateKey(endpoints, nodeIndexes, nodePubkeys, verifier, verifierParams, idToken, newPrivateKey, extraParams = {}) {
async importPrivateKey(params) {
const {
nodeIndexes,
newPrivateKey,
verifier,
verifierParams,
idToken,
nodePubkeys,
endpoints,
extraParams = {}
} = params;
if (endpoints.length !== nodeIndexes.length) {
throw new Error(`length of endpoints array must be same as length of nodeIndexes array`);
}
if (!extraParams.session_token_exp_second) {
extraParams.session_token_exp_second = Torus.sessionTime;
}
let privKeyBuffer;

@@ -151,3 +174,3 @@ if (this.keyType === KEY_TYPE.SECP256K1) {

if (this.keyType === KEY_TYPE.ED25519) {
privKeyBuffer = Buffer.from(newPrivateKey, "hex");
privKeyBuffer = Buffer.from(newPrivateKey.padStart(64, "0"), "hex");
if (privKeyBuffer.length !== 32) {

@@ -186,5 +209,3 @@ throw new Error("Invalid private key length for given ed25519 key");

nodePubkeys,
extraParams: _objectSpread(_objectSpread({}, extraParams), {}, {
session_token_exp_second: Torus.sessionTime
})
extraParams
});

@@ -191,0 +212,0 @@ }

@@ -5,2 +5,4 @@ import { JRPCResponse } from "@toruslabs/constants";

import { CommitmentRequestResult, EciesHex, KeyType, VerifierLookupResponse } from "../interfaces";
export declare function keccak256(a: Buffer): string;
export declare const generatePrivateKey: (ecCurve: EC, buf: typeof Buffer) => Buffer;
export declare const getKeyCurve: (keyType: KeyType) => EC;

@@ -7,0 +9,0 @@ export declare const normalizeKeysResult: (result: VerifierLookupResponse) => Pick<VerifierLookupResponse, "keys" | "is_new_key">;

@@ -5,4 +5,2 @@ import { INodePub } from "@toruslabs/constants";

import { ImportedShare, KeyType, PrivateKeyData } from "../interfaces";
export declare function keccak256(a: Buffer): string;
export declare const generatePrivateKey: (ecCurve: EC, buf: typeof Buffer) => Buffer;
export declare function stripHexPrefix(str: string): string;

@@ -15,6 +13,2 @@ export declare function toChecksumAddress(hexAddress: string): string;

};
export declare const getSecpKeyFromEd25519: (ed25519Scalar: BN) => {
scalar: BN;
point: curve.base.BasePoint;
};
export declare function encodeEd25519Point(point: curve.base.BasePoint): Buffer;

@@ -21,0 +15,0 @@ export declare const generateEd25519KeyData: (ed25519Seed: Buffer) => Promise<PrivateKeyData>;

import { TORUS_NETWORK_TYPE } from "@toruslabs/constants";
import BN from "bn.js";
import { ec as EC } from "elliptic";
import { curve, ec as EC } from "elliptic";
import { EciesHex, GetOrSetNonceResult, KeyType, MetadataParams, NonceMetadataParams } from "../interfaces";
export declare const getSecpKeyFromEd25519: (ed25519Scalar: BN) => {
scalar: BN;
point: curve.base.BasePoint;
};
export declare function convertMetadataToNonce(params: {

@@ -6,0 +10,0 @@ message?: string;

import { INodePub, TORUS_NETWORK_TYPE } from "@toruslabs/constants";
import { ec } from "elliptic";
import { ImportedShare, KeyLookupResult, KeyType, TorusKey, VerifierParams } from "../interfaces";
import { TorusUtilsExtraParams } from "../TorusUtilsExtraParams";
export declare const GetPubKeyOrKeyAssign: (params: {

@@ -30,3 +31,3 @@ endpoints: string[];

newImportedShares?: ImportedShare[];
extraParams: Record<string, unknown>;
extraParams: TorusUtilsExtraParams;
}): Promise<TorusKey>;

@@ -1,5 +0,6 @@

import type { TORUS_NETWORK_TYPE } from "@toruslabs/constants";
import type { INodePub, TORUS_NETWORK_TYPE } from "@toruslabs/constants";
import { Ecies } from "@toruslabs/eccrypto";
import BN from "bn.js";
import { curve } from "elliptic";
import { TorusUtilsExtraParams } from "./TorusUtilsExtraParams";
export interface KeyIndex {

@@ -242,1 +243,21 @@ index: string;

}
export interface ImportKeyParams {
endpoints: string[];
nodeIndexes: number[];
nodePubkeys: INodePub[];
verifier: string;
verifierParams: VerifierParams;
idToken: string;
newPrivateKey: string;
extraParams?: TorusUtilsExtraParams;
}
export interface RetrieveSharesParams {
endpoints: string[];
indexes: number[];
verifier: string;
verifierParams: VerifierParams;
idToken: string;
nodePubkeys: INodePub[];
extraParams?: TorusUtilsExtraParams;
useDkg?: boolean;
}
import { INodePub, TORUS_NETWORK_TYPE } from "@toruslabs/constants";
import { ec as EC } from "elliptic";
import { TorusCtorOptions, TorusKey, TorusPublicKey, VerifierParams } from "./interfaces";
import { ImportKeyParams, RetrieveSharesParams, TorusCtorOptions, TorusKey, TorusPublicKey } from "./interfaces";
declare class Torus {

@@ -21,3 +21,3 @@ private static sessionTime;

static getPostboxKey(torusKey: TorusKey): string;
retrieveShares(endpoints: string[], indexes: number[], verifier: string, verifierParams: VerifierParams, idToken: string, nodePubkeys: INodePub[], extraParams?: Record<string, unknown>, useDkg?: boolean): Promise<TorusKey>;
retrieveShares(params: RetrieveSharesParams): Promise<TorusKey>;
getPublicAddress(endpoints: string[], torusNodePubs: INodePub[], { verifier, verifierId, extendedVerifierId }: {

@@ -28,3 +28,3 @@ verifier: string;

}): Promise<TorusPublicKey>;
importPrivateKey(endpoints: string[], nodeIndexes: number[], nodePubkeys: INodePub[], verifier: string, verifierParams: VerifierParams, idToken: string, newPrivateKey: string, extraParams?: Record<string, unknown>): Promise<TorusKey>;
importPrivateKey(params: ImportKeyParams): Promise<TorusKey>;
/**

@@ -31,0 +31,0 @@ * Note: use this function only for openlogin tkey account lookups.

{
"name": "@toruslabs/torus.js",
"version": "15.0.0-alpha.1",
"version": "15.0.0",
"description": "Handle communication with torus nodes",

@@ -31,4 +31,4 @@ "main": "dist/lib.cjs/index.js",

"bn.js": "^5.2.1",
"elliptic": "^6.5.5",
"bs58": "^5.0.0",
"elliptic": "^6.5.6",
"bs58": "^6.0.0",
"ethereum-cryptography": "^2.2.1",

@@ -40,3 +40,3 @@ "json-stable-stringify": "^1.1.1",

"@babel/register": "^7.24.6",
"@babel/runtime": "^7.24.8",
"@babel/runtime": "^7.25.0",
"@toruslabs/config": "^2.1.0",

@@ -58,6 +58,6 @@ "@toruslabs/eslint-config-typescript": "^3.3.1",

"faker": "^5.5.3",
"husky": "^9.0.11",
"husky": "^9.1.4",
"jsonwebtoken": "^9.0.2",
"lint-staged": "^15.2.7",
"mocha": "^10.6.0",
"mocha": "^10.7.0",
"prettier": "^3.3.3",

@@ -67,3 +67,3 @@ "rimraf": "^6.0.1",

"ts-node": "^10.9.2",
"typescript": "^5.5.3"
"typescript": "^5.5.4"
},

@@ -70,0 +70,0 @@ "repository": {

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc