import { generate_prime } from "./random_primes.js"; import { mod_exp, mod_inv } from "./math.js"; let p, q, pubKey, privKey; class PubKey { constructor(p, q) { this.n = p * q; this.e = 65537n; } encrypt(m) { return mod_exp(m, this.e, this.n); } } class PrivKey { constructor(p, q) { this.n = p * q; this.d = mod_inv(65537n, (q - 1n) * (p - 1n)); } decrypt(c) { return mod_exp(c, this.d, this.n); } } export function generate_rsa_keypair() { if (window.sessionStorage.getItem("rsa_p") === null) { p = generate_prime(); window.sessionStorage.setItem("rsa_p", p); } else { p = BigInt(window.sessionStorage.getItem("rsa_p")); } if (window.sessionStorage.getItem("rsa_q") === null) { q = generate_prime(); window.sessionStorage.setItem("rsa_q", q); } else { q = BigInt(window.sessionStorage.getItem("rsa_q")); } pubKey = new PubKey(p, q); privKey = new PrivKey(p, q); return { pubKey, privKey }; }