react / wstein / node_modules / browserify / node_modules / crypto-browserify / node_modules / diffie-hellman / lib / dh.js
80552 viewsvar BN = require('bn.js');1var MillerRabin = require('miller-rabin');2var millerRabin = new MillerRabin();3var TWENTYFOUR = new BN(24);4var ELEVEN = new BN(11);5var TEN = new BN(10);6var THREE = new BN(3);7var SEVEN = new BN(7);8var primes = require('./generatePrime');9var randomBytes = require('randombytes');10module.exports = DH;1112function setPublicKey(pub, enc) {13enc = enc || 'utf8';14if (!Buffer.isBuffer(pub)) {15pub = new Buffer(pub, enc);16}17this._pub = new BN(pub);18return this;19}2021function setPrivateKey(priv, enc) {22enc = enc || 'utf8';23if (!Buffer.isBuffer(priv)) {24priv = new Buffer(priv, enc);25}26this._priv = new BN(priv);27return this;28}2930var primeCache = {};31function checkPrime(prime, generator) {32var gen = generator.toString('hex');33var hex = [gen, prime.toString(16)].join('_');34if (hex in primeCache) {35return primeCache[hex];36}37var error = 0;3839if (prime.isEven() ||40!primes.simpleSieve ||41!primes.fermatTest(prime) ||42!millerRabin.test(prime)) {43//not a prime so +144error += 1;4546if (gen === '02' || gen === '05') {47// we'd be able to check the generator48// it would fail so +849error += 8;50} else {51//we wouldn't be able to test the generator52// so +453error += 4;54}55primeCache[hex] = error;56return error;57}58if (!millerRabin.test(prime.shrn(1))) {59//not a safe prime60error += 2;61}62var rem;63switch (gen) {64case '02':65if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) {66// unsuidable generator67error += 8;68}69break;70case '05':71rem = prime.mod(TEN);72if (rem.cmp(THREE) && rem.cmp(SEVEN)) {73// prime mod 10 needs to equal 3 or 774error += 8;75}76break;77default:78error += 4;79}80primeCache[hex] = error;81return error;82}8384function defineError (self, error) {85try {86Object.defineProperty(self, 'verifyError', {87enumerable: true,88value: error,89writable: false90});91} catch(e) {92self.verifyError = error;93}94}95function DH(prime, generator, malleable) {96this.setGenerator(generator);97this.__prime = new BN(prime);98this._prime = BN.mont(this.__prime);99this._primeLen = prime.length;100this._pub = void 0;101this._priv = void 0;102103if (malleable) {104this.setPublicKey = setPublicKey;105this.setPrivateKey = setPrivateKey;106defineError(this, checkPrime(this.__prime, generator));107} else {108defineError(this, 8);109}110}111112DH.prototype.generateKeys = function () {113if (!this._priv) {114this._priv = new BN(randomBytes(this._primeLen));115}116this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed();117return this.getPublicKey();118};119120DH.prototype.computeSecret = function (other) {121other = new BN(other);122other = other.toRed(this._prime);123var secret = other.redPow(this._priv).fromRed();124var out = new Buffer(secret.toArray());125var prime = this.getPrime();126if (out.length < prime.length) {127var front = new Buffer(prime.length - out.length);128front.fill(0);129out = Buffer.concat([front, out]);130}131return out;132};133134DH.prototype.getPublicKey = function getPublicKey(enc) {135return formatReturnValue(this._pub, enc);136};137138DH.prototype.getPrivateKey = function getPrivateKey(enc) {139return formatReturnValue(this._priv, enc);140};141142DH.prototype.getPrime = function (enc) {143return formatReturnValue(this.__prime, enc);144};145146DH.prototype.getGenerator = function (enc) {147return formatReturnValue(this._gen, enc);148};149150DH.prototype.setGenerator = function (gen, enc) {151enc = enc || 'utf8';152if (!Buffer.isBuffer(gen)) {153gen = new Buffer(gen, enc);154}155this._gen = new BN(gen);156return this;157};158159function formatReturnValue(bn, enc) {160var buf = new Buffer(bn.toArray());161if (!enc) {162return buf;163} else {164return buf.toString(enc);165}166}167168