Launch Week Day 5: Introducing Reachability for PHP.Learn More
Socket
Book a DemoSign in
Socket

paillier-bigint

Package Overview
Dependencies
Maintainers
1
Versions
30
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

paillier-bigint - npm Package Compare versions

Comparing version
3.4.1
to
3.4.2
+32
-29
dist/bundle.esm.js

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

function n(n){return n>=0?n:-n}function t(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let t=1;do{t++;}while((n>>=1n)>1n);return t}function e(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),n<=0n||t<=0n)throw new RangeError("a and b MUST be > 0");let e=0n,r=1n,o=1n,i=0n;for(;0n!==n;){const s=t/n,u=t%n,a=e-o*s,c=r-i*s;t=n,n=u,e=o,r=i,o=a,i=c;}return {g:t,x:e,y:r}}function r(t,e){let r="number"==typeof t?BigInt(n(t)):n(t),o="number"==typeof e?BigInt(n(e)):n(e);if(0n===r)return o;if(0n===o)return r;let i=0n;for(;0n===(1n&(r|o));)r>>=1n,o>>=1n,i++;for(;0n===(1n&r);)r>>=1n;do{for(;0n===(1n&o);)o>>=1n;if(r>o){const n=r;r=o,o=n;}o-=r;}while(0n!==o);return r<<i}function o(t,e){return "number"==typeof t&&(t=BigInt(t)),"number"==typeof e&&(e=BigInt(e)),0n===t&&0n===e?BigInt(0):n(t/r(t,e)*e)}function u(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),t<=0n)throw new RangeError("n must be > 0");const e=n%t;return e<0n?e+t:e}function a(n,t){const r=e(u(n,t),t);if(1n!==r.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${t.toString()}`);return u(r.x,t)}function c(t,e,r){if("number"==typeof t&&(t=BigInt(t)),"number"==typeof e&&(e=BigInt(e)),"number"==typeof r&&(r=BigInt(r)),r<=0n)throw new RangeError("n must be > 0");if(1n===r)return 0n;if(t=u(t,r),e<0n)return a(c(t,n(e),r),r);let o=1n;for(;e>0;)e%2n===1n&&(o=o*t%r),e/=2n,t=t**2n%r;return o}function f(n){let t=0n;for(const e of n.values()){t=(t<<8n)+BigInt(e);}return t}function g(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");return new Promise((function(e,r){{const r=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(r);else for(let t=0;t<Math.ceil(n/65536);t++){const e=65536*t,o=e+65535<n?e+65535:n-1;self.crypto.getRandomValues(r.subarray(e,o));}t&&(r[0]=128|r[0]),e(r);}}))}function m(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");{const e=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(e);else for(let t=0;t<Math.ceil(n/65536);t++){const r=65536*t,o=r+65535<n?r+65535:n-1;self.crypto.getRandomValues(e.subarray(r,o));}return t&&(e[0]=128|e[0]),e}}function d(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=Math.ceil(n/8),r=n%8;return new Promise(((n,o)=>{g(e,!1).then((function(e){if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n;}n(e);}));}))}function b(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=m(Math.ceil(n/8),!1),r=n%8;if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n;}return e}function l(n,e=1n){if(n<=e)throw new RangeError("Arguments MUST be: max > min");const r=n-e,o=t(r);let i;do{i=f(b(o));}while(i>r);return i+e}let w=!1;function h(n,t=16,e=!1){if("number"==typeof n&&(n=BigInt(n)),n<0n)throw RangeError("w MUST be >= 0");return new Promise(((e,r)=>{const o=new Worker(p());o.onmessage=n=>{void 0!==n?.data?._bcu?.isPrime&&(o.terminate(),e(n.data._bcu.isPrime));},o.onmessageerror=n=>{r(n);};const i={_bcu:{rnd:n,iterations:t,id:0}};o.postMessage(i);}))}function y(n,t){if(2n===n)return !0;if(0n===(1n&n)||1n===n)return !1;const e=[3n,5n,7n,11n,13n,17n,19n,23n,29n,31n,37n,41n,43n,47n,53n,59n,61n,67n,71n,73n,79n,83n,89n,97n,101n,103n,107n,109n,113n,127n,131n,137n,139n,149n,151n,157n,163n,167n,173n,179n,181n,191n,193n,197n,199n,211n,223n,227n,229n,233n,239n,241n,251n,257n,263n,269n,271n,277n,281n,283n,293n,307n,311n,313n,317n,331n,337n,347n,349n,353n,359n,367n,373n,379n,383n,389n,397n,401n,409n,419n,421n,431n,433n,439n,443n,449n,457n,461n,463n,467n,479n,487n,491n,499n,503n,509n,521n,523n,541n,547n,557n,563n,569n,571n,577n,587n,593n,599n,601n,607n,613n,617n,619n,631n,641n,643n,647n,653n,659n,661n,673n,677n,683n,691n,701n,709n,719n,727n,733n,739n,743n,751n,757n,761n,769n,773n,787n,797n,809n,811n,821n,823n,827n,829n,839n,853n,857n,859n,863n,877n,881n,883n,887n,907n,911n,919n,929n,937n,941n,947n,953n,967n,971n,977n,983n,991n,997n,1009n,1013n,1019n,1021n,1031n,1033n,1039n,1049n,1051n,1061n,1063n,1069n,1087n,1091n,1093n,1097n,1103n,1109n,1117n,1123n,1129n,1151n,1153n,1163n,1171n,1181n,1187n,1193n,1201n,1213n,1217n,1223n,1229n,1231n,1237n,1249n,1259n,1277n,1279n,1283n,1289n,1291n,1297n,1301n,1303n,1307n,1319n,1321n,1327n,1361n,1367n,1373n,1381n,1399n,1409n,1423n,1427n,1429n,1433n,1439n,1447n,1451n,1453n,1459n,1471n,1481n,1483n,1487n,1489n,1493n,1499n,1511n,1523n,1531n,1543n,1549n,1553n,1559n,1567n,1571n,1579n,1583n,1597n];for(let t=0;t<e.length&&e[t]<=n;t++){const r=e[t];if(n===r)return !0;if(n%r===0n)return !1}let r=0n;const o=n-1n;let i=o;for(;i%2n===0n;)i/=2n,++r;const s=o/2n**r;do{let t=c(l(o,2n),s,n);if(1n===t||t===o)continue;let e=1;for(;e<r&&(t=c(t,2n,n),t!==o);){if(1n===t)return !1;e++;}if(t!==o)return !1}while(0!=--t);return !0}function p(){let n=`\n 'use strict';\n const ${e.name} = ${e.toString()};\n const ${a.name} = ${a.toString()};\n const ${c.name} = ${c.toString()};\n const ${u.name} = ${u.toString()};\n const ${b.name} = ${b.toString()};\n const ${m.name} = ${m.toString()};\n const ${l.name} = ${l.toString()};\n const ${h.name} = ${y.toString()};\n ${t.toString()};\n ${f.toString()};`;return n+=`\n onmessage = async function(msg) {\n if (msg !== undefined && msg.data !== undefined && msg.data._bcu !== undefined && msg.data._bcu.id !== undefined && msg.data._bcu.iterations !== undefined && msg.data._bcu.rnd !== undefined) {\n const msgToParent = {\n _bcu: {\n isPrime: await ${h.name}(msg.data._bcu.rnd, msg.data._bcu.iterations),\n value: msg.data._bcu.rnd,\n id: msg.data._bcu.id\n }\n };\n postMessage(msgToParent);\n }\n }`,function(n){n=`(() => {${n}})()`;const t=new Blob([n],{type:"text/javascript"});return window.URL.createObjectURL(t)}(n)}function $(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");if(!w){let e=0n;do{e=f(b(n,!0));}while(!y(e,t));return new Promise((n=>{n(e);}))}return new Promise(((e,r)=>{const o=[],i=(r,i)=>{if(r._bcu.isPrime){for(let n=0;n<o.length;n++)o[n].terminate();for(;o.length>0;)o.pop();e(r._bcu.value);}else {const e=f(b(n,!0));try{const n={_bcu:{rnd:e,iterations:t,id:r._bcu.id}};i.postMessage(n);}catch(n){}}};{const n=p();for(let t=0;t<self.navigator.hardwareConcurrency-1;t++){const t=new Worker(n);t.onmessage=n=>i(n.data,t),o.push(t);}}for(let e=0;e<o.length;e++)d(n,!0).then((function(n){const r=f(n);o[e].postMessage({_bcu:{rnd:r,iterations:t,id:e}});})).catch(r);}))}function S(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");let e=0n;do{e=f(b(n,!0));}while(!y(e,t));return e}void 0!==self.Worker&&(w=!0);
function n(n){return n>=0?n:-n}function t(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let t=1;do{t++;}while((n>>=1n)>1n);return t}function e(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),n<=0n||t<=0n)throw new RangeError("a and b MUST be > 0");let e=0n,r=1n,o=1n,i=0n;for(;0n!==n;){const s=t/n,u=t%n,a=e-o*s,c=r-i*s;t=n,n=u,e=o,r=i,o=a,i=c;}return {g:t,x:e,y:r}}function r(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),t<=0n)throw new RangeError("n must be > 0");const e=n%t;return e<0n?e+t:e}function o(n,t){const o=e(r(n,t),t);if(1n!==o.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${t.toString()}`);return r(o.x,t)}function i(n,t,e){if(n.length!==t.length)throw new RangeError("The remainders and modulos arrays should have the same length");const i=e??t.reduce(((n,t)=>n*t),1n);return t.reduce(((t,e,s)=>{const u=i/e;return r(t+u*o(u,e)%i*n[s]%i,i)}),0n)}function s(t,e){let r="number"==typeof t?BigInt(n(t)):n(t),o="number"==typeof e?BigInt(n(e)):n(e);if(0n===r)return o;if(0n===o)return r;let i=0n;for(;0n===(1n&(r|o));)r>>=1n,o>>=1n,i++;for(;0n===(1n&r);)r>>=1n;do{for(;0n===(1n&o);)o>>=1n;if(r>o){const n=r;r=o,o=n;}o-=r;}while(0n!==o);return r<<i}function u(t,e){return "number"==typeof t&&(t=BigInt(t)),"number"==typeof e&&(e=BigInt(e)),0n===t&&0n===e?BigInt(0):n(t/s(t,e)*e)}function m(n){return n.map((n=>n[0]**(n[1]-1n)*(n[0]-1n))).reduce(((n,t)=>t*n),1n)}function d(t,e,s,u){if("number"==typeof t&&(t=BigInt(t)),"number"==typeof e&&(e=BigInt(e)),"number"==typeof s&&(s=BigInt(s)),s<=0n)throw new RangeError("n must be > 0");if(1n===s)return 0n;if(t=r(t,s),e<0n)return o(d(t,n(e),s,u),s);if(void 0!==u)return function(n,t,e,r){const o=r.map((n=>n[0]**n[1])),s=r.map((n=>m([n]))),u=s.map(((e,r)=>d(n,t%e,o[r])));return i(u,o,e)}(t,e,s,function(n){const t={};return n.forEach((n=>{if("bigint"==typeof n||"number"==typeof n){const e=String(n);void 0===t[e]?t[e]={p:BigInt(n),k:1n}:t[e].k+=1n;}else {const e=String(n[0]);void 0===t[e]?t[e]={p:BigInt(n[0]),k:BigInt(n[1])}:t[e].k+=BigInt(n[1]);}})),Object.values(t).map((n=>[n.p,n.k]))}(u));let a=1n;for(;e>0;)e%2n===1n&&(a=a*t%s),e/=2n,t=t**2n%s;return a}function l(n){let t=0n;for(const e of n.values()){t=(t<<8n)+BigInt(e);}return t}function b(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");return new Promise((function(e,r){{const r=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(r);else for(let t=0;t<Math.ceil(n/65536);t++){const e=65536*t,o=e+65535<n?e+65535:n-1;self.crypto.getRandomValues(r.subarray(e,o));}t&&(r[0]=128|r[0]),e(r);}}))}function h(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");{const e=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(e);else for(let t=0;t<Math.ceil(n/65536);t++){const r=65536*t,o=r+65535<n?r+65535:n-1;self.crypto.getRandomValues(e.subarray(r,o));}return t&&(e[0]=128|e[0]),e}}function w(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=Math.ceil(n/8),r=n%8;return new Promise(((n,o)=>{b(e,!1).then((function(e){if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n;}n(e);}));}))}function p(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=h(Math.ceil(n/8),!1),r=n%8;if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n;}return e}function y(n,e=1n){if(n<=e)throw new RangeError("Arguments MUST be: max > min");const r=n-e,o=t(r);let i;do{i=l(p(o));}while(i>r);return i+e}let B=!1;function I(n,t=16,e=!1){if("number"==typeof n&&(n=BigInt(n)),n<0n)throw RangeError("w MUST be >= 0");return new Promise(((e,r)=>{const o=new Worker($());o.onmessage=n=>{void 0!==n?.data?._bcu?.isPrime&&(o.terminate(),e(n.data._bcu.isPrime));},o.onmessageerror=n=>{r(n);};const i={_bcu:{rnd:n,iterations:t,id:0}};o.postMessage(i);}))}function S(n,t){if(2n===n)return !0;if(0n===(1n&n)||1n===n)return !1;const e=[3n,5n,7n,11n,13n,17n,19n,23n,29n,31n,37n,41n,43n,47n,53n,59n,61n,67n,71n,73n,79n,83n,89n,97n,101n,103n,107n,109n,113n,127n,131n,137n,139n,149n,151n,157n,163n,167n,173n,179n,181n,191n,193n,197n,199n,211n,223n,227n,229n,233n,239n,241n,251n,257n,263n,269n,271n,277n,281n,283n,293n,307n,311n,313n,317n,331n,337n,347n,349n,353n,359n,367n,373n,379n,383n,389n,397n,401n,409n,419n,421n,431n,433n,439n,443n,449n,457n,461n,463n,467n,479n,487n,491n,499n,503n,509n,521n,523n,541n,547n,557n,563n,569n,571n,577n,587n,593n,599n,601n,607n,613n,617n,619n,631n,641n,643n,647n,653n,659n,661n,673n,677n,683n,691n,701n,709n,719n,727n,733n,739n,743n,751n,757n,761n,769n,773n,787n,797n,809n,811n,821n,823n,827n,829n,839n,853n,857n,859n,863n,877n,881n,883n,887n,907n,911n,919n,929n,937n,941n,947n,953n,967n,971n,977n,983n,991n,997n,1009n,1013n,1019n,1021n,1031n,1033n,1039n,1049n,1051n,1061n,1063n,1069n,1087n,1091n,1093n,1097n,1103n,1109n,1117n,1123n,1129n,1151n,1153n,1163n,1171n,1181n,1187n,1193n,1201n,1213n,1217n,1223n,1229n,1231n,1237n,1249n,1259n,1277n,1279n,1283n,1289n,1291n,1297n,1301n,1303n,1307n,1319n,1321n,1327n,1361n,1367n,1373n,1381n,1399n,1409n,1423n,1427n,1429n,1433n,1439n,1447n,1451n,1453n,1459n,1471n,1481n,1483n,1487n,1489n,1493n,1499n,1511n,1523n,1531n,1543n,1549n,1553n,1559n,1567n,1571n,1579n,1583n,1597n];for(let t=0;t<e.length&&e[t]<=n;t++){const r=e[t];if(n===r)return !0;if(n%r===0n)return !1}let r=0n;const o=n-1n;let i=o;for(;i%2n===0n;)i/=2n,++r;const s=o/2n**r;do{let t=d(y(o,2n),s,n);if(1n===t||t===o)continue;let e=1;for(;e<r&&(t=d(t,2n,n),t!==o);){if(1n===t)return !1;e++;}if(t!==o)return !1}while(0!=--t);return !0}function $(){let n=`\n 'use strict';\n const ${e.name} = ${e.toString()};\n const ${o.name} = ${o.toString()};\n const ${d.name} = ${d.toString()};\n const ${r.name} = ${r.toString()};\n const ${p.name} = ${p.toString()};\n const ${h.name} = ${h.toString()};\n const ${y.name} = ${y.toString()};\n const ${I.name} = ${S.toString()};\n ${t.toString()};\n ${l.toString()};`;return n+=`\n onmessage = async function(msg) {\n if (msg !== undefined && msg.data !== undefined && msg.data._bcu !== undefined && msg.data._bcu.id !== undefined && msg.data._bcu.iterations !== undefined && msg.data._bcu.rnd !== undefined) {\n const msgToParent = {\n _bcu: {\n isPrime: await ${I.name}(msg.data._bcu.rnd, msg.data._bcu.iterations),\n value: msg.data._bcu.rnd,\n id: msg.data._bcu.id\n }\n };\n postMessage(msgToParent);\n }\n }`,function(n){n=`(() => {${n}})()`;const t=new Blob([n],{type:"text/javascript"});return window.URL.createObjectURL(t)}(n)}function R(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");if(!B){let e=0n;do{e=l(p(n,!0));}while(!S(e,t));return new Promise((n=>{n(e);}))}return new Promise(((e,r)=>{const o=[],i=(r,i)=>{if(r._bcu.isPrime){for(let n=0;n<o.length;n++)o[n].terminate();for(;o.length>0;)o.pop();e(r._bcu.value);}else {const e=l(p(n,!0));try{const n={_bcu:{rnd:e,iterations:t,id:r._bcu.id}};i.postMessage(n);}catch(n){}}};{const n=$();for(let t=0;t<self.navigator.hardwareConcurrency-1;t++){const t=new Worker(n);t.onmessage=n=>i(n.data,t),o.push(t);}}for(let e=0;e<o.length;e++)w(n,!0).then((function(n){const r=l(n);o[e].postMessage({_bcu:{rnd:r,iterations:t,id:e}});})).catch(r);}))}function M(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");let e=0n;do{e=l(p(n,!0));}while(!S(e,t));return e}void 0!==self.Worker&&(B=!0);

