PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-lib-mpc/dist/src/tss/ecdsa

Просмотр файла: paillierproof.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.m = exports.alpha = void 0;
exports.generateP = generateP;
exports.prove = prove;
exports.verify = verify;
const bigint_crypto_utils_1 = require("bigint-crypto-utils");
const bigint_mod_arith_1 = require("bigint-mod-arith");
const util_1 = require("../../util");
const index_1 = require("./index");
const primes_1 = require("./primes");
// Security parameters.
const k = 128;
// eprint.iacr.org/2018/057.pdf#page6 section 5
// https://github.com/BitGo/BitGoJS/pull/3502#discussion_r1203070392
exports.alpha = 319567;
exports.m = Math.ceil(k / Math.log2(exports.alpha));
/**
 * Generate a set of challenges $p$ for a given paillier public key modulus $n$.
 * @param n - paillier public key modulus
 * @returns {Promise<Array<bigint>>} - array of challenges $p_i$
 */
async function generateP(n) {
    if ((0, bigint_crypto_utils_1.bitLength)(n) < index_1.minModulusBitLength) {
        throw new Error(`modulus n must have a bit length larger than or equal to ${index_1.minModulusBitLength}`);
    }
    return Promise.all(Array(exports.m)
        .fill(null)
        .map(() => (0, util_1.randomPositiveCoPrimeLessThan)(n)));
}
/**
 * Generate a set of proofs $sigma$ for a given set of challenges $p$ using the paillier public key modulus $n$ and the private key $\lambda$.
 * @param n - paillier public key modulus $n$
 * @param lambda - private key $\lambda,  which is the $\euler(N) = (p-1)(q-1)$
 * @param p - array of challenges $p$
 * @returns {Promise<Array<bigint>>} - array of proofs $\sigma$
 */
function prove(n, lambda, p) {
    if (!p.every((p_i) => p_i > 0)) {
        throw new Error('All paillier challenge values must be positive.');
    }
    const n_inv = (0, bigint_mod_arith_1.modInv)(n, lambda);
    return p.map((p_i) => (0, bigint_mod_arith_1.modPow)(p_i, n_inv, n));
}
/**
 * Verify a set of proofs $\sigma$ on the modulus $n$ using the challenges $p$ that were provided to the prover to generate the proofs.
 * @param n - paillier public key modulus $n$
 * @param p - array of challenges $p$
 * @param sigma - array of proofs $\sigma$
 */
