UNPKG

@beraji/wallet-sdk

Version:

Beraji: Distributed Secret Sharing.

134 lines 5.32 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.ECTSS = exports.ECCurve = void 0; const secp256k1_1 = require("@noble/secp256k1"); const secp256k1_2 = require("@noble/curves/secp256k1"); const sha3_1 = require("@noble/hashes/sha3"); const bn_js_1 = __importDefault(require("bn.js")); const sss_1 = require("./sss"); const ff_1 = require("./ff"); const utils_1 = require("@noble/hashes/utils"); const utils_2 = require("./utils"); class ECCurve { } exports.ECCurve = ECCurve; _a = ECCurve; ECCurve.ff = ff_1.FiniteField.fromBigInt(secp256k1_2.secp256k1.CURVE.n, 'be'); ECCurve.ZERO = secp256k1_1.Point.ZERO.toRawBytes(true); ECCurve.validate = (point) => { try { secp256k1_1.Point.fromHex(point); return true; } catch (er) { return false; } }; ECCurve.baseMul = (r) => { if (_a.ff.ZERO.eq(_a.ff.encode(r))) return secp256k1_1.Point.ZERO.toRawBytes(true); const b = BigInt(new bn_js_1.default(r, 16, _a.ff.en).toString()); return secp256k1_1.Point.BASE.multiply(b).toRawBytes(true); }; ECCurve.negPoint = (point) => { const a = secp256k1_1.Point.fromHex(point); return a.negate().toRawBytes(); }; ECCurve.addPoint = (pointA, pointB) => { if ((0, utils_2.equal)([pointA, secp256k1_1.Point.ZERO.toRawBytes(true)])) return pointB; if ((0, utils_2.equal)([pointB, secp256k1_1.Point.ZERO.toRawBytes(true)])) return pointA; const a = secp256k1_1.Point.fromHex(pointA); const b = secp256k1_1.Point.fromHex(pointB); return a.add(b).toRawBytes(true); }; ECCurve.mulScalar = (point, scalar) => { if ((0, utils_2.equal)([point, secp256k1_1.Point.ZERO.toRawBytes(true)]) || _a.ff.ZERO.eq(_a.ff.encode(scalar))) return secp256k1_1.Point.ZERO.toRawBytes(true); const p = secp256k1_1.Point.fromHex(point); const s = BigInt(new bn_js_1.default(scalar, 16, _a.ff.en).toString()); return p.multiply(s).toRawBytes(true); }; ECCurve.getDerivedKey = (privateKey) => { return _a.ff.norm(privateKey); }; ECCurve.getPublicKey = (privateKey, derived = false) => { if (!derived) privateKey = _a.getDerivedKey(privateKey); return secp256k1_2.secp256k1.getPublicKey(privateKey, true); }; class ECTSS { } exports.ECTSS = ECTSS; _b = ECTSS; ECTSS.ff = ff_1.FiniteField.fromBigInt(secp256k1_2.secp256k1.CURVE.n, 'be'); ECTSS.signatureLength = 65; ECTSS.randomnessLength = 32; ECTSS.privateKeyLength = 32; ECTSS.publicKeyLength = 33; ECTSS.finalizeSig = (sig) => { if (sig.hasHighS()) sig = sig.normalizeS(); return sig.toCompactRawBytes(); }; ECTSS.recoveryBit = (R, sig) => { const q = secp256k1_1.Point.fromHex(R); let recovery = (q.x === sig.r ? 0 : 2) | Number(q.y & BigInt(1)); if (sig.hasHighS()) { sig = sig.normalizeS(); recovery ^= 1; } return recovery; }; ECTSS.shareRandomness = (t, n, indice, seed) => { const r = _b.ff.norm(!seed ? (0, utils_1.randomBytes)(_b.randomnessLength) : (0, sha3_1.keccak_256)(seed)); const x = _b.ff.norm((0, sha3_1.keccak_256)(r)); const secretSharing = new sss_1.SecretSharing(_b.ff); const { shares, zkp } = secretSharing.share(x, t, n, { indice, ec: ECCurve, }); const R = ECCurve.baseMul(r); return { shares, R, r, zkp }; }; ECTSS.addSig = (sigs, r) => { const x = _b.ff.norm((0, sha3_1.keccak_256)(r)); const [R] = sigs.map((sig) => sig.subarray(0, 33)); const Rx = _b.ff.norm(R.subarray(1)); const ss = sigs.map((sig) => sig.subarray(33)); const S = _b.ff.mul(_b.ff.inv(r), _b.ff.sub(ss.reduce((sum, s) => _b.ff.add(sum, s), _b.ff.decode(_b.ff.ZERO)), x)); const sig = new secp256k1_1.Signature(BigInt(_b.ff.encode(Rx).toString()), BigInt(_b.ff.encode(S).toString())); const recovery = _b.recoveryBit(R, sig); return [_b.finalizeSig(sig), recovery]; }; ECTSS.sign = (h, R, x, derivedKey) => { if (x.length !== _b.randomnessLength) throw new Error('bad randomness size'); if (derivedKey.length !== _b.privateKeyLength) throw new Error('bad private key size'); const Rx = _b.ff.norm(R.subarray(1)); const e = _b.ff.add(_b.ff.add(h, _b.ff.mul(Rx, derivedKey)), x); return (0, utils_1.concatBytes)(R, e); }; ECTSS.verify = (h, R, index, sig, pzkp, xzkp) => { if (pzkp.length !== xzkp.length) throw new Error('bad proofs size'); const x = _b.ff.decode(new bn_js_1.default(index, 8, _b.ff.en)); const rG = sig.subarray(0, _b.publicKeyLength); const e = sig.subarray(_b.publicKeyLength, _b.signatureLength); if (!(0, utils_2.equal)([R, rG])) return false; const xG = xzkp.reduce((sum, co, i) => ECCurve.addPoint(sum, ECCurve.mulScalar(co, _b.ff.pow(x, i))), ECCurve.ZERO); const H = ECCurve.baseMul(_b.ff.norm(h)); const Rx = _b.ff.norm(R.subarray(1)); const eG = ECCurve.baseMul(e); const _eG = ECCurve.addPoint(xG, ECCurve.addPoint(H, ECCurve.mulScalar(pzkp.reduce((sum, co, i) => ECCurve.addPoint(sum, ECCurve.mulScalar(co, _b.ff.pow(x, i))), ECCurve.ZERO), Rx))); return (0, utils_2.equal)([_eG, eG]); }; //# sourceMappingURL=ectss.js.map