react / wstein / node_modules / browserify / node_modules / crypto-browserify / node_modules / diffie-hellman / lib / generatePrime.js
80551 viewsvar randomBytes = require('randombytes');1module.exports = findPrime;2findPrime.simpleSieve = simpleSieve;3findPrime.fermatTest = fermatTest;4var BN = require('bn.js');5var TWENTYFOUR = new BN(24);6var MillerRabin = require('miller-rabin');7var millerRabin = new MillerRabin();8var ONE = new BN(1);9var TWO = new BN(2);10var FIVE = new BN(5);11var SIXTEEN = new BN(16);12var EIGHT = new BN(8);13var TEN = new BN(10);14var THREE = new BN(3);15var SEVEN = new BN(7);16var ELEVEN = new BN(11);17var FOUR = new BN(4);18var TWELVE = new BN(12);19var primes = null;2021function _getPrimes() {22if (primes !== null)23return primes;2425var limit = 0x100000;26var res = [];27res[0] = 2;28for (var i = 1, k = 3; k < limit; k += 2) {29var sqrt = Math.ceil(Math.sqrt(k));30for (var j = 0; j < i && res[j] <= sqrt; j++)31if (k % res[j] === 0)32break;3334if (i !== j && res[j] <= sqrt)35continue;3637res[i++] = k;38}39primes = res;40return res;41}4243function simpleSieve(p) {44var primes = _getPrimes();4546for (var i = 0; i < primes.length; i++)47if (p.modn(primes[i]) === 0) {48if (p.cmpn(primes[i]) === 0) {49return true;50} else {51return false;52}53}5455return true;56}5758function fermatTest(p) {59var red = BN.mont(p);60return TWO.toRed(red).redPow(p.subn(1)).fromRed().cmpn(1) === 0;61}6263function findPrime(bits, gen) {64if (bits < 16) {65// this is what openssl does66if (gen === 2 || gen === 5) {67return new BN([0x8c, 0x7b]);68} else {69return new BN([0x8c, 0x27]);70}71}72gen = new BN(gen);73var runs, comp;74function generateRandom(bits) {75runs = -1;76var out = new BN(randomBytes(Math.ceil(bits / 8)));77while (out.bitLength() > bits) {78out.ishrn(1);79}80if (out.isEven()) {81out.iadd(ONE);82}83if (!out.testn(1)) {84out.iadd(TWO);85}86if (!gen.cmp(TWO)) {87while (out.mod(TWENTYFOUR).cmp(ELEVEN)) {88out.iadd(FOUR);89}90comp = {91major: [TWENTYFOUR],92minor: [TWELVE]93};94} else if (!gen.cmp(FIVE)) {95rem = out.mod(TEN);96while (rem.cmp(THREE)) {97out.iadd(FOUR);98rem = out.mod(TEN);99}100comp = {101major: [FOUR, SIXTEEN],102minor: [TWO, EIGHT]103};104} else {105comp = {106major: [FOUR],107minor: [TWO]108};109}110return out;111}112var num = generateRandom(bits);113114var n2 = num.shrn(1);115116while (true) {117while (num.bitLength() > bits) {118num = generateRandom(bits);119n2 = num.shrn(1);120}121runs++;122if (simpleSieve(n2) && simpleSieve(num) &&123fermatTest(n2) && fermatTest(num) &&124millerRabin.test(n2) && millerRabin.test(num)) {125return num;126}127num.iadd(comp.major[runs%comp.major.length]);128n2.iadd(comp.minor[runs%comp.minor.length]);129}130131}132133