diffie-hellman
Advanced tools
Comparing version 2.0.0 to 2.1.0
@@ -11,2 +11,7 @@ | ||
var TWO = new BN(2); | ||
var FIVE = new BN(5); | ||
var SIX = new BN(6); | ||
var TEN = new BN(10); | ||
var THREE = new BN(3); | ||
var SEVEN = new BN(7); | ||
var ELEVEN = new BN(11); | ||
@@ -51,12 +56,35 @@ var FOUR = new BN(4); | ||
} | ||
function findPrime(bits, crypto) { | ||
function findPrime(bits, gen ,crypto) { | ||
gen = new BN(gen); | ||
var runs, comp; | ||
function generateRandom(bits) { | ||
runs = -1; | ||
var r = crypto.randomBytes(Math.ceil(bits / 8)); | ||
r[0] |= 0xc0; | ||
r[r.length - 1] |= 3; | ||
var rem; | ||
var out = new BN(r); | ||
while (out.mod(TWENTYFOUR).cmp(ELEVEN)) { | ||
out.iadd(FOUR); | ||
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, SIX], | ||
minor: [TWO, THREE] | ||
}; | ||
} else { | ||
comp = { | ||
major: [FOUR], | ||
minor: [TWO] | ||
} | ||
} | ||
@@ -68,6 +96,6 @@ return out; | ||
var runs = 0; | ||
var n2 = num.shrn(1); | ||
while (true) { | ||
runs++; | ||
if (num.bitLength() > bits) { | ||
@@ -77,34 +105,15 @@ num = generateRandom(bits); | ||
} | ||
if (!simpleSieve(n2)) { | ||
num.iadd(TWENTYFOUR); | ||
n2.iadd(TWELVE); | ||
continue; | ||
} | ||
if (!fermatTest(n2)) { | ||
num.iadd(TWENTYFOUR); | ||
n2.iadd(TWELVE); | ||
continue; | ||
} | ||
if (!millerRabin.test(n2)) { | ||
num.iadd(TWENTYFOUR); | ||
n2.iadd(TWELVE); | ||
continue; | ||
} | ||
if (!simpleSieve(num)) { | ||
num.iadd(TWENTYFOUR); | ||
n2.iadd(TWELVE); | ||
continue; | ||
} | ||
if (!fermatTest(num)) { | ||
num.iadd(TWENTYFOUR); | ||
n2.iadd(TWELVE); | ||
continue; | ||
} | ||
if (millerRabin.test(num)) { | ||
runs++; | ||
if (simpleSieve(n2) && | ||
fermatTest(n2) && | ||
millerRabin.test(n2) && | ||
simpleSieve(num) && | ||
fermatTest(num) && | ||
millerRabin.test(num)) { | ||
return num; | ||
} | ||
num.iadd(TWENTYFOUR); | ||
n2.iadd(TWELVE); | ||
num.iadd(comp.major[runs%comp.major.length]); | ||
n2.iadd(comp.minor[runs%comp.minor.length]); | ||
} | ||
} |
@@ -14,5 +14,3 @@ var primes = require('./primes.json'); | ||
function DiffieHellman(prime, enc, generator, genc) { | ||
if (typeof prime === 'number') { | ||
return new DH(generatePrime(prime, crypto), new Buffer([2]), crypto, true); | ||
} | ||
if (Buffer.isBuffer(enc) || | ||
@@ -27,10 +25,14 @@ (typeof enc === 'string' && ['hex', 'binary', 'base64'].indexOf(enc) === -1)) { | ||
generator = generator || new Buffer([2]); | ||
if (!Buffer.isBuffer(generator)) { | ||
generator = new Buffer(generator, genc); | ||
} | ||
if (typeof prime === 'number') { | ||
return new DH(generatePrime(prime, generator, crypto), generator, crypto, true); | ||
} | ||
if (!Buffer.isBuffer(prime)) { | ||
prime = new Buffer(prime, enc); | ||
} | ||
if (!Buffer.isBuffer(generator)) { | ||
generator = new Buffer(generator, genc); | ||
} | ||
return new DH(prime, generator, crypto, true); | ||
}; | ||
} |
{ | ||
"name": "diffie-hellman", | ||
"version": "2.0.0", | ||
"version": "2.1.0", | ||
"description": "pure js diffie-hellman", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
23
test.js
@@ -8,3 +8,5 @@ var test = require('tape'); | ||
]; | ||
function isNode10() { | ||
return process.version && process.version.split('.').length === 3 && parseInt(process.version.split('.')[1], 10) <= 10; | ||
} | ||
var lens = [ | ||
@@ -39,10 +41,10 @@ 64, 65, 128, 384, 512, 1024, | ||
function bylen(t) { | ||
function bylen(t, generator) { | ||
return function (len){ | ||
t.test('' + len, function (t) { | ||
t.plan(5); | ||
var dh2 = myCrypto.createDiffieHellman(len); | ||
t.plan(6); | ||
var dh2 = myCrypto.createDiffieHellman(len, generator); | ||
var prime2 = dh2.getPrime(); | ||
var p2 = prime2.toString('hex'); | ||
var dh1 = nodeCrypto.createDiffieHellman(prime2, 2); | ||
var dh1 = nodeCrypto.createDiffieHellman(prime2, generator); | ||
//console.log('error', dh1.verifyError) | ||
@@ -55,2 +57,3 @@ var p1 = dh1.getPrime().toString('hex'); | ||
t.equals(p1, p2, 'equal primes'); | ||
t.equals(dh1.getGenerator('hex'), dh2.getGenerator('hex'), 'equal generators'); | ||
var pubk1 = dh1.getPublicKey(); | ||
@@ -89,6 +92,12 @@ var pubk2 = dh2.getPublicKey(); | ||
test('create primes', function (t) { | ||
var f = bylen(t); | ||
test('create primes gen 2', function (t) { | ||
var f = bylen(t, new Buffer([2])); | ||
lens2.forEach(f); | ||
}); | ||
if (!isNode10()) { | ||
test('create primes gen 5', function (t) { | ||
var f = bylen(t, new Buffer([5])); | ||
lens2.forEach(f); | ||
}); | ||
} | ||
@@ -95,0 +104,0 @@ test('create primes other way', function (t) { |
20582
470