feat: implement all needed BigNumber methods

This commit is contained in:
nanov 2019-11-07 08:57:44 +02:00
parent 429e807994
commit aad0bd97c8

View File

@ -3,9 +3,26 @@
const { jsbn: { BigInteger } } = require('node-forge'); const { jsbn: { BigInteger } } = require('node-forge');
class BigNumber { class BigNumber {
constructor(value = '') { constructor(value, radix = 10) {
if (value === null || value === undefined)
throw new Error('value is missing.');
this._n = new BigInteger(null); this._n = new BigInteger(null);
if (value instanceof BigNumber)
this._n = value._n;
else if (value instanceof BigInteger)
this._n = value;
else if (typeof value === 'number')
this._n.fromInt(value); this._n.fromInt(value);
else if (typeof value === 'string')
this._n.fromString(value, radix);
else if (Buffer.isBuffer(value))
this._n.fromString(value.toString('hex'), 16);
else if (Array.isArray(value))
this._n.fromString(Buffer.from(value).toString('hex'), 16);
else
throw new TypeError('Unsupported value type.');
} }
toBEBuffer(length = undefined) { toBEBuffer(length = undefined) {
@ -16,6 +33,34 @@ class BigNumber {
arr.unshift(0); arr.unshift(0);
return Buffer.from(arr); return Buffer.from(arr);
} }
toBuffer() {
return Buffer.from(this._n.toByteArray());
}
toString(radix = 10) {
return this._n.toString(radix);
}
and(num) {
return new BigNumber(this._n.and(new BigNumber(num)._n));
}
mul(num) {
return new BigNumber(this._n.multiply(new BigNumber(num)._n));
}
mod(num) {
return new BigNumber(this._n.mod(new BigNumber(num)._n));
}
shrn(num) {
return new BigNumber(this._n.shiftRight(new BigNumber(num)._n));
}
static fromBuffer(buf) {
return new BigNumber(buf.toString('hex'), 16);
}
} }
module.exports = BigNumber; module.exports = BigNumber;