import { mod_exp } from "./math.js"; export const KEY_SIZE = 512; export function cryptoRandom(bits) { if (bits === undefined) { bits = KEY_SIZE; } let length = bits / 64; const byteArray = new BigUint64Array(length); window.crypto.getRandomValues(byteArray); let intRepr = 0n; for (let int of byteArray) { intRepr <<= 64n; intRepr += int; } return intRepr; } window.cryptoRandom = cryptoRandom; /** * Generate random integer of length N bits. * * We generate between 2^(N - 1) and 2^N - 1 by adding differences. */ function generate_bigint() { let intRepr = cryptoRandom(); // Drop the MSB to force into range from above intRepr >>= 1n; // Add 2^2047 to force into range from below intRepr += 2n ** BigInt(KEY_SIZE - 1); return intRepr; } function small_prime_test(n) { // Assumes that n > 10000 for (let p of SMALL_PRIMES) { if (n % p === 0n) { return false; } } return true; } function miller_rabin(n, k) { // Eradicate the trivial case if (n % 2n === 0n) { return false; } // Extract factors of 2 let s = 0n; let d = n - 1n; while (d % 2n === 0n) { d >>= 1n; s += 1n; } for (; k > 0; k--) { let a = cryptoRandom(); let x = mod_exp(a, d, n); if (x === 1n || x === n - 1n) { continue; } let composite = true; for (let s_ = 0; s_ < s; s_++) { x = x ** 2n % n; if (x === n - 1n) { composite = false; break; } } if (composite) { return false; } } return true; } export function generate_prime() { while (true) { let n = generate_bigint() | 0b11n; if (small_prime_test(n) && miller_rabin(n, 40)) { return n; } } } export function generate_safe_prime() { while (true) { let n = generate_prime(); if (small_prime_test((n - 1n) / 2n)) { // Remove this conditional if you want it to run fast! It (probably) won't break it // if (miller_rabin((n - 1n) / 2n, 40)) { return n; // } } } } window.generate_safe_prime = generate_safe_prime; const SMALL_PRIMES = [ 2n, 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, 1601n, 1607n, 1609n, 1613n, 1619n, 1621n, 1627n, 1637n, 1657n, 1663n, 1667n, 1669n, 1693n, 1697n, 1699n, 1709n, 1721n, 1723n, 1733n, 1741n, 1747n, 1753n, 1759n, 1777n, 1783n, 1787n, 1789n, 1801n, 1811n, 1823n, 1831n, 1847n, 1861n, 1867n, 1871n, 1873n, 1877n, 1879n, 1889n, 1901n, 1907n, 1913n, 1931n, 1933n, 1949n, 1951n, 1973n, 1979n, 1987n, 1993n, 1997n, 1999n, 2003n, 2011n, 2017n, 2027n, 2029n, 2039n, 2053n, 2063n, 2069n, 2081n, 2083n, 2087n, 2089n, 2099n, 2111n, 2113n, 2129n, 2131n, 2137n, 2141n, 2143n, 2153n, 2161n, 2179n, 2203n, 2207n, 2213n, 2221n, 2237n, 2239n, 2243n, 2251n, 2267n, 2269n, 2273n, 2281n, 2287n, 2293n, 2297n, 2309n, 2311n, 2333n, 2339n, 2341n, 2347n, 2351n, 2357n, 2371n, 2377n, 2381n, 2383n, 2389n, 2393n, 2399n, 2411n, 2417n, 2423n, 2437n, 2441n, 2447n, 2459n, 2467n, 2473n, 2477n, 2503n, 2521n, 2531n, 2539n, 2543n, 2549n, 2551n, 2557n, 2579n, 2591n, 2593n, 2609n, 2617n, 2621n, 2633n, 2647n, 2657n, 2659n, 2663n, 2671n, 2677n, 2683n, 2687n, 2689n, 2693n, 2699n, 2707n, 2711n, 2713n, 2719n, 2729n, 2731n, 2741n, 2749n, 2753n, 2767n, 2777n, 2789n, 2791n, 2797n, 2801n, 2803n, 2819n, 2833n, 2837n, 2843n, 2851n, 2857n, 2861n, 2879n, 2887n, 2897n, 2903n, 2909n, 2917n, 2927n, 2939n, 2953n, 2957n, 2963n, 2969n, 2971n, 2999n, 3001n, 3011n, 3019n, 3023n, 3037n, 3041n, 3049n, 3061n, 3067n, 3079n, 3083n, 3089n, 3109n, 3119n, 3121n, 3137n, 3163n, 3167n, 3169n, 3181n, 3187n, 3191n, 3203n, 3209n, 3217n, 3221n, 3229n, 3251n, 3253n, 3257n, 3259n, 3271n, 3299n, 3301n, 3307n, 3313n, 3319n, 3323n, 3329n, 3331n, 3343n, 3347n, 3359n, 3361n, 3371n, 3373n, 3389n, 3391n, 3407n, 3413n, 3433n, 3449n, 3457n, 3461n, 3463n, 3467n, 3469n, 3491n, 3499n, 3511n, 3517n, 3527n, 3529n, 3533n, 3539n, 3541n, 3547n, 3557n, 3559n, 3571n, 3581n, 3583n, 3593n, 3607n, 3613n, 3617n, 3623n, 3631n, 3637n, 3643n, 3659n, 3671n, 3673n, 3677n, 3691n, 3697n, 3701n, 3709n, 3719n, 3727n, 3733n, 3739n, 3761n, 3767n, 3769n, 3779n, 3793n, 3797n, 3803n, 3821n, 3823n, 3833n, 3847n, 3851n, 3853n, 3863n, 3877n, 3881n, 3889n, 3907n, 3911n, 3917n, 3919n, 3923n, 3929n, 3931n, 3943n, 3947n, 3967n, 3989n, 4001n, 4003n, 4007n, 4013n, 4019n, 4021n, 4027n, 4049n, 4051n, 4057n, 4073n, 4079n, 4091n, 4093n, 4099n, 4111n, 4127n, 4129n, 4133n, 4139n, 4153n, 4157n, 4159n, 4177n, 4201n, 4211n, 4217n, 4219n, 4229n, 4231n, 4241n, 4243n, 4253n, 4259n, 4261n, 4271n, 4273n, 4283n, 4289n, 4297n, 4327n, 4337n, 4339n, 4349n, 4357n, 4363n, 4373n, 4391n, 4397n, 4409n, 4421n, 4423n, 4441n, 4447n, 4451n, 4457n, 4463n, 4481n, 4483n, 4493n, 4507n, 4513n, 4517n, 4519n, 4523n, 4547n, 4549n, 4561n, 4567n, 4583n, 4591n, 4597n, 4603n, 4621n, 4637n, 4639n, 4643n, 4649n, 4651n, 4657n, 4663n, 4673n, 4679n, 4691n, 4703n, 4721n, 4723n, 4729n, 4733n, 4751n, 4759n, 4783n, 4787n, 4789n, 4793n, 4799n, 4801n, 4813n, 4817n, 4831n, 4861n, 4871n, 4877n, 4889n, 4903n, 4909n, 4919n, 4931n, 4933n, 4937n, 4943n, 4951n, 4957n, 4967n, 4969n, 4973n, 4987n, 4993n, 4999n, 5003n, 5009n, 5011n, 5021n, 5023n, 5039n, 5051n, 5059n, 5077n, 5081n, 5087n, 5099n, 5101n, 5107n, 5113n, 5119n, 5147n, 5153n, 5167n, 5171n, 5179n, 5189n, 5197n, 5209n, 5227n, 5231n, 5233n, 5237n, 5261n, 5273n, 5279n, 5281n, 5297n, 5303n, 5309n, 5323n, 5333n, 5347n, 5351n, 5381n, 5387n, 5393n, 5399n, 5407n, 5413n, 5417n, 5419n, 5431n, 5437n, 5441n, 5443n, 5449n, 5471n, 5477n, 5479n, 5483n, 5501n, 5503n, 5507n, 5519n, 5521n, 5527n, 5531n, 5557n, 5563n, 5569n, 5573n, 5581n, 5591n, 5623n, 5639n, 5641n, 5647n, 5651n, 5653n, 5657n, 5659n, 5669n, 5683n, 5689n, 5693n, 5701n, 5711n, 5717n, 5737n, 5741n, 5743n, 5749n, 5779n, 5783n, 5791n, 5801n, 5807n, 5813n, 5821n, 5827n, 5839n, 5843n, 5849n, 5851n, 5857n, 5861n, 5867n, 5869n, 5879n, 5881n, 5897n, 5903n, 5923n, 5927n, 5939n, 5953n, 5981n, 5987n, 6007n, 6011n, 6029n, 6037n, 6043n, 6047n, 6053n, 6067n, 6073n, 6079n, 6089n, 6091n, 6101n, 6113n, 6121n, 6131n, 6133n, 6143n, 6151n, 6163n, 6173n, 6197n, 6199n, 6203n, 6211n, 6217n, 6221n, 6229n, 6247n, 6257n, 6263n, 6269n, 6271n, 6277n, 6287n, 6299n, 6301n, 6311n, 6317n, 6323n, 6329n, 6337n, 6343n, 6353n, 6359n, 6361n, 6367n, 6373n, 6379n, 6389n, 6397n, 6421n, 6427n, 6449n, 6451n, 6469n, 6473n, 6481n, 6491n, 6521n, 6529n, 6547n, 6551n, 6553n, 6563n, 6569n, 6571n, 6577n, 6581n, 6599n, 6607n, 6619n, 6637n, 6653n, 6659n, 6661n, 6673n, 6679n, 6689n, 6691n, 6701n, 6703n, 6709n, 6719n, 6733n, 6737n, 6761n, 6763n, 6779n, 6781n, 6791n, 6793n, 6803n, 6823n, 6827n, 6829n, 6833n, 6841n, 6857n, 6863n, 6869n, 6871n, 6883n, 6899n, 6907n, 6911n, 6917n, 6947n, 6949n, 6959n, 6961n, 6967n, 6971n, 6977n, 6983n, 6991n, 6997n, 7001n, 7013n, 7019n, 7027n, 7039n, 7043n, 7057n, 7069n, 7079n, 7103n, 7109n, 7121n, 7127n, 7129n, 7151n, 7159n, 7177n, 7187n, 7193n, 7207n, 7211n, 7213n, 7219n, 7229n, 7237n, 7243n, 7247n, 7253n, 7283n, 7297n, 7307n, 7309n, 7321n, 7331n, 7333n, 7349n, 7351n, 7369n, 7393n, 7411n, 7417n, 7433n, 7451n, 7457n, 7459n, 7477n, 7481n, 7487n, 7489n, 7499n, 7507n, 7517n, 7523n, 7529n, 7537n, 7541n, 7547n, 7549n, 7559n, 7561n, 7573n, 7577n, 7583n, 7589n, 7591n, 7603n, 7607n, 7621n, 7639n, 7643n, 7649n, 7669n, 7673n, 7681n, 7687n, 7691n, 7699n, 7703n, 7717n, 7723n, 7727n, 7741n, 7753n, 7757n, 7759n, 7789n, 7793n, 7817n, 7823n, 7829n, 7841n, 7853n, 7867n, 7873n, 7877n, 7879n, 7883n, 7901n, 7907n, 7919n, 7927n, 7933n, 7937n, 7949n, 7951n, 7963n, 7993n, 8009n, 8011n, 8017n, 8039n, 8053n, 8059n, 8069n, 8081n, 8087n, 8089n, 8093n, 8101n, 8111n, 8117n, 8123n, 8147n, 8161n, 8167n, 8171n, 8179n, 8191n, 8209n, 8219n, 8221n, 8231n, 8233n, 8237n, 8243n, 8263n, 8269n, 8273n, 8287n, 8291n, 8293n, 8297n, 8311n, 8317n, 8329n, 8353n, 8363n, 8369n, 8377n, 8387n, 8389n, 8419n, 8423n, 8429n, 8431n, 8443n, 8447n, 8461n, 8467n, 8501n, 8513n, 8521n, 8527n, 8537n, 8539n, 8543n, 8563n, 8573n, 8581n, 8597n, 8599n, 8609n, 8623n, 8627n, 8629n, 8641n, 8647n, 8663n, 8669n, 8677n, 8681n, 8689n, 8693n, 8699n, 8707n, 8713n, 8719n, 8731n, 8737n, 8741n, 8747n, 8753n, 8761n, 8779n, 8783n, 8803n, 8807n, 8819n, 8821n, 8831n, 8837n, 8839n, 8849n, 8861n, 8863n, 8867n, 8887n, 8893n, 8923n, 8929n, 8933n, 8941n, 8951n, 8963n, 8969n, 8971n, 8999n, 9001n, 9007n, 9011n, 9013n, 9029n, 9041n, 9043n, 9049n, 9059n, 9067n, 9091n, 9103n, 9109n, 9127n, 9133n, 9137n, 9151n, 9157n, 9161n, 9173n, 9181n, 9187n, 9199n, 9203n, 9209n, 9221n, 9227n, 9239n, 9241n, 9257n, 9277n, 9281n, 9283n, 9293n, 9311n, 9319n, 9323n, 9337n, 9341n, 9343n, 9349n, 9371n, 9377n, 9391n, 9397n, 9403n, 9413n, 9419n, 9421n, 9431n, 9433n, 9437n, 9439n, 9461n, 9463n, 9467n, 9473n, 9479n, 9491n, 9497n, 9511n, 9521n, 9533n, 9539n, 9547n, 9551n, 9587n, 9601n, 9613n, 9619n, 9623n, 9629n, 9631n, 9643n, 9649n, 9661n, 9677n, 9679n, 9689n, 9697n, 9719n, 9721n, 9733n, 9739n, 9743n, 9749n, 9767n, 9769n, 9781n, 9787n, 9791n, 9803n, 9811n, 9817n, 9829n, 9833n, 9839n, 9851n, 9857n, 9859n, 9871n, 9883n, 9887n, 9901n, 9907n, 9923n, 9929n, 9931n, 9941n, 9949n, 9967n, 9973n, ];