paillier-bigint
Advanced tools
Comparing version 3.4.2 to 3.4.3
@@ -53,3 +53,3 @@ 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); | ||
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) )'); | ||
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) { | ||
@@ -56,0 +56,0 @@ throw Error('Cannot get random factor without knowing p and q'); |
@@ -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(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}; | ||
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,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}({}); | ||
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,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)}}})); | ||
!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,1 +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 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}; | ||
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}; |
@@ -96,13 +96,13 @@ /** | ||
* The recovery function only works if the public key generator g was using the simple variant | ||
* g = 1 + n | ||
* g = 1 + n (see {@link generateRandomKeys}) | ||
* 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 | ||
* @param c - The encryption of message m using a Paillier's {@link PublicKey} and random factor r | ||
* | ||
* @returns The random factor (mod n) | ||
* @returns The random factor r (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 {@link 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) (see {@link generateRandomKeys}) | ||
* | ||
* @throws {Error} | ||
* @throws {@link Error} | ||
* Cannot get random factor without knowing p and q | ||
@@ -119,18 +119,18 @@ * | ||
/** | ||
* Generates a pair private, public key for the Paillier cryptosystem. | ||
* Generates a pair of private and 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 | ||
* @param simpleVariant - Since generated p and q are 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). This is REQUIRED if you want to be able to recover the random integer factor used when encrypting with the public key using the {@link PrivateKey.getRandomFactor} method | ||
* | ||
* @returns A promise that resolves to a {@link KeyPair} of public, private keys | ||
* @returns A promise that resolves to a {@link KeyPair} holding a public and a private key | ||
*/ | ||
declare function generateRandomKeys(bitlength?: number, simpleVariant?: boolean): Promise<KeyPair>; | ||
/** | ||
* Generates a pair private, public key for the Paillier cryptosystem in synchronous mode. | ||
* Generates a pair of private and 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) | ||
* @param simpleVariant - Since generated p and q are 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). This is REQUIRED if you want to be able to recover the random integer factor used when encrypting with the public key using the {@link PrivateKey.getRandomFactor} method. | ||
* | ||
* @returns A pair of public, private keys | ||
* @returns A {@link KeyPair} with a public and a private key | ||
*/ | ||
@@ -137,0 +137,0 @@ declare function generateRandomKeysSync(bitlength?: number, simpleVariant?: boolean): KeyPair; |
@@ -1,1 +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 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}; | ||
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.2 | ||
# paillier-bigint - v3.4.3 | ||
@@ -25,3 +25,3 @@ ## Table of contents | ||
Generates a pair private, public key for the Paillier cryptosystem. | ||
Generates a pair of private and public key for the Paillier cryptosystem. | ||
@@ -33,3 +33,3 @@ #### Parameters | ||
| `bitlength` | `number` | `3072` | The bit length of the public modulo | | ||
| `simpleVariant` | `boolean` | `false` | - | | ||
| `simpleVariant` | `boolean` | `false` | Since generated p and q are 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). This is REQUIRED if you want to be able to recover the random integer factor used when encrypting with the public key using the [getRandomFactor](classes/PrivateKey.md#getrandomfactor) method | | ||
@@ -40,3 +40,3 @@ #### Returns | ||
A promise that resolves to a [KeyPair](interfaces/KeyPair.md) of public, private keys | ||
A promise that resolves to a [KeyPair](interfaces/KeyPair.md) holding a public and a private key | ||
@@ -49,3 +49,3 @@ ___ | ||
Generates a pair private, public key for the Paillier cryptosystem in synchronous mode. | ||
Generates a pair of private and 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. | ||
@@ -58,3 +58,3 @@ | ||
| `bitlength` | `number` | `3072` | The bit length of the public modulo | | ||
| `simpleVariant` | `boolean` | `false` | - | | ||
| `simpleVariant` | `boolean` | `false` | Since generated p and q are 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). This is REQUIRED if you want to be able to recover the random integer factor used when encrypting with the public key using the [getRandomFactor](classes/PrivateKey.md#getrandomfactor) method. | | ||
@@ -65,2 +65,2 @@ #### Returns | ||
A pair of public, private keys | ||
A [KeyPair](interfaces/KeyPair.md) with a public and a private key |
@@ -119,3 +119,3 @@ # Class: PrivateKey | ||
The recovery function only works if the public key generator g was using the simple variant | ||
g = 1 + n | ||
g = 1 + n (see [generateRandomKeys](../API.md#generaterandomkeys)) | ||
It is also necessary to know p and q (usually stored in the private key) | ||
@@ -125,6 +125,8 @@ | ||
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) ) | ||
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) (see [generateRandomKeys](../API.md#generaterandomkeys)) | ||
**`Throws`** | ||
Error | ||
Cannot get random factor without knowing p and q | ||
@@ -136,3 +138,3 @@ | ||
| :------ | :------ | :------ | | ||
| `c` | `bigint` | The encryption using the public of message m with random factor r | | ||
| `c` | `bigint` | The encryption of message m using a Paillier's [PublicKey](PublicKey.md) and random factor r | | ||
@@ -143,2 +145,2 @@ #### Returns | ||
The random factor (mod n) | ||
The random factor r (mod n) |
{ | ||
"name": "paillier-bigint", | ||
"version": "3.4.2", | ||
"version": "3.4.3", | ||
"description": "An implementation of the Paillier cryptosystem using native JS (ECMA 2020) implementation of BigInt", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
0
86379
23
572