@@ -12,9 +12,9 @@ class PublicKey {

}
encrypt(m, r$1) {
if (r$1 === undefined) {
encrypt(m, r) {
if (r === undefined) {
do {
r$1 = l(this.n);
} while (r(r$1, this.n) !== 1n);
r = y(this.n);
} while (s(r, this.n) !== 1n);
}
return (c(this.g, m, this._n2) * c(r$1, this.n, this._n2)) % this._n2;
return (d(this.g, m, this._n2) * d(r, this.n, this._n2)) % this._n2;
}

@@ -25,6 +25,6 @@ addition(...ciphertexts) {

plaintextAddition(ciphertext, ...plaintexts) {
return plaintexts.reduce((sum, next) => sum * c(this.g, next, this._n2) % this._n2, ciphertext);
return plaintexts.reduce((sum, next) => sum * d(this.g, next, this._n2) % this._n2, ciphertext);
}
multiply(c$1, k) {
return c(c$1, k, this._n2);
multiply(c, k) {
return d(c, k, this._n2);
}

@@ -47,6 +47,9 @@ }

}
decrypt(c$1) {
return (L(c(c$1, this.lambda, this.publicKey._n2), this.publicKey.n) * this.mu) % this.publicKey.n;
decrypt(c) {
if (this._p !== undefined && this._q !== undefined) {
return (L(d(c, this.lambda, this.publicKey._n2, [[this._p, 2], [this._q, 2]]), this.publicKey.n) * this.mu) % this.publicKey.n;
}
return (L(d(c, this.lambda, this.publicKey._n2), this.publicKey.n) * this.mu) % this.publicKey.n;
}
getRandomFactor(c$1) {
getRandomFactor(c) {
if (this.publicKey.g !== this.n + 1n)

@@ -57,7 +60,7 @@ 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) )');

}
const m = this.decrypt(c$1);
const m = this.decrypt(c);
const phi = (this._p - 1n) * (this._q - 1n);
const nInvModPhi = a(this.n, phi);
const c1 = c$1 * (1n - m * this.n) % this.publicKey._n2;
return c(c1, nInvModPhi, this.n);
const nInvModPhi = o(this.n, phi);
const c1 = c * (1n - m * this.n) % this.publicKey._n2;
return d(c1, nInvModPhi, this.n, [[this._p, 1], [this._q, 1]]);
}

@@ -72,4 +75,4 @@ }

do {
p = await $(Math.floor(bitlength / 2) + 1);
q = await $(Math.floor(bitlength / 2));
p = await R(Math.floor(bitlength / 2) + 1);
q = await R(Math.floor(bitlength / 2));
n = p * q;

@@ -80,3 +83,3 @@ } while (q === p || t(n) !== bitlength);

lambda = (p - 1n) * (q - 1n);
mu = a(lambda, n);
mu = o(lambda, n);
}

@@ -86,4 +89,4 @@ else {

g = getGenerator(n, n2);
lambda = o(p - 1n, q - 1n);
mu = a(L(c(g, lambda, n2), n), n);
lambda = u(p - 1n, q - 1n);
mu = o(L(d(g, lambda, n2), n), n);
}

@@ -97,4 +100,4 @@ const publicKey = new PublicKey(n, g);

do {
p = S(Math.floor(bitlength / 2) + 1);
q = S(Math.floor(bitlength / 2));
p = M(Math.floor(bitlength / 2) + 1);
q = M(Math.floor(bitlength / 2));
n = p * q;

@@ -105,3 +108,3 @@ } while (q === p || t(n) !== bitlength);

lambda = (p - 1n) * (q - 1n);
mu = a(lambda, n);
mu = o(lambda, n);
}

@@ -111,4 +114,4 @@ else {

g = getGenerator(n, n2);
lambda = o(p - 1n, q - 1n);
mu = a(L(c(g, lambda, n2), n), n);
lambda = u(p - 1n, q - 1n);
mu = o(L(d(g, lambda, n2), n), n);
}

@@ -120,7 +123,7 @@ const publicKey = new PublicKey(n, g);

function getGenerator(n, n2) {
const alpha = l(n);
const beta = l(n);
return ((alpha * n + 1n) * c(beta, n, n2)) % n2;
const alpha = y(n);
const beta = y(n);
return ((alpha * n + 1n) * d(beta, n, n2)) % n2;
}
export { PrivateKey, PublicKey, generateRandomKeys, generateRandomKeysSync };

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

