function checkPrime(prime, generator) { var gen = generator.toString('hex'); var hex = [gen, prime.toString(16)].join('_'); if (hex in primeCache) { return primeCache[hex]; } var error = 0; if (prime.isEven() || !primes.simpleSieve || !primes.fermatTest(prime) || !millerRabin.test(prime)) { //not a prime so +1 error += 1; if (gen === '02' || gen === '05') { // we'd be able to check the generator // it would fail so +8 error += 8; } else { //we wouldn't be able to test the generator // so +4 error += 4; } primeCache[hex] = error; return error; } if (!millerRabin.test(prime.shrn(1))) { //not a safe prime error += 2; } var rem; switch (gen) { case '02': if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) { // unsuidable generator error += 8; } break; case '05': rem = prime.mod(TEN); if (rem.cmp(THREE) && rem.cmp(SEVEN)) { // prime mod 10 needs to equal 3 or 7 error += 8; } break; default: error += 4; } primeCache[hex] = error; return error; }
function findPrime(bits, gen) { if (bits < 16) { // this is what openssl does if (gen === 2 || gen === 5) { return new BN([0x8c, 0x7b]); } else { return new BN([0x8c, 0x27]); } } gen = new BN(gen); var num, n2; while (true) { num = new BN(randomBytes(Math.ceil(bits / 8))); while (num.bitLength() > bits) { num.ishrn(1); } if (num.isEven()) { num.iadd(ONE); } if (!num.testn(1)) { num.iadd(TWO); } if (!gen.cmp(TWO)) { while (num.mod(TWENTYFOUR).cmp(ELEVEN)) { num.iadd(FOUR); } } else if (!gen.cmp(FIVE)) { while (num.mod(TEN).cmp(THREE)) { num.iadd(FOUR); } } n2 = num.shrn(1); if (simpleSieve(n2) && simpleSieve(num) && fermatTest(n2) && fermatTest(num) && millerRabin.test(n2) && millerRabin.test(num)) { return num; } } }
function findPrime(bits, gen) { if (bits < 16) { // this is what openssl does if (gen === 2 || gen === 5) { return new BN([0x8c, 0x7b]); } else { return new BN([0x8c, 0x27]); } } gen = new BN(gen); var runs, comp; function generateRandom(bits) { runs = -1; var out = new BN(randomBytes(Math.ceil(bits / 8))); while (out.bitLength() > bits) { out.ishrn(1); } if (out.isEven()) { out.iadd(ONE); } if (!out.testn(1)) { out.iadd(TWO); } if (!gen.cmp(TWO)) { while (out.mod(TWENTYFOUR).cmp(ELEVEN)) { out.iadd(FOUR); } comp = { major: [TWENTYFOUR], minor: [TWELVE] }; } else if (!gen.cmp(FIVE)) { rem = out.mod(TEN); while (rem.cmp(THREE)) { out.iadd(FOUR); rem = out.mod(TEN); } comp = { major: [FOUR, SIXTEEN], minor: [TWO, EIGHT] }; } else { comp = { major: [FOUR], minor: [TWO] }; } return out; } var num = generateRandom(bits); var n2 = num.shrn(1); while (true) { while (num.bitLength() > bits) { num = generateRandom(bits); n2 = num.shrn(1); } runs++; if (simpleSieve(n2) && simpleSieve(num) && fermatTest(n2) && fermatTest(num) && millerRabin.test(n2) && millerRabin.test(num)) { return num; } num.iadd(comp.major[runs%comp.major.length]); n2.iadd(comp.minor[runs%comp.minor.length]); } }