From 05a8aeeb481187927c0bf96bbe54aa9d5b3880a1 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Thu, 14 Jan 2016 16:04:46 -0800 Subject: [PATCH] add bn2.js. --- lib/bcoin/bn.js | 98 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 lib/bcoin/bn.js diff --git a/lib/bcoin/bn.js b/lib/bcoin/bn.js new file mode 100644 index 00000000..7acb5700 --- /dev/null +++ b/lib/bcoin/bn.js @@ -0,0 +1,98 @@ +/** + * bn.js - signed big numbers for bcoin + * Copyright (c) 2014-2015, Fedor Indutny (MIT License) + * https://github.com/indutny/bcoin + */ + +var bn = require('bn.js'); + +/** + * Signed Big Numbers + */ + +function bn2(number, signed, base, endian) { + if (!(this instanceof bn2)) + return new bn2(number, signed, base, endian); + + if (typeof signed !== 'boolean') { + endian = base; + base = signed; + signed = null; + } + + this.__signed = !!signed; + + return bn.call(this, number, base, endian); +} + +bn2.prototype.__proto__ = bn.prototype; + +bn2.prototype._initArray = function _initArray(number, base, endian) { + var i = 0; + var ret; + + if (!this.__signed) + return bn.prototype._initArray.apply(this, arguments); + + if (endian === 'le') + i = number.length - 1; + + // If we are signed, do (~num + 1) to get + // the positive counterpart and set bn's + // negative flag. + if (number[i] & 0x80) { + if (isNegZero(number, endian)) { + ret = this._initNumber(0, 10, endian); + } else { + ret = bn.prototype._initArray.apply(this, arguments); + this.inotn(64).iaddn(1).ineg(); + } + } else { + ret = bn.prototype._initArray.apply(this, arguments); + } + + return ret; +}; + +bn2.prototype.toArray = function toArray(endian, length) { + var self = this; + + if (!this.__signed) + return bn.prototype.toArray.apply(self, arguments); + + // Convert the number to the + // negative byte representation. + if (self.isNeg()) { + if (self.cmpn(0) === 0) + self = new bn(0); + else + self = self.neg().notn(64).addn(1); + } + + return bn.prototype.toArray.apply(self, arguments); +}; + +bn2.signed = function signed(number, base, endian) { + return new bn2(number, true, base, endian); +}; + +function isNegZero(number, endian) { + var i = 0; + + if (endian === 'le') + i = number.length - 1; + + if (number[i] & 0x80) { + number = number.slice(); + number[i] &= ~0x80; + return new bn(number, endian).cmpn(0) === 0; + } + + return false; +} + +/** + * Expose + */ + +module.exports = bn2;