PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/paillier-bigint/dist/cjs
Просмотр файла: index.node.cjs
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var bcu = require('bigint-crypto-utils');
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return Object.freeze(n);
}
var bcu__namespace = /*#__PURE__*/_interopNamespace(bcu);
/**
* Class for a Paillier public key
*/
class PublicKey {
/**
* Creates an instance of class PublicKey
* @param n - The public modulo
* @param g - The public generator
*/
constructor(n, g) {
this.n = n;
this._n2 = this.n ** 2n; // cache n^2
this.g = g;
}
/**
* Get the bit length of the public modulo
* @returns The bit length of the public modulo
*/
get bitLength() {
return bcu__namespace.bitLength(this.n);
}
/**
* Paillier public-key encryption
*
* @param m - A bigint representation of a plaintext message
* @param r - The random integer factor for encryption. By default is a random in (1,n)
*
* @returns The encryption of m with this public key
*/
encrypt(m, r) {
if (r === undefined) {
do {
r = bcu__namespace.randBetween(this.n);
} while (bcu__namespace.gcd(r, this.n) !== 1n);
}
return (bcu__namespace.modPow(this.g, m, this._n2) * bcu__namespace.modPow(r, this.n, this._n2)) % this._n2;
}
/**
* Homomorphic addition
*
* @param ciphertexts - n >= 2 ciphertexts (c_1,..., c_n) that are the encryption of (m_1, ..., m_n) with this public key
*
* @returns The encryption of (m_1 + ... + m_n) with this public key
*/
addition(...ciphertexts) {
return ciphertexts.reduce((sum, next) => sum * next % this._n2, 1n);
}
/**
* Pseudo-homomorphic addition of plaintext to chipertext
*
* @param ciphertext - an encryption of m1 with this public key
* @param plaintexts - 1 or more plaintexts (m_2, ..., m_n)
*
* @returns The encryption of (m_1 + ... + m_n) with this public key
*/
plaintextAddition(ciphertext, ...plaintexts) {
return plaintexts.reduce((sum, next) => sum * bcu__namespace.modPow(this.g, next, this._n2) % this._n2, ciphertext);
}
/**
* Pseudo-homomorphic Paillier multiplication
*
* @param {bigint} c - a number m encrypted with this public key
* @param {bigint | number} k - either a bigint or a number
*
* @returns {bigint} - the encryption of k·m with this public key
*/
multiply(c, k) {
return bcu__namespace.modPow(c, k, this._n2);
}
}
/**
* Class for Paillier private keys.
*/
class PrivateKey {
/**
* Creates an instance of class PrivateKey
*
* @param lambda
* @param mu
* @param publicKey
* @param p - a big prime
* @param q- a big prime
*/
constructor(lambda, mu, publicKey, p, q) {
this.lambda = lambda;
this.mu = mu;
this._p = p;
this._q = q;
this.publicKey = publicKey;
}
/**
* Get the bit length of the public modulo
* @returns The bit length of the public modulo
*/
get bitLength() {
return bcu__namespace.bitLength(this.publicKey.n);
}
/**
* Get the public modulo n=p·q
* @returns The public modulo n=p·q
*/
get n() {
return this.publicKey.n;
}
/**
* Paillier private-key decryption
*
* @param c - A bigint encrypted with the public key
*
* @returns The decryption of c with this private key
*/
decrypt(c) {
return (L(bcu__namespace.modPow(c, this.lambda, this.publicKey._n2), this.publicKey.n) * this.mu) % this.publicKey.n;
}
/**
* Recover the random factor used for encrypting a message with the complementary public key.
* The recovery function only works if the public key generator g was using the simple variant
* g = 1 + n
* It is also necessary to know p and q (usually stored in the private key)
*
* @param c - The encryption using the public of message m with random factor r
*
* @returns The random factor (mod n)
*
* @throws {RangeError}
* Cannot recover the random factor if publicKey.g != publicKey.n + 1. You should generate yout keys using the simple variant, e.g. generateRandomKeys(3072, true) )
*
* @throws {Error}
* Cannot get random factor without knowing p and q
*
*/
getRandomFactor(c) {
if (this.publicKey.g !== this.n + 1n)
throw RangeError('Cannot recover the random factor if publicKey.g != publicKey.n + 1. You should generate yout keys using the simple variant, e.g. generateRandomKeys(3072, true) )');
if (this._p === undefined || this._q === undefined) {
throw Error('Cannot get random factor without knowing p and q');
}
const m = this.decrypt(c);
const phi = (this._p - 1n) * (this._q - 1n);
const nInvModPhi = bcu__namespace.modInv(this.n, phi);
const c1 = c * (1n - m * this.n) % this.publicKey._n2;
return bcu__namespace.modPow(c1, nInvModPhi, this.n);
}
}
function L(a, n) {
return (a - 1n) / n;
}
/**
* Generates a pair private, public key for the Paillier cryptosystem.
*
* @param bitlength - The bit length of the public modulo
* @param simplevariant - Use the simple variant to compute the generator (g=n+1). This is REQUIRED if you want to be able to recover the random integer factor used when encrypting with the public key
*
* @returns A promise that resolves to a {@link KeyPair} of public, private keys
*/
async function generateRandomKeys(bitlength = 3072, simpleVariant = false) {
let p, q, n, g, lambda, mu;
// if p and q are bitLength/2 long -> 2**(bitLength - 2) <= n < 2**(bitLength)
do {
p = await bcu__namespace.prime(Math.floor(bitlength / 2) + 1);
q = await bcu__namespace.prime(Math.floor(bitlength / 2));
n = p * q;
} while (q === p || bcu__namespace.bitLength(n) !== bitlength);
if (simpleVariant) {
// If using p,q of equivalent length, a simpler variant of the key
// generation steps would be to set
// g=n+1, lambda=(p-1)(q-1), mu=lambda.invertm(n)
g = n + 1n;
lambda = (p - 1n) * (q - 1n);
mu = bcu__namespace.modInv(lambda, n);
}
else {
const n2 = n ** 2n;
g = getGenerator(n, n2);
lambda = bcu__namespace.lcm(p - 1n, q - 1n);
mu = bcu__namespace.modInv(L(bcu__namespace.modPow(g, lambda, n2), n), n);
}
const publicKey = new PublicKey(n, g);
const privateKey = new PrivateKey(lambda, mu, publicKey, p, q);
return { publicKey, privateKey };
}
/**
* Generates a pair private, public key for the Paillier cryptosystem in synchronous mode.
* Synchronous mode is NOT RECOMMENDED since it won't use workers and thus it'll be slower and may freeze thw window in browser's javascript.
*
* @param bitlength - The bit length of the public modulo
* @param simplevariant - Use the simple variant to compute the generator (g=n+1)
*
* @returns A pair of public, private keys
*/
function generateRandomKeysSync(bitlength = 3072, simpleVariant = false) {
let p, q, n, g, lambda, mu;
// if p and q are bitLength/2 long -> 2**(bitLength - 2) <= n < 2**(bitLength)
do {
p = bcu__namespace.primeSync(Math.floor(bitlength / 2) + 1);
q = bcu__namespace.primeSync(Math.floor(bitlength / 2));
n = p * q;
} while (q === p || bcu__namespace.bitLength(n) !== bitlength);
if (simpleVariant) {
// If using p,q of equivalent length, a simpler variant of the key
// generation steps would be to set
// g=n+1, lambda=(p-1)(q-1), mu=lambda.invertm(n)
g = n + 1n;
lambda = (p - 1n) * (q - 1n);
mu = bcu__namespace.modInv(lambda, n);
}
else {
const n2 = n ** 2n;
g = getGenerator(n, n2);
lambda = bcu__namespace.lcm(p - 1n, q - 1n);
mu = bcu__namespace.modInv(L(bcu__namespace.modPow(g, lambda, n2), n), n);
}
const publicKey = new PublicKey(n, g);
const privateKey = new PrivateKey(lambda, mu, publicKey, p, q);
return { publicKey, privateKey };
}
function getGenerator(n, n2) {
const alpha = bcu__namespace.randBetween(n);
const beta = bcu__namespace.randBetween(n);
return ((alpha * n + 1n) * bcu__namespace.modPow(beta, n, n2)) % n2;
}
exports.PrivateKey = PrivateKey;
exports.PublicKey = PublicKey;
exports.generateRandomKeys = generateRandomKeys;
exports.generateRandomKeysSync = generateRandomKeysSync;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubm9kZS5janMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cy9QdWJsaWNLZXkudHMiLCIuLi8uLi9zcmMvdHMvUHJpdmF0ZUtleS50cyIsIi4uLy4uL3NyYy90cy9nZW5lcmF0ZVJhbmRvbUtleXMudHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbImJjdSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTs7O01BR3FCLFNBQVM7Ozs7OztJQVc1QixZQUFhLENBQVMsRUFBRSxDQUFTO1FBQy9CLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ1YsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUN2QixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtLQUNYOzs7OztJQU1ELElBQUksU0FBUztRQUNYLE9BQU9BLGNBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQzdCOzs7Ozs7Ozs7SUFVRCxPQUFPLENBQUUsQ0FBUyxFQUFFLENBQVU7UUFDNUIsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ25CLEdBQUc7Z0JBQ0QsQ0FBQyxHQUFHQSxjQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUM1QixRQUFRQSxjQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFDO1NBQ3BDO1FBQ0QsT0FBTyxDQUFDQSxjQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBR0EsY0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQTtLQUN0Rjs7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
Выполнить команду
Для локальной разработки. Не используйте в интернете!