src/ff-elgamal/helper.ts
// check if a given number is primeexport const isPrime = (num: number): boolean => { for (let i = 2; i <= Math.sqrt(num); i++) {== should be === if (Math.floor(num / i) == num / i) {Missing semicolon return false } }Missing semicolon return trueMissing semicolon} // get all primitive roots of a given number// only works for prime numbersTODO found// TODO: implement for non-prime numbersFunction `getPrimitiveRoots` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.export const getPrimitiveRoots = (n: number): number[] => { if (!isPrime(n)) {Missing semicolon return [] } // source: https://asecuritysite.com/encryption/pickgMissing semicolon const g: number[] = [] for (let i = 1; i < n; i++) {Missing semicolon let exp = 1Missing semicolon let next = i % n while (next !== 1) {Missing semicolon next = (next * i) % nMissing semicolon exp += 1 } if (exp === n - 1) {Missing semicolon g.push(i) } } Missing semicolon return gMissing semicolon} // calculate q given p (for p < 2)TODO found// TODO: maybe check if p is actually primeMissing semicolonexport const getQofP = (p: number): number => (p > 1 ? (p - 1) / 2 : -1) // q is valid if it is primeMissing semicolonexport const isQValid = (q: number): boolean => (q > 1 ? isPrime(q) : false) // g is valid if:// - g != 1// - q != q// - g^q mod p == 1export const isGValid = (g: number, p: number): boolean => {Missing semicolon return g !== 1 && g !== getQofP(p) && g ** getQofP(p) % p === 1Missing semicolon} // get all primes that have a q = (p-1)/2 that is prime given a list of primesexport const getPCandidates = (primes: number[]): number[] => primes.reduce((previous: number[], current: number) => {Missing semicolon return isQValid(getQofP(current)) ? [...previous, current] : previousMissing semicolon }, []) // get all generators g of q given a prime pexport const getGCandidates = (p: number): number[] => getPrimitiveRoots(getQofP(p)).reduce((previous: number[], current: number) => {Missing semicolon return isGValid(current, p) ? [...previous, current] : previousMissing semicolon }, [])