function n(n){return n>=0?n:-n}function t(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let t=1;do{t++}while((n>>=1n)>1n);return t}function e(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),n<=0n||t<=0n)throw new RangeError("a and b MUST be > 0");let e=0n,r=1n,i=1n,o=0n;for(;0n!==n;){const s=t/n,u=t%n,c=e-i*s,a=r-o*s;t=n,n=u,e=i,r=o,i=c,o=a}return{g:t,x:e,y:r}}function r(t,e){let r="number"==typeof t?BigInt(n(t)):n(t),i="number"==typeof e?BigInt(n(e)):n(e);if(0n===r)return i;if(0n===i)return r;let o=0n;for(;0n===(1n&(r|i));)r>>=1n,i>>=1n,o++;for(;0n===(1n&r);)r>>=1n;do{for(;0n===(1n&i);)i>>=1n;if(r>i){const n=r;r=i,i=n}i-=r}while(0n!==i);return r<<o}function i(t,e){return"number"==typeof t&&(t=BigInt(t)),"number"==typeof e&&(e=BigInt(e)),0n===t&&0n===e?BigInt(0):n(t/r(t,e)*e)}function o(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),t<=0n)throw new RangeError("n must be > 0");const e=n%t;return e<0n?e+t:e}function s(n,t){const r=e(o(n,t),t);if(1n!==r.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${t.toString()}`);return o(r.x,t)}function u(t,e,r){if("number"==typeof t&&(t=BigInt(t)),"number"==typeof e&&(e=BigInt(e)),"number"==typeof r&&(r=BigInt(r)),r<=0n)throw new RangeError("n must be > 0");if(1n===r)return 0n;if(t=o(t,r),e<0n)return s(u(t,n(e),r),r);let i=1n;for(;e>0;)e%2n===1n&&(i=i*t%r),e/=2n,t=t**2n%r;return i}function c(n){let t=0n;for(const e of n.values())t=(t<<8n)+BigInt(e);return t}function a(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");{const e=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(e);else for(let t=0;t<Math.ceil(n/65536);t++){const r=65536*t,i=r+65535<n?r+65535:n-1;self.crypto.getRandomValues(e.subarray(r,i))}return t&&(e[0]=128|e[0]),e}}function f(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=Math.ceil(n/8),r=n%8;return new Promise(((n,i)=>{(function(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");return new Promise((function(e,r){{const r=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(r);else for(let t=0;t<Math.ceil(n/65536);t++){const e=65536*t,i=e+65535<n?e+65535:n-1;self.crypto.getRandomValues(r.subarray(e,i))}t&&(r[0]=128|r[0]),e(r)}}))})(e,!1).then((function(e){if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}n(e)}))}))}function g(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=a(Math.ceil(n/8),!1),r=n%8;if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}return e}function h(n,e=1n){if(n<=e)throw new RangeError("Arguments MUST be: max > min");const r=n-e,i=t(r);let o;do{o=c(g(i))}while(o>r);return o+e}let l=!1;function d(n,t=16,e=!1){if("number"==typeof n&&(n=BigInt(n)),n<0n)throw RangeError("w MUST be >= 0");return new Promise(((e,r)=>{const i=new Worker(b());i.onmessage=n=>{void 0!==n?.data?._bcu?.isPrime&&(i.terminate(),e(n.data._bcu.isPrime))},i.onmessageerror=n=>{r(n)};const o={_bcu:{rnd:n,iterations:t,id:0}};i.postMessage(o)}))}function m(n,t){if(2n===n)return!0;if(0n===(1n&n)||1n===n)return!1;const e=[3n,5n,7n,11n,13n,17n,19n,23n,29n,31n,37n,41n,43n,47n,53n,59n,61n,67n,71n,73n,79n,83n,89n,97n,101n,103n,107n,109n,113n,127n,131n,137n,139n,149n,151n,157n,163n,167n,173n,179n,181n,191n,193n,197n,199n,211n,223n,227n,229n,233n,239n,241n,251n,257n,263n,269n,271n,277n,281n,283n,293n,307n,311n,313n,317n,331n,337n,347n,349n,353n,359n,367n,373n,379n,383n,389n,397n,401n,409n,419n,421n,431n,433n,439n,443n,449n,457n,461n,463n,467n,479n,487n,491n,499n,503n,509n,521n,523n,541n,547n,557n,563n,569n,571n,577n,587n,593n,599n,601n,607n,613n,617n,619n,631n,641n,643n,647n,653n,659n,661n,673n,677n,683n,691n,701n,709n,719n,727n,733n,739n,743n,751n,757n,761n,769n,773n,787n,797n,809n,811n,821n,823n,827n,829n,839n,853n,857n,859n,863n,877n,881n,883n,887n,907n,911n,919n,929n,937n,941n,947n,953n,967n,971n,977n,983n,991n,997n,1009n,1013n,1019n,1021n,1031n,1033n,1039n,1049n,1051n,1061n,1063n,1069n,1087n,1091n,1093n,1097n,1103n,1109n,1117n,1123n,1129n,1151n,1153n,1163n,1171n,1181n,1187n,1193n,1201n,1213n,1217n,1223n,1229n,1231n,1237n,1249n,1259n,1277n,1279n,1283n,1289n,1291n,1297n,1301n,1303n,1307n,1319n,1321n,1327n,1361n,1367n,1373n,1381n,1399n,1409n,1423n,1427n,1429n,1433n,1439n,1447n,1451n,1453n,1459n,1471n,1481n,1483n,1487n,1489n,1493n,1499n,1511n,1523n,1531n,1543n,1549n,1553n,1559n,1567n,1571n,1579n,1583n,1597n];for(let t=0;t<e.length&&e[t]<=n;t++){const r=e[t];if(n===r)return!0;if(n%r===0n)return!1}let r=0n;const i=n-1n;let o=i;for(;o%2n===0n;)o/=2n,++r;const s=i/2n**r;do{let t=u(h(i,2n),s,n);if(1n===t||t===i)continue;let e=1;for(;e<r&&(t=u(t,2n,n),t!==i);){if(1n===t)return!1;e++}if(t!==i)return!1}while(0!=--t);return!0}function b(){let n=`\n 'use strict';\n const ${e.name} = ${e.toString()};\n const ${s.name} = ${s.toString()};\n const ${u.name} = ${u.toString()};\n const ${o.name} = ${o.toString()};\n const ${g.name} = ${g.toString()};\n const ${a.name} = ${a.toString()};\n const ${h.name} = ${h.toString()};\n const ${d.name} = ${m.toString()};\n ${t.toString()};\n ${c.toString()};`;return n+=`\n onmessage = async function(msg) {\n if (msg !== undefined && msg.data !== undefined && msg.data._bcu !== undefined && msg.data._bcu.id !== undefined && msg.data._bcu.iterations !== undefined && msg.data._bcu.rnd !== undefined) {\n const msgToParent = {\n _bcu: {\n isPrime: await ${d.name}(msg.data._bcu.rnd, msg.data._bcu.iterations),\n value: msg.data._bcu.rnd,\n id: msg.data._bcu.id\n }\n };\n postMessage(msgToParent);\n }\n }`,function(n){n=`(() => {${n}})()`;const t=new Blob([n],{type:"text/javascript"});return window.URL.createObjectURL(t)}(n)}function w(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");if(!l){let e=0n;do{e=c(g(n,!0))}while(!m(e,t));return new Promise((n=>{n(e)}))}return new Promise(((e,r)=>{const i=[],o=(r,o)=>{if(r._bcu.isPrime){for(let n=0;n<i.length;n++)i[n].terminate();for(;i.length>0;)i.pop();e(r._bcu.value)}else{const e=c(g(n,!0));try{const n={_bcu:{rnd:e,iterations:t,id:r._bcu.id}};o.postMessage(n)}catch(n){}}};{const n=b();for(let t=0;t<self.navigator.hardwareConcurrency-1;t++){const t=new Worker(n);t.onmessage=n=>o(n.data,t),i.push(t)}}for(let e=0;e<i.length;e++)f(n,!0).then((function(n){const r=c(n);i[e].postMessage({_bcu:{rnd:r,iterations:t,id:e}})})).catch(r)}))}function p(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");let e=0n;do{e=c(g(n,!0))}while(!m(e,t));return e}void 0!==self.Worker&&(l=!0);class y{constructor(n,t){this.n=n,this._n2=this.n**2n,this.g=t}get bitLength(){return t(this.n)}encrypt(n,t){if(void 0===t)do{t=h(this.n)}while(1n!==r(t,this.n));return u(this.g,n,this._n2)*u(t,this.n,this._n2)%this._n2}addition(...n){return n.reduce(((n,t)=>n*t%this._n2),1n)}plaintextAddition(n,...t){return t.reduce(((n,t)=>n*u(this.g,t,this._n2)%this._n2),n)}multiply(n,t){return u(n,t,this._n2)}}class _{constructor(n,t,e,r,i){this.lambda=n,this.mu=t,this._p=r,this._q=i,this.publicKey=e}get bitLength(){return t(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(n){return $(u(n,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(n){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const t=this.decrypt(n),e=(this._p-1n)*(this._q-1n),r=s(this.n,e);return u(n*(1n-t*this.n)%this.publicKey._n2,r,this.n)}}function $(n,t){return(n-1n)/t}async function M(n=3072,e=!1){let r,o,c,a,f,g;do{r=await w(Math.floor(n/2)+1),o=await w(Math.floor(n/2)),c=r*o}while(o===r||t(c)!==n);if(e)a=c+1n,f=(r-1n)*(o-1n),g=s(f,c);else{const n=c**2n;a=S(c,n),f=i(r-1n,o-1n),g=s($(u(a,f,n),c),c)}const h=new y(c,a);return{publicKey:h,privateKey:new _(f,g,h,r,o)}}function R(n=3072,e=!1){let r,o,c,a,f,g;do{r=p(Math.floor(n/2)+1),o=p(Math.floor(n/2)),c=r*o}while(o===r||t(c)!==n);if(e)a=c+1n,f=(r-1n)*(o-1n),g=s(f,c);else{const n=c**2n;a=S(c,n),f=i(r-1n,o-1n),g=s($(u(a,f,n),c),c)}const h=new y(c,a);return{publicKey:h,privateKey:new _(f,g,h,r,o)}}function S(n,t){return(h(n)*n+1n)*u(h(n),n,t)%t}export{_ as PrivateKey,y as PublicKey,M as generateRandomKeys,R as generateRandomKeysSync};
function n(n){return n>=0?n:-n}function t(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let t=1;do{t++}while((n>>=1n)>1n);return t}function e(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),n<=0n||t<=0n)throw new RangeError("a and b MUST be > 0");let e=0n,r=1n,i=1n,o=0n;for(;0n!==n;){const s=t/n,u=t%n,c=e-i*s,a=r-o*s;t=n,n=u,e=i,r=o,i=c,o=a}return{g:t,x:e,y:r}}function r(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),t<=0n)throw new RangeError("n must be > 0");const e=n%t;return e<0n?e+t:e}function i(n,t){const i=e(r(n,t),t);if(1n!==i.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${t.toString()}`);return r(i.x,t)}function o(n,t,e){if(n.length!==t.length)throw new RangeError("The remainders and modulos arrays should have the same length");const o=e??t.reduce(((n,t)=>n*t),1n);return t.reduce(((t,e,s)=>{const u=o/e;return r(t+u*i(u,e)%o*n[s]%o,o)}),0n)}function s(t,e){let r="number"==typeof t?BigInt(n(t)):n(t),i="number"==typeof e?BigInt(n(e)):n(e);if(0n===r)return i;if(0n===i)return r;let o=0n;for(;0n===(1n&(r|i));)r>>=1n,i>>=1n,o++;for(;0n===(1n&r);)r>>=1n;do{for(;0n===(1n&i);)i>>=1n;if(r>i){const n=r;r=i,i=n}i-=r}while(0n!==i);return r<<o}function u(t,e){return"number"==typeof t&&(t=BigInt(t)),"number"==typeof e&&(e=BigInt(e)),0n===t&&0n===e?BigInt(0):n(t/s(t,e)*e)}function c(t,e,s,u){if("number"==typeof t&&(t=BigInt(t)),"number"==typeof e&&(e=BigInt(e)),"number"==typeof s&&(s=BigInt(s)),s<=0n)throw new RangeError("n must be > 0");if(1n===s)return 0n;if(t=r(t,s),e<0n)return i(c(t,n(e),s,u),s);if(void 0!==u)return function(n,t,e,r){const i=r.map((n=>n[0]**n[1])),s=r.map((n=>function(n){return n.map((n=>n[0]**(n[1]-1n)*(n[0]-1n))).reduce(((n,t)=>t*n),1n)}([n]))),u=s.map(((e,r)=>c(n,t%e,i[r])));return o(u,i,e)}(t,e,s,function(n){const t={};return n.forEach((n=>{if("bigint"==typeof n||"number"==typeof n){const e=String(n);void 0===t[e]?t[e]={p:BigInt(n),k:1n}:t[e].k+=1n}else{const e=String(n[0]);void 0===t[e]?t[e]={p:BigInt(n[0]),k:BigInt(n[1])}:t[e].k+=BigInt(n[1])}})),Object.values(t).map((n=>[n.p,n.k]))}(u));let a=1n;for(;e>0;)e%2n===1n&&(a=a*t%s),e/=2n,t=t**2n%s;return a}function a(n){let t=0n;for(const e of n.values())t=(t<<8n)+BigInt(e);return t}function f(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");{const e=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(e);else for(let t=0;t<Math.ceil(n/65536);t++){const r=65536*t,i=r+65535<n?r+65535:n-1;self.crypto.getRandomValues(e.subarray(r,i))}return t&&(e[0]=128|e[0]),e}}function h(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=Math.ceil(n/8),r=n%8;return new Promise(((n,i)=>{(function(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");return new Promise((function(e,r){{const r=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(r);else for(let t=0;t<Math.ceil(n/65536);t++){const e=65536*t,i=e+65535<n?e+65535:n-1;self.crypto.getRandomValues(r.subarray(e,i))}t&&(r[0]=128|r[0]),e(r)}}))})(e,!1).then((function(e){if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}n(e)}))}))}function g(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=f(Math.ceil(n/8),!1),r=n%8;if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}return e}function l(n,e=1n){if(n<=e)throw new RangeError("Arguments MUST be: max > min");const r=n-e,i=t(r);let o;do{o=a(g(i))}while(o>r);return o+e}let d=!1;function m(n,t=16,e=!1){if("number"==typeof n&&(n=BigInt(n)),n<0n)throw RangeError("w MUST be >= 0");return new Promise(((e,r)=>{const i=new Worker(p());i.onmessage=n=>{void 0!==n?.data?._bcu?.isPrime&&(i.terminate(),e(n.data._bcu.isPrime))},i.onmessageerror=n=>{r(n)};const o={_bcu:{rnd:n,iterations:t,id:0}};i.postMessage(o)}))}function b(n,t){if(2n===n)return!0;if(0n===(1n&n)||1n===n)return!1;const e=[3n,5n,7n,11n,13n,17n,19n,23n,29n,31n,37n,41n,43n,47n,53n,59n,61n,67n,71n,73n,79n,83n,89n,97n,101n,103n,107n,109n,113n,127n,131n,137n,139n,149n,151n,157n,163n,167n,173n,179n,181n,191n,193n,197n,199n,211n,223n,227n,229n,233n,239n,241n,251n,257n,263n,269n,271n,277n,281n,283n,293n,307n,311n,313n,317n,331n,337n,347n,349n,353n,359n,367n,373n,379n,383n,389n,397n,401n,409n,419n,421n,431n,433n,439n,443n,449n,457n,461n,463n,467n,479n,487n,491n,499n,503n,509n,521n,523n,541n,547n,557n,563n,569n,571n,577n,587n,593n,599n,601n,607n,613n,617n,619n,631n,641n,643n,647n,653n,659n,661n,673n,677n,683n,691n,701n,709n,719n,727n,733n,739n,743n,751n,757n,761n,769n,773n,787n,797n,809n,811n,821n,823n,827n,829n,839n,853n,857n,859n,863n,877n,881n,883n,887n,907n,911n,919n,929n,937n,941n,947n,953n,967n,971n,977n,983n,991n,997n,1009n,1013n,1019n,1021n,1031n,1033n,1039n,1049n,1051n,1061n,1063n,1069n,1087n,1091n,1093n,1097n,1103n,1109n,1117n,1123n,1129n,1151n,1153n,1163n,1171n,1181n,1187n,1193n,1201n,1213n,1217n,1223n,1229n,1231n,1237n,1249n,1259n,1277n,1279n,1283n,1289n,1291n,1297n,1301n,1303n,1307n,1319n,1321n,1327n,1361n,1367n,1373n,1381n,1399n,1409n,1423n,1427n,1429n,1433n,1439n,1447n,1451n,1453n,1459n,1471n,1481n,1483n,1487n,1489n,1493n,1499n,1511n,1523n,1531n,1543n,1549n,1553n,1559n,1567n,1571n,1579n,1583n,1597n];for(let t=0;t<e.length&&e[t]<=n;t++){const r=e[t];if(n===r)return!0;if(n%r===0n)return!1}let r=0n;const i=n-1n;let o=i;for(;o%2n===0n;)o/=2n,++r;const s=i/2n**r;do{let t=c(l(i,2n),s,n);if(1n===t||t===i)continue;let e=1;for(;e<r&&(t=c(t,2n,n),t!==i);){if(1n===t)return!1;e++}if(t!==i)return!1}while(0!=--t);return!0}function p(){let n=`\n 'use strict';\n const ${e.name} = ${e.toString()};\n const ${i.name} = ${i.toString()};\n const ${c.name} = ${c.toString()};\n const ${r.name} = ${r.toString()};\n const ${g.name} = ${g.toString()};\n const ${f.name} = ${f.toString()};\n const ${l.name} = ${l.toString()};\n const ${m.name} = ${b.toString()};\n ${t.toString()};\n ${a.toString()};`;return n+=`\n onmessage = async function(msg) {\n if (msg !== undefined && msg.data !== undefined && msg.data._bcu !== undefined && msg.data._bcu.id !== undefined && msg.data._bcu.iterations !== undefined && msg.data._bcu.rnd !== undefined) {\n const msgToParent = {\n _bcu: {\n isPrime: await ${m.name}(msg.data._bcu.rnd, msg.data._bcu.iterations),\n value: msg.data._bcu.rnd,\n id: msg.data._bcu.id\n }\n };\n postMessage(msgToParent);\n }\n }`,function(n){n=`(() => {${n}})()`;const t=new Blob([n],{type:"text/javascript"});return window.URL.createObjectURL(t)}(n)}function w(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");if(!d){let e=0n;do{e=a(g(n,!0))}while(!b(e,t));return new Promise((n=>{n(e)}))}return new Promise(((e,r)=>{const i=[],o=(r,o)=>{if(r._bcu.isPrime){for(let n=0;n<i.length;n++)i[n].terminate();for(;i.length>0;)i.pop();e(r._bcu.value)}else{const e=a(g(n,!0));try{const n={_bcu:{rnd:e,iterations:t,id:r._bcu.id}};o.postMessage(n)}catch(n){}}};{const n=p();for(let t=0;t<self.navigator.hardwareConcurrency-1;t++){const t=new Worker(n);t.onmessage=n=>o(n.data,t),i.push(t)}}for(let e=0;e<i.length;e++)h(n,!0).then((function(n){const r=a(n);i[e].postMessage({_bcu:{rnd:r,iterations:t,id:e}})})).catch(r)}))}function y(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");let e=0n;do{e=a(g(n,!0))}while(!b(e,t));return e}void 0!==self.Worker&&(d=!0);class _{constructor(n,t){this.n=n,this._n2=this.n**2n,this.g=t}get bitLength(){return t(this.n)}encrypt(n,t){if(void 0===t)do{t=l(this.n)}while(1n!==s(t,this.n));return c(this.g,n,this._n2)*c(t,this.n,this._n2)%this._n2}addition(...n){return n.reduce(((n,t)=>n*t%this._n2),1n)}plaintextAddition(n,...t){return t.reduce(((n,t)=>n*c(this.g,t,this._n2)%this._n2),n)}multiply(n,t){return c(n,t,this._n2)}}class v{constructor(n,t,e,r,i){this.lambda=n,this.mu=t,this._p=r,this._q=i,this.publicKey=e}get bitLength(){return t(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(n){return void 0!==this._p&&void 0!==this._q?S(c(n,this.lambda,this.publicKey._n2,[[this._p,2],[this._q,2]]),this.publicKey.n)*this.mu%this.publicKey.n:S(c(n,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(n){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const t=this.decrypt(n),e=(this._p-1n)*(this._q-1n),r=i(this.n,e);return c(n*(1n-t*this.n)%this.publicKey._n2,r,this.n,[[this._p,1],[this._q,1]])}}function S(n,t){return(n-1n)/t}async function R(n=3072,e=!1){let r,o,s,a,f,h;do{r=await w(Math.floor(n/2)+1),o=await w(Math.floor(n/2)),s=r*o}while(o===r||t(s)!==n);if(e)a=s+1n,f=(r-1n)*(o-1n),h=i(f,s);else{const n=s**2n;a=M(s,n),f=u(r-1n,o-1n),h=i(S(c(a,f,n),s),s)}const g=new _(s,a);return{publicKey:g,privateKey:new v(f,h,g,r,o)}}function $(n=3072,e=!1){let r,o,s,a,f,h;do{r=y(Math.floor(n/2)+1),o=y(Math.floor(n/2)),s=r*o}while(o===r||t(s)!==n);if(e)a=s+1n,f=(r-1n)*(o-1n),h=i(f,s);else{const n=s**2n;a=M(s,n),f=u(r-1n,o-1n),h=i(S(c(a,f,n),s),s)}const g=new _(s,a);return{publicKey:g,privateKey:new v(f,h,g,r,o)}}function M(n,t){return(l(n)*n+1n)*c(l(n),n,t)%t}export{v as PrivateKey,_ as PublicKey,R as generateRandomKeys,$ as generateRandomKeysSync};

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

var paillierBigint=function(n){"use strict";function t(n){return n>=0?n:-n}function e(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let t=1;do{t++}while((n>>=1n)>1n);return t}function r(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),n<=0n||t<=0n)throw new RangeError("a and b MUST be > 0");let e=0n,r=1n,i=1n,o=0n;for(;0n!==n;){const s=t/n,u=t%n,a=e-i*s,c=r-o*s;t=n,n=u,e=i,r=o,i=a,o=c}return{g:t,x:e,y:r}}function i(n,e){let r="number"==typeof n?BigInt(t(n)):t(n),i="number"==typeof e?BigInt(t(e)):t(e);if(0n===r)return i;if(0n===i)return r;let o=0n;for(;0n===(1n&(r|i));)r>>=1n,i>>=1n,o++;for(;0n===(1n&r);)r>>=1n;do{for(;0n===(1n&i);)i>>=1n;if(r>i){const n=r;r=i,i=n}i-=r}while(0n!==i);return r<<o}function o(n,e){return"number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),0n===n&&0n===e?BigInt(0):t(n/i(n,e)*e)}function s(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),t<=0n)throw new RangeError("n must be > 0");const e=n%t;return e<0n?e+t:e}function u(n,t){const e=r(s(n,t),t);if(1n!==e.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${t.toString()}`);return s(e.x,t)}function a(n,e,r){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),"number"==typeof r&&(r=BigInt(r)),r<=0n)throw new RangeError("n must be > 0");if(1n===r)return 0n;if(n=s(n,r),e<0n)return u(a(n,t(e),r),r);let i=1n;for(;e>0;)e%2n===1n&&(i=i*n%r),e/=2n,n=n**2n%r;return i}function c(n){let t=0n;for(const e of n.values())t=(t<<8n)+BigInt(e);return t}function f(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");{const e=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(e);else for(let t=0;t<Math.ceil(n/65536);t++){const r=65536*t,i=r+65535<n?r+65535:n-1;self.crypto.getRandomValues(e.subarray(r,i))}return t&&(e[0]=128|e[0]),e}}function g(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=Math.ceil(n/8),r=n%8;return new Promise(((n,i)=>{(function(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");return new Promise((function(e,r){{const r=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(r);else for(let t=0;t<Math.ceil(n/65536);t++){const e=65536*t,i=e+65535<n?e+65535:n-1;self.crypto.getRandomValues(r.subarray(e,i))}t&&(r[0]=128|r[0]),e(r)}}))})(e,!1).then((function(e){if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}n(e)}))}))}function h(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=f(Math.ceil(n/8),!1),r=n%8;if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}return e}function l(n,t=1n){if(n<=t)throw new RangeError("Arguments MUST be: max > min");const r=n-t,i=e(r);let o;do{o=c(h(i))}while(o>r);return o+t}let d=!1;function m(n,t=16,e=!1){if("number"==typeof n&&(n=BigInt(n)),n<0n)throw RangeError("w MUST be >= 0");return new Promise(((e,r)=>{const i=new Worker(w());i.onmessage=n=>{void 0!==n?.data?._bcu?.isPrime&&(i.terminate(),e(n.data._bcu.isPrime))},i.onmessageerror=n=>{r(n)};const o={_bcu:{rnd:n,iterations:t,id:0}};i.postMessage(o)}))}function b(n,t){if(2n===n)return!0;if(0n===(1n&n)||1n===n)return!1;const e=[3n,5n,7n,11n,13n,17n,19n,23n,29n,31n,37n,41n,43n,47n,53n,59n,61n,67n,71n,73n,79n,83n,89n,97n,101n,103n,107n,109n,113n,127n,131n,137n,139n,149n,151n,157n,163n,167n,173n,179n,181n,191n,193n,197n,199n,211n,223n,227n,229n,233n,239n,241n,251n,257n,263n,269n,271n,277n,281n,283n,293n,307n,311n,313n,317n,331n,337n,347n,349n,353n,359n,367n,373n,379n,383n,389n,397n,401n,409n,419n,421n,431n,433n,439n,443n,449n,457n,461n,463n,467n,479n,487n,491n,499n,503n,509n,521n,523n,541n,547n,557n,563n,569n,571n,577n,587n,593n,599n,601n,607n,613n,617n,619n,631n,641n,643n,647n,653n,659n,661n,673n,677n,683n,691n,701n,709n,719n,727n,733n,739n,743n,751n,757n,761n,769n,773n,787n,797n,809n,811n,821n,823n,827n,829n,839n,853n,857n,859n,863n,877n,881n,883n,887n,907n,911n,919n,929n,937n,941n,947n,953n,967n,971n,977n,983n,991n,997n,1009n,1013n,1019n,1021n,1031n,1033n,1039n,1049n,1051n,1061n,1063n,1069n,1087n,1091n,1093n,1097n,1103n,1109n,1117n,1123n,1129n,1151n,1153n,1163n,1171n,1181n,1187n,1193n,1201n,1213n,1217n,1223n,1229n,1231n,1237n,1249n,1259n,1277n,1279n,1283n,1289n,1291n,1297n,1301n,1303n,1307n,1319n,1321n,1327n,1361n,1367n,1373n,1381n,1399n,1409n,1423n,1427n,1429n,1433n,1439n,1447n,1451n,1453n,1459n,1471n,1481n,1483n,1487n,1489n,1493n,1499n,1511n,1523n,1531n,1543n,1549n,1553n,1559n,1567n,1571n,1579n,1583n,1597n];for(let t=0;t<e.length&&e[t]<=n;t++){const r=e[t];if(n===r)return!0;if(n%r===0n)return!1}let r=0n;const i=n-1n;let o=i;for(;o%2n===0n;)o/=2n,++r;const s=i/2n**r;do{let t=a(l(i,2n),s,n);if(1n===t||t===i)continue;let e=1;for(;e<r&&(t=a(t,2n,n),t!==i);){if(1n===t)return!1;e++}if(t!==i)return!1}while(0!=--t);return!0}function w(){let n=`\n 'use strict';\n const ${r.name} = ${r.toString()};\n const ${u.name} = ${u.toString()};\n const ${a.name} = ${a.toString()};\n const ${s.name} = ${s.toString()};\n const ${h.name} = ${h.toString()};\n const ${f.name} = ${f.toString()};\n const ${l.name} = ${l.toString()};\n const ${m.name} = ${b.toString()};\n ${e.toString()};\n ${c.toString()};`;return n+=`\n onmessage = async function(msg) {\n if (msg !== undefined && msg.data !== undefined && msg.data._bcu !== undefined && msg.data._bcu.id !== undefined && msg.data._bcu.iterations !== undefined && msg.data._bcu.rnd !== undefined) {\n const msgToParent = {\n _bcu: {\n isPrime: await ${m.name}(msg.data._bcu.rnd, msg.data._bcu.iterations),\n value: msg.data._bcu.rnd,\n id: msg.data._bcu.id\n }\n };\n postMessage(msgToParent);\n }\n }`,function(n){n=`(() => {${n}})()`;const t=new Blob([n],{type:"text/javascript"});return window.URL.createObjectURL(t)}(n)}function y(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");if(!d){let e=0n;do{e=c(h(n,!0))}while(!b(e,t));return new Promise((n=>{n(e)}))}return new Promise(((e,r)=>{const i=[],o=(r,o)=>{if(r._bcu.isPrime){for(let n=0;n<i.length;n++)i[n].terminate();for(;i.length>0;)i.pop();e(r._bcu.value)}else{const e=c(h(n,!0));try{const n={_bcu:{rnd:e,iterations:t,id:r._bcu.id}};o.postMessage(n)}catch(n){}}};{const n=w();for(let t=0;t<self.navigator.hardwareConcurrency-1;t++){const t=new Worker(n);t.onmessage=n=>o(n.data,t),i.push(t)}}for(let e=0;e<i.length;e++)g(n,!0).then((function(n){const r=c(n);i[e].postMessage({_bcu:{rnd:r,iterations:t,id:e}})})).catch(r)}))}function p(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");let e=0n;do{e=c(h(n,!0))}while(!b(e,t));return e}void 0!==self.Worker&&(d=!0);class _{constructor(n,t){this.n=n,this._n2=this.n**2n,this.g=t}get bitLength(){return e(this.n)}encrypt(n,t){if(void 0===t)do{t=l(this.n)}while(1n!==i(t,this.n));return a(this.g,n,this._n2)*a(t,this.n,this._n2)%this._n2}addition(...n){return n.reduce(((n,t)=>n*t%this._n2),1n)}plaintextAddition(n,...t){return t.reduce(((n,t)=>n*a(this.g,t,this._n2)%this._n2),n)}multiply(n,t){return a(n,t,this._n2)}}class R{constructor(n,t,e,r,i){this.lambda=n,this.mu=t,this._p=r,this._q=i,this.publicKey=e}get bitLength(){return e(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(n){return S(a(n,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(n){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const t=this.decrypt(n),e=(this._p-1n)*(this._q-1n),r=u(this.n,e);return a(n*(1n-t*this.n)%this.publicKey._n2,r,this.n)}}function S(n,t){return(n-1n)/t}function $(n,t){return(l(n)*n+1n)*a(l(n),n,t)%t}return n.PrivateKey=R,n.PublicKey=_,n.generateRandomKeys=async function(n=3072,t=!1){let r,i,s,c,f,g;do{r=await y(Math.floor(n/2)+1),i=await y(Math.floor(n/2)),s=r*i}while(i===r||e(s)!==n);if(t)c=s+1n,f=(r-1n)*(i-1n),g=u(f,s);else{const n=s**2n;c=$(s,n),f=o(r-1n,i-1n),g=u(S(a(c,f,n),s),s)}const h=new _(s,c);return{publicKey:h,privateKey:new R(f,g,h,r,i)}},n.generateRandomKeysSync=function(n=3072,t=!1){let r,i,s,c,f,g;do{r=p(Math.floor(n/2)+1),i=p(Math.floor(n/2)),s=r*i}while(i===r||e(s)!==n);if(t)c=s+1n,f=(r-1n)*(i-1n),g=u(f,s);else{const n=s**2n;c=$(s,n),f=o(r-1n,i-1n),g=u(S(a(c,f,n),s),s)}const h=new _(s,c);return{publicKey:h,privateKey:new R(f,g,h,r,i)}},n}({});
var paillierBigint=function(n){"use strict";function t(n){return n>=0?n:-n}function e(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let t=1;do{t++}while((n>>=1n)>1n);return t}function r(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),n<=0n||t<=0n)throw new RangeError("a and b MUST be > 0");let e=0n,r=1n,i=1n,o=0n;for(;0n!==n;){const s=t/n,u=t%n,a=e-i*s,c=r-o*s;t=n,n=u,e=i,r=o,i=a,o=c}return{g:t,x:e,y:r}}function i(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),t<=0n)throw new RangeError("n must be > 0");const e=n%t;return e<0n?e+t:e}function o(n,t){const e=r(i(n,t),t);if(1n!==e.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${t.toString()}`);return i(e.x,t)}function s(n,t,e){if(n.length!==t.length)throw new RangeError("The remainders and modulos arrays should have the same length");const r=e??t.reduce(((n,t)=>n*t),1n);return t.reduce(((t,e,s)=>{const u=r/e;return i(t+u*o(u,e)%r*n[s]%r,r)}),0n)}function u(n,e){let r="number"==typeof n?BigInt(t(n)):t(n),i="number"==typeof e?BigInt(t(e)):t(e);if(0n===r)return i;if(0n===i)return r;let o=0n;for(;0n===(1n&(r|i));)r>>=1n,i>>=1n,o++;for(;0n===(1n&r);)r>>=1n;do{for(;0n===(1n&i);)i>>=1n;if(r>i){const n=r;r=i,i=n}i-=r}while(0n!==i);return r<<o}function a(n,e){return"number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),0n===n&&0n===e?BigInt(0):t(n/u(n,e)*e)}function c(n,e,r,u){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),"number"==typeof r&&(r=BigInt(r)),r<=0n)throw new RangeError("n must be > 0");if(1n===r)return 0n;if(n=i(n,r),e<0n)return o(c(n,t(e),r,u),r);if(void 0!==u)return function(n,t,e,r){const i=r.map((n=>n[0]**n[1])),o=r.map((n=>function(n){return n.map((n=>n[0]**(n[1]-1n)*(n[0]-1n))).reduce(((n,t)=>t*n),1n)}([n]))),u=o.map(((e,r)=>c(n,t%e,i[r])));return s(u,i,e)}(n,e,r,function(n){const t={};return n.forEach((n=>{if("bigint"==typeof n||"number"==typeof n){const e=String(n);void 0===t[e]?t[e]={p:BigInt(n),k:1n}:t[e].k+=1n}else{const e=String(n[0]);void 0===t[e]?t[e]={p:BigInt(n[0]),k:BigInt(n[1])}:t[e].k+=BigInt(n[1])}})),Object.values(t).map((n=>[n.p,n.k]))}(u));let a=1n;for(;e>0;)e%2n===1n&&(a=a*n%r),e/=2n,n=n**2n%r;return a}function f(n){let t=0n;for(const e of n.values())t=(t<<8n)+BigInt(e);return t}function h(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");{const e=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(e);else for(let t=0;t<Math.ceil(n/65536);t++){const r=65536*t,i=r+65535<n?r+65535:n-1;self.crypto.getRandomValues(e.subarray(r,i))}return t&&(e[0]=128|e[0]),e}}function g(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=Math.ceil(n/8),r=n%8;return new Promise(((n,i)=>{(function(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");return new Promise((function(e,r){{const r=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(r);else for(let t=0;t<Math.ceil(n/65536);t++){const e=65536*t,i=e+65535<n?e+65535:n-1;self.crypto.getRandomValues(r.subarray(e,i))}t&&(r[0]=128|r[0]),e(r)}}))})(e,!1).then((function(e){if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}n(e)}))}))}function l(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=h(Math.ceil(n/8),!1),r=n%8;if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}return e}function d(n,t=1n){if(n<=t)throw new RangeError("Arguments MUST be: max > min");const r=n-t,i=e(r);let o;do{o=f(l(i))}while(o>r);return o+t}let m=!1;function b(n,t=16,e=!1){if("number"==typeof n&&(n=BigInt(n)),n<0n)throw RangeError("w MUST be >= 0");return new Promise(((e,r)=>{const i=new Worker(y());i.onmessage=n=>{void 0!==n?.data?._bcu?.isPrime&&(i.terminate(),e(n.data._bcu.isPrime))},i.onmessageerror=n=>{r(n)};const o={_bcu:{rnd:n,iterations:t,id:0}};i.postMessage(o)}))}function p(n,t){if(2n===n)return!0;if(0n===(1n&n)||1n===n)return!1;const e=[3n,5n,7n,11n,13n,17n,19n,23n,29n,31n,37n,41n,43n,47n,53n,59n,61n,67n,71n,73n,79n,83n,89n,97n,101n,103n,107n,109n,113n,127n,131n,137n,139n,149n,151n,157n,163n,167n,173n,179n,181n,191n,193n,197n,199n,211n,223n,227n,229n,233n,239n,241n,251n,257n,263n,269n,271n,277n,281n,283n,293n,307n,311n,313n,317n,331n,337n,347n,349n,353n,359n,367n,373n,379n,383n,389n,397n,401n,409n,419n,421n,431n,433n,439n,443n,449n,457n,461n,463n,467n,479n,487n,491n,499n,503n,509n,521n,523n,541n,547n,557n,563n,569n,571n,577n,587n,593n,599n,601n,607n,613n,617n,619n,631n,641n,643n,647n,653n,659n,661n,673n,677n,683n,691n,701n,709n,719n,727n,733n,739n,743n,751n,757n,761n,769n,773n,787n,797n,809n,811n,821n,823n,827n,829n,839n,853n,857n,859n,863n,877n,881n,883n,887n,907n,911n,919n,929n,937n,941n,947n,953n,967n,971n,977n,983n,991n,997n,1009n,1013n,1019n,1021n,1031n,1033n,1039n,1049n,1051n,1061n,1063n,1069n,1087n,1091n,1093n,1097n,1103n,1109n,1117n,1123n,1129n,1151n,1153n,1163n,1171n,1181n,1187n,1193n,1201n,1213n,1217n,1223n,1229n,1231n,1237n,1249n,1259n,1277n,1279n,1283n,1289n,1291n,1297n,1301n,1303n,1307n,1319n,1321n,1327n,1361n,1367n,1373n,1381n,1399n,1409n,1423n,1427n,1429n,1433n,1439n,1447n,1451n,1453n,1459n,1471n,1481n,1483n,1487n,1489n,1493n,1499n,1511n,1523n,1531n,1543n,1549n,1553n,1559n,1567n,1571n,1579n,1583n,1597n];for(let t=0;t<e.length&&e[t]<=n;t++){const r=e[t];if(n===r)return!0;if(n%r===0n)return!1}let r=0n;const i=n-1n;let o=i;for(;o%2n===0n;)o/=2n,++r;const s=i/2n**r;do{let t=c(d(i,2n),s,n);if(1n===t||t===i)continue;let e=1;for(;e<r&&(t=c(t,2n,n),t!==i);){if(1n===t)return!1;e++}if(t!==i)return!1}while(0!=--t);return!0}function y(){let n=`\n 'use strict';\n const ${r.name} = ${r.toString()};\n const ${o.name} = ${o.toString()};\n const ${c.name} = ${c.toString()};\n const ${i.name} = ${i.toString()};\n const ${l.name} = ${l.toString()};\n const ${h.name} = ${h.toString()};\n const ${d.name} = ${d.toString()};\n const ${b.name} = ${p.toString()};\n ${e.toString()};\n ${f.toString()};`;return n+=`\n onmessage = async function(msg) {\n if (msg !== undefined && msg.data !== undefined && msg.data._bcu !== undefined && msg.data._bcu.id !== undefined && msg.data._bcu.iterations !== undefined && msg.data._bcu.rnd !== undefined) {\n const msgToParent = {\n _bcu: {\n isPrime: await ${b.name}(msg.data._bcu.rnd, msg.data._bcu.iterations),\n value: msg.data._bcu.rnd,\n id: msg.data._bcu.id\n }\n };\n postMessage(msgToParent);\n }\n }`,function(n){n=`(() => {${n}})()`;const t=new Blob([n],{type:"text/javascript"});return window.URL.createObjectURL(t)}(n)}function w(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");if(!m){let e=0n;do{e=f(l(n,!0))}while(!p(e,t));return new Promise((n=>{n(e)}))}return new Promise(((e,r)=>{const i=[],o=(r,o)=>{if(r._bcu.isPrime){for(let n=0;n<i.length;n++)i[n].terminate();for(;i.length>0;)i.pop();e(r._bcu.value)}else{const e=f(l(n,!0));try{const n={_bcu:{rnd:e,iterations:t,id:r._bcu.id}};o.postMessage(n)}catch(n){}}};{const n=y();for(let t=0;t<self.navigator.hardwareConcurrency-1;t++){const t=new Worker(n);t.onmessage=n=>o(n.data,t),i.push(t)}}for(let e=0;e<i.length;e++)g(n,!0).then((function(n){const r=f(n);i[e].postMessage({_bcu:{rnd:r,iterations:t,id:e}})})).catch(r)}))}function _(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");let e=0n;do{e=f(l(n,!0))}while(!p(e,t));return e}void 0!==self.Worker&&(m=!0);class v{constructor(n,t){this.n=n,this._n2=this.n**2n,this.g=t}get bitLength(){return e(this.n)}encrypt(n,t){if(void 0===t)do{t=d(this.n)}while(1n!==u(t,this.n));return c(this.g,n,this._n2)*c(t,this.n,this._n2)%this._n2}addition(...n){return n.reduce(((n,t)=>n*t%this._n2),1n)}plaintextAddition(n,...t){return t.reduce(((n,t)=>n*c(this.g,t,this._n2)%this._n2),n)}multiply(n,t){return c(n,t,this._n2)}}class R{constructor(n,t,e,r,i){this.lambda=n,this.mu=t,this._p=r,this._q=i,this.publicKey=e}get bitLength(){return e(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(n){return void 0!==this._p&&void 0!==this._q?S(c(n,this.lambda,this.publicKey._n2,[[this._p,2],[this._q,2]]),this.publicKey.n)*this.mu%this.publicKey.n:S(c(n,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(n){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const t=this.decrypt(n),e=(this._p-1n)*(this._q-1n),r=o(this.n,e);return c(n*(1n-t*this.n)%this.publicKey._n2,r,this.n,[[this._p,1],[this._q,1]])}}function S(n,t){return(n-1n)/t}function K(n,t){return(d(n)*n+1n)*c(d(n),n,t)%t}return n.PrivateKey=R,n.PublicKey=v,n.generateRandomKeys=async function(n=3072,t=!1){let r,i,s,u,f,h;do{r=await w(Math.floor(n/2)+1),i=await w(Math.floor(n/2)),s=r*i}while(i===r||e(s)!==n);if(t)u=s+1n,f=(r-1n)*(i-1n),h=o(f,s);else{const n=s**2n;u=K(s,n),f=a(r-1n,i-1n),h=o(S(c(u,f,n),s),s)}const g=new v(s,u);return{publicKey:g,privateKey:new R(f,h,g,r,i)}},n.generateRandomKeysSync=function(n=3072,t=!1){let r,i,s,u,f,h;do{r=_(Math.floor(n/2)+1),i=_(Math.floor(n/2)),s=r*i}while(i===r||e(s)!==n);if(t)u=s+1n,f=(r-1n)*(i-1n),h=o(f,s);else{const n=s**2n;u=K(s,n),f=a(r-1n,i-1n),h=o(S(c(u,f,n),s),s)}const g=new v(s,u);return{publicKey:g,privateKey:new R(f,h,g,r,i)}},n}({});

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

!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((n="undefined"!=typeof globalThis?globalThis:n||self).paillierBigint={})}(this,(function(n){"use strict";function t(n){return n>=0?n:-n}function e(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let t=1;do{t++}while((n>>=1n)>1n);return t}function r(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),n<=0n||t<=0n)throw new RangeError("a and b MUST be > 0");let e=0n,r=1n,i=1n,o=0n;for(;0n!==n;){const s=t/n,u=t%n,a=e-i*s,c=r-o*s;t=n,n=u,e=i,r=o,i=a,o=c}return{g:t,x:e,y:r}}function i(n,e){let r="number"==typeof n?BigInt(t(n)):t(n),i="number"==typeof e?BigInt(t(e)):t(e);if(0n===r)return i;if(0n===i)return r;let o=0n;for(;0n===(1n&(r|i));)r>>=1n,i>>=1n,o++;for(;0n===(1n&r);)r>>=1n;do{for(;0n===(1n&i);)i>>=1n;if(r>i){const n=r;r=i,i=n}i-=r}while(0n!==i);return r<<o}function o(n,e){return"number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),0n===n&&0n===e?BigInt(0):t(n/i(n,e)*e)}function s(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),t<=0n)throw new RangeError("n must be > 0");const e=n%t;return e<0n?e+t:e}function u(n,t){const e=r(s(n,t),t);if(1n!==e.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${t.toString()}`);return s(e.x,t)}function a(n,e,r){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),"number"==typeof r&&(r=BigInt(r)),r<=0n)throw new RangeError("n must be > 0");if(1n===r)return 0n;if(n=s(n,r),e<0n)return u(a(n,t(e),r),r);let i=1n;for(;e>0;)e%2n===1n&&(i=i*n%r),e/=2n,n=n**2n%r;return i}function c(n){let t=0n;for(const e of n.values())t=(t<<8n)+BigInt(e);return t}function f(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");{const e=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(e);else for(let t=0;t<Math.ceil(n/65536);t++){const r=65536*t,i=r+65535<n?r+65535:n-1;self.crypto.getRandomValues(e.subarray(r,i))}return t&&(e[0]=128|e[0]),e}}function g(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=Math.ceil(n/8),r=n%8;return new Promise(((n,i)=>{(function(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");return new Promise((function(e,r){{const r=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(r);else for(let t=0;t<Math.ceil(n/65536);t++){const e=65536*t,i=e+65535<n?e+65535:n-1;self.crypto.getRandomValues(r.subarray(e,i))}t&&(r[0]=128|r[0]),e(r)}}))})(e,!1).then((function(e){if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}n(e)}))}))}function h(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=f(Math.ceil(n/8),!1),r=n%8;if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}return e}function l(n,t=1n){if(n<=t)throw new RangeError("Arguments MUST be: max > min");const r=n-t,i=e(r);let o;do{o=c(h(i))}while(o>r);return o+t}let d=!1;function m(n,t=16,e=!1){if("number"==typeof n&&(n=BigInt(n)),n<0n)throw RangeError("w MUST be >= 0");return new Promise(((e,r)=>{const i=new Worker(y());i.onmessage=n=>{void 0!==n?.data?._bcu?.isPrime&&(i.terminate(),e(n.data._bcu.isPrime))},i.onmessageerror=n=>{r(n)};const o={_bcu:{rnd:n,iterations:t,id:0}};i.postMessage(o)}))}function b(n,t){if(2n===n)return!0;if(0n===(1n&n)||1n===n)return!1;const e=[3n,5n,7n,11n,13n,17n,19n,23n,29n,31n,37n,41n,43n,47n,53n,59n,61n,67n,71n,73n,79n,83n,89n,97n,101n,103n,107n,109n,113n,127n,131n,137n,139n,149n,151n,157n,163n,167n,173n,179n,181n,191n,193n,197n,199n,211n,223n,227n,229n,233n,239n,241n,251n,257n,263n,269n,271n,277n,281n,283n,293n,307n,311n,313n,317n,331n,337n,347n,349n,353n,359n,367n,373n,379n,383n,389n,397n,401n,409n,419n,421n,431n,433n,439n,443n,449n,457n,461n,463n,467n,479n,487n,491n,499n,503n,509n,521n,523n,541n,547n,557n,563n,569n,571n,577n,587n,593n,599n,601n,607n,613n,617n,619n,631n,641n,643n,647n,653n,659n,661n,673n,677n,683n,691n,701n,709n,719n,727n,733n,739n,743n,751n,757n,761n,769n,773n,787n,797n,809n,811n,821n,823n,827n,829n,839n,853n,857n,859n,863n,877n,881n,883n,887n,907n,911n,919n,929n,937n,941n,947n,953n,967n,971n,977n,983n,991n,997n,1009n,1013n,1019n,1021n,1031n,1033n,1039n,1049n,1051n,1061n,1063n,1069n,1087n,1091n,1093n,1097n,1103n,1109n,1117n,1123n,1129n,1151n,1153n,1163n,1171n,1181n,1187n,1193n,1201n,1213n,1217n,1223n,1229n,1231n,1237n,1249n,1259n,1277n,1279n,1283n,1289n,1291n,1297n,1301n,1303n,1307n,1319n,1321n,1327n,1361n,1367n,1373n,1381n,1399n,1409n,1423n,1427n,1429n,1433n,1439n,1447n,1451n,1453n,1459n,1471n,1481n,1483n,1487n,1489n,1493n,1499n,1511n,1523n,1531n,1543n,1549n,1553n,1559n,1567n,1571n,1579n,1583n,1597n];for(let t=0;t<e.length&&e[t]<=n;t++){const r=e[t];if(n===r)return!0;if(n%r===0n)return!1}let r=0n;const i=n-1n;let o=i;for(;o%2n===0n;)o/=2n,++r;const s=i/2n**r;do{let t=a(l(i,2n),s,n);if(1n===t||t===i)continue;let e=1;for(;e<r&&(t=a(t,2n,n),t!==i);){if(1n===t)return!1;e++}if(t!==i)return!1}while(0!=--t);return!0}function y(){let n=`\n 'use strict';\n const ${r.name} = ${r.toString()};\n const ${u.name} = ${u.toString()};\n const ${a.name} = ${a.toString()};\n const ${s.name} = ${s.toString()};\n const ${h.name} = ${h.toString()};\n const ${f.name} = ${f.toString()};\n const ${l.name} = ${l.toString()};\n const ${m.name} = ${b.toString()};\n ${e.toString()};\n ${c.toString()};`;return n+=`\n onmessage = async function(msg) {\n if (msg !== undefined && msg.data !== undefined && msg.data._bcu !== undefined && msg.data._bcu.id !== undefined && msg.data._bcu.iterations !== undefined && msg.data._bcu.rnd !== undefined) {\n const msgToParent = {\n _bcu: {\n isPrime: await ${m.name}(msg.data._bcu.rnd, msg.data._bcu.iterations),\n value: msg.data._bcu.rnd,\n id: msg.data._bcu.id\n }\n };\n postMessage(msgToParent);\n }\n }`,function(n){n=`(() => {${n}})()`;const t=new Blob([n],{type:"text/javascript"});return window.URL.createObjectURL(t)}(n)}function p(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");if(!d){let e=0n;do{e=c(h(n,!0))}while(!b(e,t));return new Promise((n=>{n(e)}))}return new Promise(((e,r)=>{const i=[],o=(r,o)=>{if(r._bcu.isPrime){for(let n=0;n<i.length;n++)i[n].terminate();for(;i.length>0;)i.pop();e(r._bcu.value)}else{const e=c(h(n,!0));try{const n={_bcu:{rnd:e,iterations:t,id:r._bcu.id}};o.postMessage(n)}catch(n){}}};{const n=y();for(let t=0;t<self.navigator.hardwareConcurrency-1;t++){const t=new Worker(n);t.onmessage=n=>o(n.data,t),i.push(t)}}for(let e=0;e<i.length;e++)g(n,!0).then((function(n){const r=c(n);i[e].postMessage({_bcu:{rnd:r,iterations:t,id:e}})})).catch(r)}))}function w(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");let e=0n;do{e=c(h(n,!0))}while(!b(e,t));return e}void 0!==self.Worker&&(d=!0);class _{constructor(n,t){this.n=n,this._n2=this.n**2n,this.g=t}get bitLength(){return e(this.n)}encrypt(n,t){if(void 0===t)do{t=l(this.n)}while(1n!==i(t,this.n));return a(this.g,n,this._n2)*a(t,this.n,this._n2)%this._n2}addition(...n){return n.reduce(((n,t)=>n*t%this._n2),1n)}plaintextAddition(n,...t){return t.reduce(((n,t)=>n*a(this.g,t,this._n2)%this._n2),n)}multiply(n,t){return a(n,t,this._n2)}}class R{constructor(n,t,e,r,i){this.lambda=n,this.mu=t,this._p=r,this._q=i,this.publicKey=e}get bitLength(){return e(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(n){return S(a(n,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(n){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const t=this.decrypt(n),e=(this._p-1n)*(this._q-1n),r=u(this.n,e);return a(n*(1n-t*this.n)%this.publicKey._n2,r,this.n)}}function S(n,t){return(n-1n)/t}function $(n,t){return(l(n)*n+1n)*a(l(n),n,t)%t}n.PrivateKey=R,n.PublicKey=_,n.generateRandomKeys=async function(n=3072,t=!1){let r,i,s,c,f,g;do{r=await p(Math.floor(n/2)+1),i=await p(Math.floor(n/2)),s=r*i}while(i===r||e(s)!==n);if(t)c=s+1n,f=(r-1n)*(i-1n),g=u(f,s);else{const n=s**2n;c=$(s,n),f=o(r-1n,i-1n),g=u(S(a(c,f,n),s),s)}const h=new _(s,c);return{publicKey:h,privateKey:new R(f,g,h,r,i)}},n.generateRandomKeysSync=function(n=3072,t=!1){let r,i,s,c,f,g;do{r=w(Math.floor(n/2)+1),i=w(Math.floor(n/2)),s=r*i}while(i===r||e(s)!==n);if(t)c=s+1n,f=(r-1n)*(i-1n),g=u(f,s);else{const n=s**2n;c=$(s,n),f=o(r-1n,i-1n),g=u(S(a(c,f,n),s),s)}const h=new _(s,c);return{publicKey:h,privateKey:new R(f,g,h,r,i)}}}));
!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((n="undefined"!=typeof globalThis?globalThis:n||self).paillierBigint={})}(this,(function(n){"use strict";function t(n){return n>=0?n:-n}function e(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let t=1;do{t++}while((n>>=1n)>1n);return t}function r(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),n<=0n||t<=0n)throw new RangeError("a and b MUST be > 0");let e=0n,r=1n,i=1n,o=0n;for(;0n!==n;){const s=t/n,u=t%n,c=e-i*s,a=r-o*s;t=n,n=u,e=i,r=o,i=c,o=a}return{g:t,x:e,y:r}}function i(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),t<=0n)throw new RangeError("n must be > 0");const e=n%t;return e<0n?e+t:e}function o(n,t){const e=r(i(n,t),t);if(1n!==e.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${t.toString()}`);return i(e.x,t)}function s(n,t,e){if(n.length!==t.length)throw new RangeError("The remainders and modulos arrays should have the same length");const r=e??t.reduce(((n,t)=>n*t),1n);return t.reduce(((t,e,s)=>{const u=r/e;return i(t+u*o(u,e)%r*n[s]%r,r)}),0n)}function u(n,e){let r="number"==typeof n?BigInt(t(n)):t(n),i="number"==typeof e?BigInt(t(e)):t(e);if(0n===r)return i;if(0n===i)return r;let o=0n;for(;0n===(1n&(r|i));)r>>=1n,i>>=1n,o++;for(;0n===(1n&r);)r>>=1n;do{for(;0n===(1n&i);)i>>=1n;if(r>i){const n=r;r=i,i=n}i-=r}while(0n!==i);return r<<o}function c(n,e){return"number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),0n===n&&0n===e?BigInt(0):t(n/u(n,e)*e)}function a(n,e,r,u){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),"number"==typeof r&&(r=BigInt(r)),r<=0n)throw new RangeError("n must be > 0");if(1n===r)return 0n;if(n=i(n,r),e<0n)return o(a(n,t(e),r,u),r);if(void 0!==u)return function(n,t,e,r){const i=r.map((n=>n[0]**n[1])),o=r.map((n=>function(n){return n.map((n=>n[0]**(n[1]-1n)*(n[0]-1n))).reduce(((n,t)=>t*n),1n)}([n]))),u=o.map(((e,r)=>a(n,t%e,i[r])));return s(u,i,e)}(n,e,r,function(n){const t={};return n.forEach((n=>{if("bigint"==typeof n||"number"==typeof n){const e=String(n);void 0===t[e]?t[e]={p:BigInt(n),k:1n}:t[e].k+=1n}else{const e=String(n[0]);void 0===t[e]?t[e]={p:BigInt(n[0]),k:BigInt(n[1])}:t[e].k+=BigInt(n[1])}})),Object.values(t).map((n=>[n.p,n.k]))}(u));let c=1n;for(;e>0;)e%2n===1n&&(c=c*n%r),e/=2n,n=n**2n%r;return c}function f(n){let t=0n;for(const e of n.values())t=(t<<8n)+BigInt(e);return t}function h(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");{const e=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(e);else for(let t=0;t<Math.ceil(n/65536);t++){const r=65536*t,i=r+65535<n?r+65535:n-1;self.crypto.getRandomValues(e.subarray(r,i))}return t&&(e[0]=128|e[0]),e}}function g(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=Math.ceil(n/8),r=n%8;return new Promise(((n,i)=>{(function(n,t=!1){if(n<1)throw new RangeError("byteLength MUST be > 0");return new Promise((function(e,r){{const r=new Uint8Array(n);if(n<=65536)self.crypto.getRandomValues(r);else for(let t=0;t<Math.ceil(n/65536);t++){const e=65536*t,i=e+65535<n?e+65535:n-1;self.crypto.getRandomValues(r.subarray(e,i))}t&&(r[0]=128|r[0]),e(r)}}))})(e,!1).then((function(e){if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}n(e)}))}))}function l(n,t=!1){if(n<1)throw new RangeError("bitLength MUST be > 0");const e=h(Math.ceil(n/8),!1),r=n%8;if(0!==r&&(e[0]=e[0]&2**r-1),t){const n=0!==r?2**(r-1):128;e[0]=e[0]|n}return e}function d(n,t=1n){if(n<=t)throw new RangeError("Arguments MUST be: max > min");const r=n-t,i=e(r);let o;do{o=f(l(i))}while(o>r);return o+t}let m=!1;function b(n,t=16,e=!1){if("number"==typeof n&&(n=BigInt(n)),n<0n)throw RangeError("w MUST be >= 0");return new Promise(((e,r)=>{const i=new Worker(y());i.onmessage=n=>{void 0!==n?.data?._bcu?.isPrime&&(i.terminate(),e(n.data._bcu.isPrime))},i.onmessageerror=n=>{r(n)};const o={_bcu:{rnd:n,iterations:t,id:0}};i.postMessage(o)}))}function p(n,t){if(2n===n)return!0;if(0n===(1n&n)||1n===n)return!1;const e=[3n,5n,7n,11n,13n,17n,19n,23n,29n,31n,37n,41n,43n,47n,53n,59n,61n,67n,71n,73n,79n,83n,89n,97n,101n,103n,107n,109n,113n,127n,131n,137n,139n,149n,151n,157n,163n,167n,173n,179n,181n,191n,193n,197n,199n,211n,223n,227n,229n,233n,239n,241n,251n,257n,263n,269n,271n,277n,281n,283n,293n,307n,311n,313n,317n,331n,337n,347n,349n,353n,359n,367n,373n,379n,383n,389n,397n,401n,409n,419n,421n,431n,433n,439n,443n,449n,457n,461n,463n,467n,479n,487n,491n,499n,503n,509n,521n,523n,541n,547n,557n,563n,569n,571n,577n,587n,593n,599n,601n,607n,613n,617n,619n,631n,641n,643n,647n,653n,659n,661n,673n,677n,683n,691n,701n,709n,719n,727n,733n,739n,743n,751n,757n,761n,769n,773n,787n,797n,809n,811n,821n,823n,827n,829n,839n,853n,857n,859n,863n,877n,881n,883n,887n,907n,911n,919n,929n,937n,941n,947n,953n,967n,971n,977n,983n,991n,997n,1009n,1013n,1019n,1021n,1031n,1033n,1039n,1049n,1051n,1061n,1063n,1069n,1087n,1091n,1093n,1097n,1103n,1109n,1117n,1123n,1129n,1151n,1153n,1163n,1171n,1181n,1187n,1193n,1201n,1213n,1217n,1223n,1229n,1231n,1237n,1249n,1259n,1277n,1279n,1283n,1289n,1291n,1297n,1301n,1303n,1307n,1319n,1321n,1327n,1361n,1367n,1373n,1381n,1399n,1409n,1423n,1427n,1429n,1433n,1439n,1447n,1451n,1453n,1459n,1471n,1481n,1483n,1487n,1489n,1493n,1499n,1511n,1523n,1531n,1543n,1549n,1553n,1559n,1567n,1571n,1579n,1583n,1597n];for(let t=0;t<e.length&&e[t]<=n;t++){const r=e[t];if(n===r)return!0;if(n%r===0n)return!1}let r=0n;const i=n-1n;let o=i;for(;o%2n===0n;)o/=2n,++r;const s=i/2n**r;do{let t=a(d(i,2n),s,n);if(1n===t||t===i)continue;let e=1;for(;e<r&&(t=a(t,2n,n),t!==i);){if(1n===t)return!1;e++}if(t!==i)return!1}while(0!=--t);return!0}function y(){let n=`\n 'use strict';\n const ${r.name} = ${r.toString()};\n const ${o.name} = ${o.toString()};\n const ${a.name} = ${a.toString()};\n const ${i.name} = ${i.toString()};\n const ${l.name} = ${l.toString()};\n const ${h.name} = ${h.toString()};\n const ${d.name} = ${d.toString()};\n const ${b.name} = ${p.toString()};\n ${e.toString()};\n ${f.toString()};`;return n+=`\n onmessage = async function(msg) {\n if (msg !== undefined && msg.data !== undefined && msg.data._bcu !== undefined && msg.data._bcu.id !== undefined && msg.data._bcu.iterations !== undefined && msg.data._bcu.rnd !== undefined) {\n const msgToParent = {\n _bcu: {\n isPrime: await ${b.name}(msg.data._bcu.rnd, msg.data._bcu.iterations),\n value: msg.data._bcu.rnd,\n id: msg.data._bcu.id\n }\n };\n postMessage(msgToParent);\n }\n }`,function(n){n=`(() => {${n}})()`;const t=new Blob([n],{type:"text/javascript"});return window.URL.createObjectURL(t)}(n)}function w(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");if(!m){let e=0n;do{e=f(l(n,!0))}while(!p(e,t));return new Promise((n=>{n(e)}))}return new Promise(((e,r)=>{const i=[],o=(r,o)=>{if(r._bcu.isPrime){for(let n=0;n<i.length;n++)i[n].terminate();for(;i.length>0;)i.pop();e(r._bcu.value)}else{const e=f(l(n,!0));try{const n={_bcu:{rnd:e,iterations:t,id:r._bcu.id}};o.postMessage(n)}catch(n){}}};{const n=y();for(let t=0;t<self.navigator.hardwareConcurrency-1;t++){const t=new Worker(n);t.onmessage=n=>o(n.data,t),i.push(t)}}for(let e=0;e<i.length;e++)g(n,!0).then((function(n){const r=f(n);i[e].postMessage({_bcu:{rnd:r,iterations:t,id:e}})})).catch(r)}))}function _(n,t=16){if(n<1)throw new RangeError("bitLength MUST be > 0");let e=0n;do{e=f(l(n,!0))}while(!p(e,t));return e}void 0!==self.Worker&&(m=!0);class v{constructor(n,t){this.n=n,this._n2=this.n**2n,this.g=t}get bitLength(){return e(this.n)}encrypt(n,t){if(void 0===t)do{t=d(this.n)}while(1n!==u(t,this.n));return a(this.g,n,this._n2)*a(t,this.n,this._n2)%this._n2}addition(...n){return n.reduce(((n,t)=>n*t%this._n2),1n)}plaintextAddition(n,...t){return t.reduce(((n,t)=>n*a(this.g,t,this._n2)%this._n2),n)}multiply(n,t){return a(n,t,this._n2)}}class R{constructor(n,t,e,r,i){this.lambda=n,this.mu=t,this._p=r,this._q=i,this.publicKey=e}get bitLength(){return e(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(n){return void 0!==this._p&&void 0!==this._q?S(a(n,this.lambda,this.publicKey._n2,[[this._p,2],[this._q,2]]),this.publicKey.n)*this.mu%this.publicKey.n:S(a(n,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(n){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const t=this.decrypt(n),e=(this._p-1n)*(this._q-1n),r=o(this.n,e);return a(n*(1n-t*this.n)%this.publicKey._n2,r,this.n,[[this._p,1],[this._q,1]])}}function S(n,t){return(n-1n)/t}function K(n,t){return(d(n)*n+1n)*a(d(n),n,t)%t}n.PrivateKey=R,n.PublicKey=v,n.generateRandomKeys=async function(n=3072,t=!1){let r,i,s,u,f,h;do{r=await w(Math.floor(n/2)+1),i=await w(Math.floor(n/2)),s=r*i}while(i===r||e(s)!==n);if(t)u=s+1n,f=(r-1n)*(i-1n),h=o(f,s);else{const n=s**2n;u=K(s,n),f=c(r-1n,i-1n),h=o(S(a(u,f,n),s),s)}const g=new v(s,u);return{publicKey:g,privateKey:new R(f,h,g,r,i)}},n.generateRandomKeysSync=function(n=3072,t=!1){let r,i,s,u,f,h;do{r=_(Math.floor(n/2)+1),i=_(Math.floor(n/2)),s=r*i}while(i===r||e(s)!==n);if(t)u=s+1n,f=(r-1n)*(i-1n),h=o(f,s);else{const n=s**2n;u=K(s,n),f=c(r-1n,i-1n),h=o(S(a(u,f,n),s),s)}const g=new v(s,u);return{publicKey:g,privateKey:new R(f,h,g,r,i)}}}));

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

import*as t from"bigint-crypto-utils";class n{constructor(t,n){this.n=t,this._n2=this.n**2n,this.g=n}get bitLength(){return t.bitLength(this.n)}encrypt(n,i){if(void 0===i)do{i=t.randBetween(this.n)}while(1n!==t.gcd(i,this.n));return t.modPow(this.g,n,this._n2)*t.modPow(i,this.n,this._n2)%this._n2}addition(...t){return t.reduce(((t,n)=>t*n%this._n2),1n)}plaintextAddition(n,...i){return i.reduce(((n,i)=>n*t.modPow(this.g,i,this._n2)%this._n2),n)}multiply(n,i){return t.modPow(n,i,this._n2)}}class i{constructor(t,n,i,e,o){this.lambda=t,this.mu=n,this._p=e,this._q=o,this.publicKey=i}get bitLength(){return t.bitLength(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(n){return e(t.modPow(n,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(n){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const i=this.decrypt(n),e=(this._p-1n)*(this._q-1n),o=t.modInv(this.n,e),r=n*(1n-i*this.n)%this.publicKey._n2;return t.modPow(r,o,this.n)}}function e(t,n){return(t-1n)/n}async function o(o=3072,r=!1){let h,c,u,d,a,l;do{h=await t.prime(Math.floor(o/2)+1),c=await t.prime(Math.floor(o/2)),u=h*c}while(c===h||t.bitLength(u)!==o);if(r)d=u+1n,a=(h-1n)*(c-1n),l=t.modInv(a,u);else{const n=u**2n;d=s(u,n),a=t.lcm(h-1n,c-1n),l=t.modInv(e(t.modPow(d,a,n),u),u)}const m=new n(u,d);return{publicKey:m,privateKey:new i(a,l,m,h,c)}}function r(o=3072,r=!1){let h,c,u,d,a,l;do{h=t.primeSync(Math.floor(o/2)+1),c=t.primeSync(Math.floor(o/2)),u=h*c}while(c===h||t.bitLength(u)!==o);if(r)d=u+1n,a=(h-1n)*(c-1n),l=t.modInv(a,u);else{const n=u**2n;d=s(u,n),a=t.lcm(h-1n,c-1n),l=t.modInv(e(t.modPow(d,a,n),u),u)}const m=new n(u,d);return{publicKey:m,privateKey:new i(a,l,m,h,c)}}function s(n,i){const e=t.randBetween(n),o=t.randBetween(n);return(e*n+1n)*t.modPow(o,n,i)%i}export{i as PrivateKey,n as PublicKey,o as generateRandomKeys,r as generateRandomKeysSync};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguYnJvd3Nlci5lc20uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy90cy9QdWJsaWNLZXkudHMiLCIuLi9zcmMvdHMvUHJpdmF0ZUtleS50cyIsIi4uL3NyYy90cy9nZW5lcmF0ZVJhbmRvbUtleXMudHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbIlB1YmxpY0tleSIsImNvbnN0cnVjdG9yIiwibiIsImciLCJ0aGlzIiwiX24yIiwiYml0TGVuZ3RoIiwiYmN1IiwiZW5jcnlwdCIsIm0iLCJyIiwidW5kZWZpbmVkIiwicmFuZEJldHdlZW4iLCJnY2QiLCJtb2RQb3ciLCJhZGRpdGlvbiIsImNpcGhlcnRleHRzIiwicmVkdWNlIiwic3VtIiwibmV4dCIsInBsYWludGV4dEFkZGl0aW9uIiwiY2lwaGVydGV4dCIsInBsYWludGV4dHMiLCJtdWx0aXBseSIsImMiLCJrIiwiUHJpdmF0ZUtleSIsImxhbWJkYSIsIm11IiwicHVibGljS2V5IiwicCIsInEiLCJfcCIsIl9xIiwiZGVjcnlwdCIsIkwiLCJnZXRSYW5kb21GYWN0b3IiLCJSYW5nZUVycm9yIiwiRXJyb3IiLCJwaGkiLCJuSW52TW9kUGhpIiwibW9kSW52IiwiYzEiLCJhIiwiYXN5bmMiLCJnZW5lcmF0ZVJhbmRvbUtleXMiLCJiaXRsZW5ndGgiLCJzaW1wbGVWYXJpYW50IiwicHJpbWUiLCJNYXRoIiwiZmxvb3IiLCJuMiIsImdldEdlbmVyYXRvciIsImxjbSIsInByaXZhdGVLZXkiLCJnZW5lcmF0ZVJhbmRvbUtleXNTeW5jIiwicHJpbWVTeW5jIiwiYWxwaGEiLCJiZXRhIl0sIm1hcHBpbmdzIjoic0NBS2MsTUFBT0EsRUFXbkJDLFlBQWFDLEVBQVdDLEdBQ3RCQyxLQUFLRixFQUFJQSxFQUNURSxLQUFLQyxJQUFNRCxLQUFLRixHQUFLLEdBQ3JCRSxLQUFLRCxFQUFJQSxDQUNWLENBTUdHLGdCQUNGLE9BQU9DLEVBQUlELFVBQVVGLEtBQUtGLEVBQzNCLENBVURNLFFBQVNDLEVBQVdD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
import*as t from"bigint-crypto-utils";class n{constructor(t,n){this.n=t,this._n2=this.n**2n,this.g=n}get bitLength(){return t.bitLength(this.n)}encrypt(n,i){if(void 0===i)do{i=t.randBetween(this.n)}while(1n!==t.gcd(i,this.n));return t.modPow(this.g,n,this._n2)*t.modPow(i,this.n,this._n2)%this._n2}addition(...t){return t.reduce(((t,n)=>t*n%this._n2),1n)}plaintextAddition(n,...i){return i.reduce(((n,i)=>n*t.modPow(this.g,i,this._n2)%this._n2),n)}multiply(n,i){return t.modPow(n,i,this._n2)}}class i{constructor(t,n,i,e,o){this.lambda=t,this.mu=n,this._p=e,this._q=o,this.publicKey=i}get bitLength(){return t.bitLength(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(n){return void 0!==this._p&&void 0!==this._q?e(t.modPow(n,this.lambda,this.publicKey._n2,[[this._p,2],[this._q,2]]),this.publicKey.n)*this.mu%this.publicKey.n:e(t.modPow(n,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(n){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const i=this.decrypt(n),e=(this._p-1n)*(this._q-1n),o=t.modInv(this.n,e),s=n*(1n-i*this.n)%this.publicKey._n2;return t.modPow(s,o,this.n,[[this._p,1],[this._q,1]])}}function e(t,n){return(t-1n)/n}async function o(o=3072,s=!1){let h,c,u,d,a,l;do{h=await t.prime(Math.floor(o/2)+1),c=await t.prime(Math.floor(o/2)),u=h*c}while(c===h||t.bitLength(u)!==o);if(s)d=u+1n,a=(h-1n)*(c-1n),l=t.modInv(a,u);else{const n=u**2n;d=r(u,n),a=t.lcm(h-1n,c-1n),l=t.modInv(e(t.modPow(d,a,n),u),u)}const p=new n(u,d);return{publicKey:p,privateKey:new i(a,l,p,h,c)}}function s(o=3072,s=!1){let h,c,u,d,a,l;do{h=t.primeSync(Math.floor(o/2)+1),c=t.primeSync(Math.floor(o/2)),u=h*c}while(c===h||t.bitLength(u)!==o);if(s)d=u+1n,a=(h-1n)*(c-1n),l=t.modInv(a,u);else{const n=u**2n;d=r(u,n),a=t.lcm(h-1n,c-1n),l=t.modInv(e(t.modPow(d,a,n),u),u)}const p=new n(u,d);return{publicKey:p,privateKey:new i(a,l,p,h,c)}}function r(n,i){const e=t.randBetween(n),o=t.randBetween(n);return(e*n+1n)*t.modPow(o,n,i)%i}export{i as PrivateKey,n as PublicKey,o as generateRandomKeys,s as generateRandomKeysSync};

@@ -0,1 +1,4 @@

/**
* Class for a Paillier public key
*/
declare class PublicKey {

@@ -5,10 +8,53 @@ readonly n: bigint;

readonly _n2: bigint;
/**
* Creates an instance of class PublicKey
* @param n - The public modulo
* @param g - The public generator
*/
constructor(n: bigint, g: bigint);
/**
* Get the bit length of the public modulo
* @returns The bit length of the public modulo
*/
get bitLength(): number;
/**
* 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: bigint, r?: bigint): bigint;
/**
* 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: bigint[]): bigint;
/**
* 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: bigint, ...plaintexts: bigint[]): bigint;
/**
* 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: bigint, k: bigint | number): bigint;
}
/**
* Class for Paillier private keys.
*/
declare class PrivateKey {

@@ -20,6 +66,47 @@ readonly lambda: bigint;

private readonly _q?;
/**
* Creates an instance of class PrivateKey
*
* @param lambda
* @param mu
* @param publicKey
* @param p - a big prime
* @param q- a big prime
*/
constructor(lambda: bigint, mu: bigint, publicKey: PublicKey, p?: bigint, q?: bigint);
/**
* Get the bit length of the public modulo
* @returns The bit length of the public modulo
*/
get bitLength(): number;
/**
* Get the public modulo n=p·q
* @returns The public modulo n=p·q
*/
get n(): bigint;
/**
* Paillier private-key decryption
*
* @param c - A bigint encrypted with the public key
*
* @returns The decryption of c with this private key
*/
decrypt(c: bigint): bigint;
/**
* 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: bigint): bigint;

@@ -32,5 +119,22 @@ }

}
/**
* 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
*/
declare function generateRandomKeys(bitlength?: number, simpleVariant?: boolean): Promise<KeyPair>;
/**
* 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
*/
declare function generateRandomKeysSync(bitlength?: number, simpleVariant?: boolean): KeyPair;
export { KeyPair, PrivateKey, PublicKey, generateRandomKeys, generateRandomKeysSync };

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

"use strict";function t(t){var n=Object.create(null);return t&&Object.keys(t).forEach((function(e){if("default"!==e){var i=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(n,e,i.get?i:{enumerable:!0,get:function(){return t[e]}})}})),n.default=t,Object.freeze(n)}var n=t(require("bigint-crypto-utils"));class e{constructor(t,n){this.n=t,this._n2=this.n**2n,this.g=n}get bitLength(){return n.bitLength(this.n)}encrypt(t,e){if(void 0===e)do{e=n.randBetween(this.n)}while(1n!==n.gcd(e,this.n));return n.modPow(this.g,t,this._n2)*n.modPow(e,this.n,this._n2)%this._n2}addition(...t){return t.reduce(((t,n)=>t*n%this._n2),1n)}plaintextAddition(t,...e){return e.reduce(((t,e)=>t*n.modPow(this.g,e,this._n2)%this._n2),t)}multiply(t,e){return n.modPow(t,e,this._n2)}}class i{constructor(t,n,e,i,r){this.lambda=t,this.mu=n,this._p=i,this._q=r,this.publicKey=e}get bitLength(){return n.bitLength(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(t){return r(n.modPow(t,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(t){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const e=this.decrypt(t),i=(this._p-1n)*(this._q-1n),r=n.modInv(this.n,i),o=t*(1n-e*this.n)%this.publicKey._n2;return n.modPow(o,r,this.n)}}function r(t,n){return(t-1n)/n}function o(t,e){const i=n.randBetween(t),r=n.randBetween(t);return(i*t+1n)*n.modPow(r,t,e)%e}exports.PrivateKey=i,exports.PublicKey=e,exports.generateRandomKeys=async function(t=3072,s=!1){let h,c,u,a,d,l;do{h=await n.prime(Math.floor(t/2)+1),c=await n.prime(Math.floor(t/2)),u=h*c}while(c===h||n.bitLength(u)!==t);if(s)a=u+1n,d=(h-1n)*(c-1n),l=n.modInv(d,u);else{const t=u**2n;a=o(u,t),d=n.lcm(h-1n,c-1n),l=n.modInv(r(n.modPow(a,d,t),u),u)}const p=new e(u,a);return{publicKey:p,privateKey:new i(d,l,p,h,c)}},exports.generateRandomKeysSync=function(t=3072,s=!1){let h,c,u,a,d,l;do{h=n.primeSync(Math.floor(t/2)+1),c=n.primeSync(Math.floor(t/2)),u=h*c}while(c===h||n.bitLength(u)!==t);if(s)a=u+1n,d=(h-1n)*(c-1n),l=n.modInv(d,u);else{const t=u**2n;a=o(u,t),d=n.lcm(h-1n,c-1n),l=n.modInv(r(n.modPow(a,d,t),u),u)}const p=new e(u,a);return{publicKey:p,privateKey:new i(d,l,p,h,c)}};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubm9kZS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy90cy9QdWJsaWNLZXkudHMiLCIuLi9zcmMvdHMvUHJpdmF0ZUtleS50cyIsIi4uL3NyYy90cy9nZW5lcmF0ZVJhbmRvbUtleXMudHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbIlB1YmxpY0tleSIsImNvbnN0cnVjdG9yIiwibiIsImciLCJ0aGlzIiwiX24yIiwiYml0TGVuZ3RoIiwiYmN1IiwiZW5jcnlwdCIsIm0iLCJyIiwidW5kZWZpbmVkIiwicmFuZEJldHdlZW4iLCJnY2QiLCJtb2RQb3ciLCJhZGRpdGlvbiIsImNpcGhlcnRleHRzIiwicmVkdWNlIiwic3VtIiwibmV4dCIsInBsYWludGV4dEFkZGl0aW9uIiwiY2lwaGVydGV4dCIsInBsYWludGV4dHMiLCJtdWx0aXBseSIsImMiLCJrIiwiUHJpdmF0ZUtleSIsImxhbWJkYSIsIm11IiwicHVibGljS2V5IiwicCIsInEiLCJfcCIsIl9xIiwiZGVjcnlwdCIsIkwiLCJnZXRSYW5kb21GYWN0b3IiLCJSYW5nZUVycm9yIiwiRXJyb3IiLCJwaGkiLCJuSW52TW9kUGhpIiwibW9kSW52IiwiYzEiLCJhIiwiZ2V0R2VuZXJhdG9yIiwibjIiLCJhbHBoYSIsImJldGEiLCJhc3luYyIsImJpdGxlbmd0aCIsInNpbXBsZVZhcmlhbnQiLCJwcmltZSIsIk1hdGgiLCJmbG9vciIsImxjbSIsInByaXZhdGVLZXkiLCJwcmltZVN5bmMiXSwibWFwcGluZ3MiOiJ3VEFLYyxNQUFPQSxFQVduQkMsWUFBYUMsRUFBV0MsR0FDdEJDLEtBQUtGLEVBQUlBLEVBQ1RFLEtBQUtDLElBQU1ELEtBQUtGLEdBQUssR0FDckJFLEtBQUtELEVBQUlBLENBQ1YsQ0FNR0csZ0JBQ0YsT0FBT0MsRUFBSUQsVUFBVUYsS0FBS0YsRUFDM0IsQ0FVRE0sUUFBU0MsRUFBV0MsR0FDbEIsUUFBVUMsSUFBTkQsRUFDRixHQUNFQSxFQUFJSCxFQUFJSyxZQUFZUixLQUFL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
"use strict";function t(t){if(t&&t.__esModule)return t;var n=Object.create(null);return t&&Object.keys(t).forEach((function(e){if("default"!==e){var i=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(n,e,i.get?i:{enumerable:!0,get:function(){return t[e]}})}})),n.default=t,Object.freeze(n)}var n=t(require("bigint-crypto-utils"));class e{constructor(t,n){this.n=t,this._n2=this.n**2n,this.g=n}get bitLength(){return n.bitLength(this.n)}encrypt(t,e){if(void 0===e)do{e=n.randBetween(this.n)}while(1n!==n.gcd(e,this.n));return n.modPow(this.g,t,this._n2)*n.modPow(e,this.n,this._n2)%this._n2}addition(...t){return t.reduce(((t,n)=>t*n%this._n2),1n)}plaintextAddition(t,...e){return e.reduce(((t,e)=>t*n.modPow(this.g,e,this._n2)%this._n2),t)}multiply(t,e){return n.modPow(t,e,this._n2)}}class i{constructor(t,n,e,i,r){this.lambda=t,this.mu=n,this._p=i,this._q=r,this.publicKey=e}get bitLength(){return n.bitLength(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(t){return void 0!==this._p&&void 0!==this._q?r(n.modPow(t,this.lambda,this.publicKey._n2,[[this._p,2],[this._q,2]]),this.publicKey.n)*this.mu%this.publicKey.n:r(n.modPow(t,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(t){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const e=this.decrypt(t),i=(this._p-1n)*(this._q-1n),r=n.modInv(this.n,i),o=t*(1n-e*this.n)%this.publicKey._n2;return n.modPow(o,r,this.n,[[this._p,1],[this._q,1]])}}function r(t,n){return(t-1n)/n}function o(t,e){const i=n.randBetween(t),r=n.randBetween(t);return(i*t+1n)*n.modPow(r,t,e)%e}exports.PrivateKey=i,exports.PublicKey=e,exports.generateRandomKeys=async function(t=3072,s=!1){let h,c,u,a,d,l;do{h=await n.prime(Math.floor(t/2)+1),c=await n.prime(Math.floor(t/2)),u=h*c}while(c===h||n.bitLength(u)!==t);if(s)a=u+1n,d=(h-1n)*(c-1n),l=n.modInv(d,u);else{const t=u**2n;a=o(u,t),d=n.lcm(h-1n,c-1n),l=n.modInv(r(n.modPow(a,d,t),u),u)}const p=new e(u,a);return{publicKey:p,privateKey:new i(d,l,p,h,c)}},exports.generateRandomKeysSync=function(t=3072,s=!1){let h,c,u,a,d,l;do{h=n.primeSync(Math.floor(t/2)+1),c=n.primeSync(Math.floor(t/2)),u=h*c}while(c===h||n.bitLength(u)!==t);if(s)a=u+1n,d=(h-1n)*(c-1n),l=n.modInv(d,u);else{const t=u**2n;a=o(u,t),d=n.lcm(h-1n,c-1n),l=n.modInv(r(n.modPow(a,d,t),u),u)}const p=new e(u,a);return{publicKey:p,privateKey:new i(d,l,p,h,c)}};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubm9kZS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy90cy9QdWJsaWNLZXkudHMiLCIuLi9zcmMvdHMvUHJpdmF0ZUtleS50cyIsIi4uL3NyYy90cy9nZW5lcmF0ZVJhbmRvbUtleXMudHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbIlB1YmxpY0tleSIsImNvbnN0cnVjdG9yIiwibiIsImciLCJ0aGlzIiwiX24yIiwiYml0TGVuZ3RoIiwiYmN1IiwiZW5jcnlwdCIsIm0iLCJyIiwidW5kZWZpbmVkIiwicmFuZEJldHdlZW4iLCJnY2QiLCJtb2RQb3ciLCJhZGRpdGlvbiIsImNpcGhlcnRleHRzIiwicmVkdWNlIiwic3VtIiwibmV4dCIsInBsYWludGV4dEFkZGl0aW9uIiwiY2lwaGVydGV4dCIsInBsYWludGV4dHMiLCJtdWx0aXBseSIsImMiLCJrIiwiUHJpdmF0ZUtleSIsImxhbWJkYSIsIm11IiwicHVibGljS2V5IiwicCIsInEiLCJfcCIsIl9xIiwiZGVjcnlwdCIsIkwiLCJnZXRSYW5kb21GYWN0b3IiLCJSYW5nZUVycm9yIiwiRXJyb3IiLCJwaGkiLCJuSW52TW9kUGhpIiwibW9kSW52IiwiYzEiLCJhIiwiZ2V0R2VuZXJhdG9yIiwibjIiLCJhbHBoYSIsImJldGEiLCJhc3luYyIsImJpdGxlbmd0aCIsInNpbXBsZVZhcmlhbnQiLCJwcmltZSIsIk1hdGgiLCJmbG9vciIsImxjbSIsInByaXZhdGVLZXkiLCJwcmltZVN5bmMiXSwibWFwcGluZ3MiOiJvVkFLYyxNQUFPQSxFQVduQkMsWUFBYUMsRUFBV0MsR0FDdEJDLEtBQUtGLEVBQUlBLEVBQ1RFLEtBQUtDLElBQU1ELEtBQUtGLEdBQUssR0FDckJFLEtBQUtELEVBQUlBLENBQ1YsQ0FNR0csZ0JBQ0YsT0FBT0MsRUFBSUQsVUFBVUYsS0FBS0YsRUFDM0IsQ0FVRE0sUUFBU0MsRUFBV0MsR0FDbEIsUUFBVUMsSUFBTkQsRUFDRixHQUNFQSxFQUFJSCxFQUFJSyxZQUFZUixLQUFL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

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

import*as t from"bigint-crypto-utils";class n{constructor(t,n){this.n=t,this._n2=this.n**2n,this.g=n}get bitLength(){return t.bitLength(this.n)}encrypt(n,i){if(void 0===i)do{i=t.randBetween(this.n)}while(1n!==t.gcd(i,this.n));return t.modPow(this.g,n,this._n2)*t.modPow(i,this.n,this._n2)%this._n2}addition(...t){return t.reduce(((t,n)=>t*n%this._n2),1n)}plaintextAddition(n,...i){return i.reduce(((n,i)=>n*t.modPow(this.g,i,this._n2)%this._n2),n)}multiply(n,i){return t.modPow(n,i,this._n2)}}class i{constructor(t,n,i,e,o){this.lambda=t,this.mu=n,this._p=e,this._q=o,this.publicKey=i}get bitLength(){return t.bitLength(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(n){return e(t.modPow(n,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(n){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const i=this.decrypt(n),e=(this._p-1n)*(this._q-1n),o=t.modInv(this.n,e),r=n*(1n-i*this.n)%this.publicKey._n2;return t.modPow(r,o,this.n)}}function e(t,n){return(t-1n)/n}async function o(o=3072,r=!1){let h,c,u,d,a,l;do{h=await t.prime(Math.floor(o/2)+1),c=await t.prime(Math.floor(o/2)),u=h*c}while(c===h||t.bitLength(u)!==o);if(r)d=u+1n,a=(h-1n)*(c-1n),l=t.modInv(a,u);else{const n=u**2n;d=s(u,n),a=t.lcm(h-1n,c-1n),l=t.modInv(e(t.modPow(d,a,n),u),u)}const m=new n(u,d);return{publicKey:m,privateKey:new i(a,l,m,h,c)}}function r(o=3072,r=!1){let h,c,u,d,a,l;do{h=t.primeSync(Math.floor(o/2)+1),c=t.primeSync(Math.floor(o/2)),u=h*c}while(c===h||t.bitLength(u)!==o);if(r)d=u+1n,a=(h-1n)*(c-1n),l=t.modInv(a,u);else{const n=u**2n;d=s(u,n),a=t.lcm(h-1n,c-1n),l=t.modInv(e(t.modPow(d,a,n),u),u)}const m=new n(u,d);return{publicKey:m,privateKey:new i(a,l,m,h,c)}}function s(n,i){const e=t.randBetween(n),o=t.randBetween(n);return(e*n+1n)*t.modPow(o,n,i)%i}export{i as PrivateKey,n as PublicKey,o as generateRandomKeys,r as generateRandomKeysSync};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubm9kZS5lc20uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy90cy9QdWJsaWNLZXkudHMiLCIuLi9zcmMvdHMvUHJpdmF0ZUtleS50cyIsIi4uL3NyYy90cy9nZW5lcmF0ZVJhbmRvbUtleXMudHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbIlB1YmxpY0tleSIsImNvbnN0cnVjdG9yIiwibiIsImciLCJ0aGlzIiwiX24yIiwiYml0TGVuZ3RoIiwiYmN1IiwiZW5jcnlwdCIsIm0iLCJyIiwidW5kZWZpbmVkIiwicmFuZEJldHdlZW4iLCJnY2QiLCJtb2RQb3ciLCJhZGRpdGlvbiIsImNpcGhlcnRleHRzIiwicmVkdWNlIiwic3VtIiwibmV4dCIsInBsYWludGV4dEFkZGl0aW9uIiwiY2lwaGVydGV4dCIsInBsYWludGV4dHMiLCJtdWx0aXBseSIsImMiLCJrIiwiUHJpdmF0ZUtleSIsImxhbWJkYSIsIm11IiwicHVibGljS2V5IiwicCIsInEiLCJfcCIsIl9xIiwiZGVjcnlwdCIsIkwiLCJnZXRSYW5kb21GYWN0b3IiLCJSYW5nZUVycm9yIiwiRXJyb3IiLCJwaGkiLCJuSW52TW9kUGhpIiwibW9kSW52IiwiYzEiLCJhIiwiYXN5bmMiLCJnZW5lcmF0ZVJhbmRvbUtleXMiLCJiaXRsZW5ndGgiLCJzaW1wbGVWYXJpYW50IiwicHJpbWUiLCJNYXRoIiwiZmxvb3IiLCJuMiIsImdldEdlbmVyYXRvciIsImxjbSIsInByaXZhdGVLZXkiLCJnZW5lcmF0ZVJhbmRvbUtleXNTeW5jIiwicHJpbWVTeW5jIiwiYWxwaGEiLCJiZXRhIl0sIm1hcHBpbmdzIjoic0NBS2MsTUFBT0EsRUFXbkJDLFlBQWFDLEVBQVdDLEdBQ3RCQyxLQUFLRixFQUFJQSxFQUNURSxLQUFLQyxJQUFNRCxLQUFLRixHQUFLLEdBQ3JCRSxLQUFLRCxFQUFJQSxDQUNWLENBTUdHLGdCQUNGLE9BQU9DLEVBQUlELFVBQVVGLEtBQUtGLEVBQzNCLENBVURNLFFBQVNDLEVBQVdDLEdB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
import*as t from"bigint-crypto-utils";class n{constructor(t,n){this.n=t,this._n2=this.n**2n,this.g=n}get bitLength(){return t.bitLength(this.n)}encrypt(n,i){if(void 0===i)do{i=t.randBetween(this.n)}while(1n!==t.gcd(i,this.n));return t.modPow(this.g,n,this._n2)*t.modPow(i,this.n,this._n2)%this._n2}addition(...t){return t.reduce(((t,n)=>t*n%this._n2),1n)}plaintextAddition(n,...i){return i.reduce(((n,i)=>n*t.modPow(this.g,i,this._n2)%this._n2),n)}multiply(n,i){return t.modPow(n,i,this._n2)}}class i{constructor(t,n,i,e,o){this.lambda=t,this.mu=n,this._p=e,this._q=o,this.publicKey=i}get bitLength(){return t.bitLength(this.publicKey.n)}get n(){return this.publicKey.n}decrypt(n){return void 0!==this._p&&void 0!==this._q?e(t.modPow(n,this.lambda,this.publicKey._n2,[[this._p,2],[this._q,2]]),this.publicKey.n)*this.mu%this.publicKey.n:e(t.modPow(n,this.lambda,this.publicKey._n2),this.publicKey.n)*this.mu%this.publicKey.n}getRandomFactor(n){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(void 0===this._p||void 0===this._q)throw Error("Cannot get random factor without knowing p and q");const i=this.decrypt(n),e=(this._p-1n)*(this._q-1n),o=t.modInv(this.n,e),s=n*(1n-i*this.n)%this.publicKey._n2;return t.modPow(s,o,this.n,[[this._p,1],[this._q,1]])}}function e(t,n){return(t-1n)/n}async function o(o=3072,s=!1){let h,c,u,d,a,l;do{h=await t.prime(Math.floor(o/2)+1),c=await t.prime(Math.floor(o/2)),u=h*c}while(c===h||t.bitLength(u)!==o);if(s)d=u+1n,a=(h-1n)*(c-1n),l=t.modInv(a,u);else{const n=u**2n;d=r(u,n),a=t.lcm(h-1n,c-1n),l=t.modInv(e(t.modPow(d,a,n),u),u)}const p=new n(u,d);return{publicKey:p,privateKey:new i(a,l,p,h,c)}}function s(o=3072,s=!1){let h,c,u,d,a,l;do{h=t.primeSync(Math.floor(o/2)+1),c=t.primeSync(Math.floor(o/2)),u=h*c}while(c===h||t.bitLength(u)!==o);if(s)d=u+1n,a=(h-1n)*(c-1n),l=t.modInv(a,u);else{const n=u**2n;d=r(u,n),a=t.lcm(h-1n,c-1n),l=t.modInv(e(t.modPow(d,a,n),u),u)}const p=new n(u,d);return{publicKey:p,privateKey:new i(a,l,p,h,c)}}function r(n,i){const e=t.randBetween(n),o=t.randBetween(n);return(e*n+1n)*t.modPow(o,n,i)%i}export{i as PrivateKey,n as PublicKey,o as generateRandomKeys,s as generateRandomKeysSync};

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

# paillier-bigint - v3.4.1
# paillier-bigint - v3.4.2

@@ -40,6 +40,2 @@ ## Table of contents

#### Defined in
[generateRandomKeys.ts:18](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/generateRandomKeys.ts#L18)
___

@@ -66,5 +62,1 @@

A pair of public, private keys
#### Defined in
[generateRandomKeys.ts:55](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/generateRandomKeys.ts#L55)

@@ -45,6 +45,2 @@ # Class: PrivateKey

#### Defined in
[PrivateKey.ts:23](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PrivateKey.ts#L23)
## Properties

@@ -56,6 +52,2 @@

#### Defined in
[PrivateKey.ts:8](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PrivateKey.ts#L8)
___

@@ -67,6 +59,2 @@

#### Defined in
[PrivateKey.ts:9](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PrivateKey.ts#L9)
___

@@ -78,6 +66,2 @@

#### Defined in
[PrivateKey.ts:10](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PrivateKey.ts#L10)
## Accessors

@@ -97,6 +81,2 @@

#### Defined in
[PrivateKey.ts:35](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PrivateKey.ts#L35)
___

@@ -116,6 +96,2 @@

#### Defined in
[PrivateKey.ts:43](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PrivateKey.ts#L43)
## Methods

@@ -141,6 +117,2 @@

#### Defined in
[PrivateKey.ts:54](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PrivateKey.ts#L54)
___

@@ -176,5 +148,1 @@

The random factor (mod n)
#### Defined in
[PrivateKey.ts:75](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PrivateKey.ts#L75)

@@ -43,6 +43,2 @@ # Class: PublicKey

#### Defined in
[PublicKey.ts:17](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PublicKey.ts#L17)
## Properties

@@ -54,6 +50,2 @@

#### Defined in
[PublicKey.ts:10](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PublicKey.ts#L10)
___

@@ -65,6 +57,2 @@

#### Defined in
[PublicKey.ts:8](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PublicKey.ts#L8)
___

@@ -76,6 +64,2 @@

#### Defined in
[PublicKey.ts:7](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PublicKey.ts#L7)
## Accessors

@@ -95,6 +79,2 @@

#### Defined in
[PublicKey.ts:27](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PublicKey.ts#L27)
## Methods

@@ -120,6 +100,2 @@

#### Defined in
[PublicKey.ts:55](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PublicKey.ts#L55)
___

@@ -146,6 +122,2 @@

#### Defined in
[PublicKey.ts:39](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PublicKey.ts#L39)
___

@@ -172,6 +144,2 @@

#### Defined in
[PublicKey.ts:79](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PublicKey.ts#L79)
___

@@ -197,5 +165,1 @@

The encryption of (m_1 + ... + m_n) with this public key
#### Defined in
[PublicKey.ts:67](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/PublicKey.ts#L67)

@@ -16,6 +16,2 @@ # Interface: KeyPair

#### Defined in
[generateRandomKeys.ts:7](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/generateRandomKeys.ts#L7)
___

@@ -26,5 +22,1 @@

• **publicKey**: [`PublicKey`](../classes/PublicKey.md)
#### Defined in
[generateRandomKeys.ts:6](https://github.com/juanelas/paillier-bigint/blob/8a14c4e/src/ts/generateRandomKeys.ts#L6)
{
"name": "paillier-bigint",
"version": "3.4.1",
"version": "3.4.2",
"description": "An implementation of the Paillier cryptosystem using native JS (ECMA 2020) implementation of BigInt",

@@ -52,6 +52,22 @@ "keywords": [

"./esm-browser-bundle": "./dist/bundle.esm.min.js",
"./dist/bundle.esm.min.js": "./dist/bundle.esm.min.js",
"./esm-browser-bundle-nomin": "./dist/bundle.esm.js",
"./dist/bundle.esm.js": "./dist/bundle.esm.js",
"./iife-browser-bundle": "./dist/bundle.iife.js",
"./dist/bundle.iife.js": "./dist/bundle.iife.js",
"./umd-browser-bundle": "./dist/bundle.umd.js",
"./types": "./dist/index.d.ts"
"./dist/bundle.umd.js": "./dist/bundle.umd.js",
"./dist/index.node": {
"types": "./dist/index.d.ts",
"default": "./dist/index.node.cjs"
},
"./dist/index.node.esm": {
"types": "./dist/index.d.ts",
"default": "./dist/index.node.esm.js"
},
"./dist/index.browser.esm": {
"types": "./dist/index.d.ts",
"default": "./dist/index.browser.esm.js"
},
"./package.json": "./package.json"
},

@@ -138,3 +154,3 @@ "imports": {

"devDependencies": {
"@rollup/plugin-commonjs": "^24.0.1",
"@rollup/plugin-commonjs": "^25.0.2",
"@rollup/plugin-inject": "^5.0.3",

@@ -149,3 +165,3 @@ "@rollup/plugin-json": "^6.0.0",

"@types/mocha": "^10.0.0",
"c8": "^7.12.0",
"c8": "^8.0.0",
"chai": "^4.3.3",

@@ -159,3 +175,3 @@ "dotenv": "^16.0.3",

"pirates": "^4.0.1",
"puppeteer": "^19.1.2",
"puppeteer": "^20.7.3",
"rimraf": "^5.0.0",

@@ -168,7 +184,7 @@ "rollup": "^3.20.2",

"typedoc-plugin-markdown": "~3.14.0",
"typescript": "^5.0.3"
"typescript": "^4.6.0"
},
"dependencies": {
"bigint-crypto-utils": "^3.2.2"
"bigint-crypto-utils": "^3.3.0"
}
}
import * as bcu from 'bigint-crypto-utils'
import PublicKey from './PublicKey'
import PrivateKey, { L } from './PrivateKey'
export interface KeyPair {
publicKey: PublicKey
privateKey: PrivateKey
}
/**
* 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
*/
export async function generateRandomKeys (bitlength: number = 3072, simpleVariant: boolean = false): Promise<KeyPair> {
let p: bigint, q: bigint, n: bigint, g: bigint, lambda: bigint, mu: bigint
// if p and q are bitLength/2 long -> 2**(bitLength - 2) <= n < 2**(bitLength)
do {
p = await bcu.prime(Math.floor(bitlength / 2) + 1)
q = await bcu.prime(Math.floor(bitlength / 2))
n = p * q
} while (q === p || bcu.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.modInv(lambda, n)
} else {
const n2 = n ** 2n
g = getGenerator(n, n2)
lambda = bcu.lcm(p - 1n, q - 1n)
mu = bcu.modInv(L(bcu.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
*/
export function generateRandomKeysSync (bitlength: number = 3072, simpleVariant: boolean = false): KeyPair {
let p: bigint, q: bigint, n: bigint, g: bigint, lambda: bigint, mu: bigint
// if p and q are bitLength/2 long -> 2**(bitLength - 2) <= n < 2**(bitLength)
do {
p = bcu.primeSync(Math.floor(bitlength / 2) + 1)
q = bcu.primeSync(Math.floor(bitlength / 2))
n = p * q
} while (q === p || bcu.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.modInv(lambda, n)
} else {
const n2 = n ** 2n
g = getGenerator(n, n2)
lambda = bcu.lcm(p - 1n, q - 1n)
mu = bcu.modInv(L(bcu.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: bigint, n2: bigint): bigint { // n2 = n*n
const alpha = bcu.randBetween(n)
const beta = bcu.randBetween(n)
return ((alpha * n + 1n) * bcu.modPow(beta, n, n2)) % n2
}
export { default as PublicKey } from './PublicKey'
export { default as PrivateKey } from './PrivateKey'
export { generateRandomKeys, generateRandomKeysSync, KeyPair } from './generateRandomKeys'
import * as bcu from 'bigint-crypto-utils'
import PublicKey from './PublicKey'
/**
* Class for Paillier private keys.
*/
export default class PrivateKey {
readonly lambda: bigint
readonly mu: bigint
readonly publicKey: PublicKey
private readonly _p?: bigint
private readonly _q?: bigint
/**
* Creates an instance of class PrivateKey
*
* @param lambda
* @param mu
* @param publicKey
* @param p - a big prime
* @param q- a big prime
*/
constructor (lambda: bigint, mu: bigint, publicKey: PublicKey, p?: bigint, q?: bigint) {
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 (): number {
return bcu.bitLength(this.publicKey.n)
}
/**
* Get the public modulo n=p·q
* @returns The public modulo n=p·q
*/
get n (): bigint {
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: bigint): bigint {
return (L(bcu.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: bigint): bigint {
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.modInv(this.n, phi)
const c1 = c * (1n - m * this.n) % this.publicKey._n2
return bcu.modPow(c1, nInvModPhi, this.n)
}
}
export function L (a: bigint, n: bigint): bigint {
return (a - 1n) / n
}
import * as bcu from 'bigint-crypto-utils'
/**
* Class for a Paillier public key
*/
export default class PublicKey {
readonly n: bigint
readonly g: bigint
readonly _n2: bigint
/**
* Creates an instance of class PublicKey
* @param n - The public modulo
* @param g - The public generator
*/
constructor (n: bigint, g: bigint) {
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 (): number {
return bcu.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: bigint, r?: bigint): bigint {
if (r === undefined) {
do {
r = bcu.randBetween(this.n)
} while (bcu.gcd(r, this.n) !== 1n)
}
return (bcu.modPow(this.g, m, this._n2) * bcu.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: bigint[]): bigint {
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: bigint, ...plaintexts: bigint[]): bigint {
return plaintexts.reduce((sum, next) => sum * bcu.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: bigint, k: bigint | number): bigint {
return bcu.modPow(c, k, this._n2)
}
}