99 lines
2.0 KiB
JavaScript
99 lines
2.0 KiB
JavaScript
/**
|
|
* 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;
|