function verify(n, p, sigma) {
    if (!p.every((p_i) => p_i > 0)) {
        throw new Error('All paillier challenge values must be positive.');
    }
    if (!sigma.every((sigma_i) => sigma_i > 0)) {
        throw new Error('All paillier challenge proof values must be positive.');
    }
    // a) Check that $N$ is a positive integer and is not divisible by all
    // the primes less than $\alpha$.
    if (n <= 0) {
        return false;
    }
    if (exports.alpha !== 319567) {
        throw new Error('unsupported alpha value');
    }
    for (const prime of primes_1.primesSmallerThan319567) {
        if (n % BigInt(prime) === BigInt(0)) {
            return false;
        }
    }
    // b) Check that $\sigma_i$ is a positive integer $i = 1...m$.
    if (sigma.length !== exports.m) {
        return false;
    }
    if (!sigma.every((sigma_i) => sigma_i > 0)) {
        return false;
    }
    // c) Verify that $p_i = \sigma_i^N \mod N$ for $i = 1...m$.
    for (let i = 0; i < exports.m; i++) {
        if (p[i] !== (0, bigint_mod_arith_1.modPow)(sigma[i], n, n)) {
            return false;
        }
    }
    return true;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFpbGxpZXJwcm9vZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWNkc2EvcGFpbGxpZXJwcm9vZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFtQkEsOEJBU0M7QUFTRCxzQkFNQztBQVFELHdCQWtDQztBQXJGRCw2REFBZ0Q7QUFDaEQsdURBQWtEO0FBRWxELHFDQUEyRDtBQUMzRCxtQ0FBOEM7QUFDOUMscUNBQW1EO0FBRW5ELHVCQUF1QjtBQUN2QixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZCwrQ0FBK0M7QUFDL0Msb0VBQW9FO0FBQ3ZELFFBQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUNmLFFBQUEsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBSyxDQUFDLENBQUMsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLFNBQVMsQ0FBQyxDQUFTO0lBQ3ZDLElBQUksSUFBQSwrQkFBUyxFQUFDLENBQUMsQ0FBQyxHQUFHLDJCQUFtQixFQUFFLENBQUM7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsMkJBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQ2hCLEtBQUssQ0FBQyxTQUFDLENBQUM7U0FDTCxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ1YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsb0NBQTZCLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDL0MsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixLQUFLLENBQUMsQ0FBUyxFQUFFLE1BQWMsRUFBRSxDQUFnQjtJQUMvRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFBLHlCQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBQSx5QkFBTSxFQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixNQUFNLENBQUMsQ0FBUyxFQUFFLENBQWdCLEVBQUUsS0FBb0I7SUFDdEUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0Qsc0VBQXNFO0lBQ3RFLGlDQUFpQztJQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksYUFBSyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLEtBQUssSUFBSSxnQ0FBdUIsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBQ0QsOERBQThEO0lBQzlELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0MsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsNERBQTREO0lBQzVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFBLHlCQUFNLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBiaXRMZW5ndGggfSBmcm9tICdiaWdpbnQtY3J5cHRvLXV0aWxzJztcbmltcG9ydCB7IG1vZEludiwgbW9kUG93IH0gZnJvbSAnYmlnaW50LW1vZC1hcml0aCc7XG5cbmltcG9ydCB7IHJhbmRvbVBvc2l0aXZlQ29QcmltZUxlc3NUaGFuIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBtaW5Nb2R1bHVzQml0TGVuZ3RoIH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgeyBwcmltZXNTbWFsbGVyVGhhbjMxOTU2NyB9IGZyb20gJy4vcHJpbWVzJztcblxuLy8gU2VjdXJpdHkgcGFyYW1ldGVycy5cbmNvbnN0IGsgPSAxMjg7XG4vLyBlcHJpbnQuaWFjci5vcmcvMjAxOC8wNTcucGRmI3BhZ2U2IHNlY3Rpb24gNVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0JpdEdvL0JpdEdvSlMvcHVsbC8zNTAyI2Rpc2N1c3Npb25fcjEyMDMwNzAzOTJcbmV4cG9ydCBjb25zdCBhbHBoYSA9IDMxOTU2NztcbmV4cG9ydCBjb25zdCBtID0gTWF0aC5jZWlsKGsgLyBNYXRoLmxvZzIoYWxwaGEpKTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHNldCBvZiBjaGFsbGVuZ2VzICRwJCBmb3IgYSBnaXZlbiBwYWlsbGllciBwdWJsaWMga2V5IG1vZHVsdXMgJG4kLlxuICogQHBhcmFtIG4gLSBwYWlsbGllciBwdWJsaWMga2V5IG1vZHVsdXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGJpZ2ludD4+fSAtIGFycmF5IG9mIGNoYWxsZW5nZXMgJHBfaSRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUChuOiBiaWdpbnQpOiBQcm9taXNlPEFycmF5PGJpZ2ludD4+IHtcbiAgaWYgKGJpdExlbmd0aChuKSA8IG1pbk1vZHVsdXNCaXRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG1vZHVsdXMgbiBtdXN0IGhhdmUgYSBiaXQgbGVuZ3RoIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvICR7bWluTW9kdWx1c0JpdExlbmd0aH1gKTtcbiAgfVxuICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgQXJyYXkobSlcbiAgICAgIC5maWxsKG51bGwpXG4gICAgICAubWFwKCgpID0+IHJhbmRvbVBvc2l0aXZlQ29QcmltZUxlc3NUaGFuKG4pKVxuICApO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgc2V0IG9mIHByb29mcyAkc2lnbWEkIGZvciBhIGdpdmVuIHNldCBvZiBjaGFsbGVuZ2VzICRwJCB1c2luZyB0aGUgcGFpbGxpZXIgcHVibGljIGtleSBtb2R1bHVzICRuJCBhbmQgdGhlIHByaXZhdGUga2V5ICRcXGxhbWJkYSQuXG4gKiBAcGFyYW0gbiAtIHBhaWxsaWVyIHB1YmxpYyBrZXkgbW9kdWx1cyAkbiRcbiAqIEBwYXJhbSBsYW1iZGEgLSBwcml2YXRlIGtleSAkXFxsYW1iZGEsICB3aGljaCBpcyB0aGUgJFxcZXVsZXIoTikgPSAocC0xKShxLTEpJFxuICogQHBhcmFtIHAgLSBhcnJheSBvZiBjaGFsbGVuZ2VzICRwJFxuICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8YmlnaW50Pj59IC0gYXJyYXkgb2YgcHJvb2ZzICRcXHNpZ21hJFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmUobjogYmlnaW50LCBsYW1iZGE6IGJpZ2ludCwgcDogQXJyYXk8YmlnaW50Pik6IGJpZ2ludFtdIHtcbiAgaWYgKCFwLmV2ZXJ5KChwX2kpID0+IHBfaSA+IDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBbGwgcGFpbGxpZXIgY2hhbGxlbmdlIHZhbHVlcyBtdXN0IGJlIHBvc2l0aXZlLicpO1xuICB9XG4gIGNvbnN0IG5faW52ID0gbW9kSW52KG4sIGxhbWJkYSk7XG4gIHJldHVybiBwLm1hcCgocF9pKSA9PiBtb2RQb3cocF9pLCBuX2ludiwgbikpO1xufVxuXG4vKipcbiAqIFZlcmlmeSBhIHNldCBvZiBwcm9vZnMgJFxcc2lnbWEkIG9uIHRoZSBtb2R1bHVzICRuJCB1c2luZyB0aGUgY2hhbGxlbmdlcyAkcCQgdGhhdCB3ZXJlIHByb3ZpZGVkIHRvIHRoZSBwcm92ZXIgdG8gZ2VuZXJhdGUgdGhlIHByb29mcy5cbiAqIEBwYXJhbSBuIC0gcGFpbGxpZXIgcHVibGljIGtleSBtb2R1bHVzICRuJFxuICogQHBhcmFtIHAgLSBhcnJheSBvZiBjaGFsbGVuZ2VzICRwJFxuICogQHBhcmFtIHNpZ21hIC0gYXJyYXkgb2YgcHJvb2ZzICRcXHNpZ21hJFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5KG46IGJpZ2ludCwgcDogQXJyYXk8YmlnaW50Piwgc2lnbWE6IEFycmF5PGJpZ2ludD4pOiBib29sZWFuIHtcbiAgaWYgKCFwLmV2ZXJ5KChwX2kpID0+IHBfaSA+IDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBbGwgcGFpbGxpZXIgY2hhbGxlbmdlIHZhbHVlcyBtdXN0IGJlIHBvc2l0aXZlLicpO1xuICB9XG4gIGlmICghc2lnbWEuZXZlcnkoKHNpZ21hX2kpID0+IHNpZ21hX2kgPiAwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQWxsIHBhaWxsaWVyIGNoYWxsZW5nZSBwcm9vZiB2YWx1ZXMgbXVzdCBiZSBwb3NpdGl2ZS4nKTtcbiAgfVxuICAvLyBhKSBDaGVjayB0aGF0ICROJCBpcyBhIHBvc2l0aXZlIGludGVnZXIgYW5kIGlzIG5vdCBkaXZpc2libGUgYnkgYWxsXG4gIC8vIHRoZSBwcmltZXMgbGVzcyB0aGFuICRcXGFscGhhJC5cbiAgaWYgKG4gPD0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYWxwaGEgIT09IDMxOTU2Nykge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgYWxwaGEgdmFsdWUnKTtcbiAgfVxuICBmb3IgKGNvbnN0IHByaW1lIG9mIHByaW1lc1NtYWxsZXJUaGFuMzE5NTY3KSB7XG4gICAgaWYgKG4gJSBCaWdJbnQocHJpbWUpID09PSBCaWdJbnQoMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gYikgQ2hlY2sgdGhhdCAkXFxzaWdtYV9pJCBpcyBhIHBvc2l0aXZlIGludGVnZXIgJGkgPSAxLi4ubSQuXG4gIGlmIChzaWdtYS5sZW5ndGggIT09IG0pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCFzaWdtYS5ldmVyeSgoc2lnbWFfaSkgPT4gc2lnbWFfaSA+IDApKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIGMpIFZlcmlmeSB0aGF0ICRwX2kgPSBcXHNpZ21hX2leTiBcXG1vZCBOJCBmb3IgJGkgPSAxLi4ubSQuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbTsgaSsrKSB7XG4gICAgaWYgKHBbaV0gIT09IG1vZFBvdyhzaWdtYVtpXSwgbiwgbikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=

Выполнить команду


Для локальной разработки. Не используйте в интернете!