From 9aad77e01bd26b6519347ce4e6a27b34b0abab0b Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Tue, 28 Mar 2017 00:18:33 -0300 Subject: [PATCH] Read address version as unsigned integer That prevents large address versions to be read as negative numbers and failing to lookup the correct network from the Networks map. --- lib/hdprivatekey.js | 6 +++--- lib/hdpublickey.js | 8 ++++---- lib/util/buffer.js | 11 +++++++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/lib/hdprivatekey.js b/lib/hdprivatekey.js index cd65f8d1f..867bc8674 100644 --- a/lib/hdprivatekey.js +++ b/lib/hdprivatekey.js @@ -341,7 +341,7 @@ HDPrivateKey._validateNetwork = function(data, networkArg) { return new errors.InvalidNetworkArgument(networkArg); } var version = data.slice(0, 4); - if (BufferUtil.integerFromBuffer(version) !== network.xprivkey) { + if (BufferUtil.unsignedIntegerFromBuffer(version) !== network.xprivkey) { return new errors.InvalidNetwork(version); } return null; @@ -477,7 +477,7 @@ HDPrivateKey.prototype._buildFromBuffers = function(arg) { } } - var network = Network.get(BufferUtil.integerFromBuffer(arg.version)); + var network = Network.get(BufferUtil.unsignedIntegerFromBuffer(arg.version)); var xprivkey; xprivkey = Base58Check.encode(buffer.Buffer.concat(sequence)); arg.xprivkey = new Buffer(xprivkey); @@ -576,7 +576,7 @@ HDPrivateKey.prototype.inspect = function() { */ HDPrivateKey.prototype.toObject = HDPrivateKey.prototype.toJSON = function toObject() { return { - network: Network.get(BufferUtil.integerFromBuffer(this._buffers.version), 'xprivkey').name, + network: Network.get(BufferUtil.unsignedIntegerFromBuffer(this._buffers.version), 'xprivkey').name, depth: BufferUtil.integerFromSingleByteBuffer(this._buffers.depth), fingerPrint: BufferUtil.integerFromBuffer(this.fingerPrint), parentFingerPrint: BufferUtil.integerFromBuffer(this._buffers.parentFingerPrint), diff --git a/lib/hdpublickey.js b/lib/hdpublickey.js index b4024b726..ab076015b 100644 --- a/lib/hdpublickey.js +++ b/lib/hdpublickey.js @@ -256,7 +256,7 @@ HDPublicKey._validateNetwork = function(data, networkArg) { return new errors.InvalidNetworkArgument(networkArg); } var version = data.slice(HDPublicKey.VersionStart, HDPublicKey.VersionEnd); - if (BufferUtil.integerFromBuffer(version) !== network.xpubkey) { + if (BufferUtil.unsignedIntegerFromBuffer(version) !== network.xpubkey) { return new errors.InvalidNetwork(version); } return null; @@ -266,7 +266,7 @@ HDPublicKey.prototype._buildFromPrivate = function (arg) { var args = _.clone(arg._buffers); var point = Point.getG().mul(BN.fromBuffer(args.privateKey)); args.publicKey = Point.pointToCompressed(point); - args.version = BufferUtil.integerAsBuffer(Network.get(BufferUtil.integerFromBuffer(args.version)).xpubkey); + args.version = BufferUtil.integerAsBuffer(Network.get(BufferUtil.unsignedIntegerFromBuffer(args.version)).xpubkey); args.privateKey = undefined; args.checksum = undefined; args.xprivkey = undefined; @@ -344,7 +344,7 @@ HDPublicKey.prototype._buildFromBuffers = function(arg) { throw new errors.InvalidB58Checksum(concat, checksum); } } - var network = Network.get(BufferUtil.integerFromBuffer(arg.version)); + var network = Network.get(BufferUtil.unsignedIntegerFromBuffer(arg.version)); var xpubkey; xpubkey = Base58Check.encode(BufferUtil.concat(sequence)); @@ -430,7 +430,7 @@ HDPublicKey.prototype.inspect = function() { */ HDPublicKey.prototype.toObject = HDPublicKey.prototype.toJSON = function toObject() { return { - network: Network.get(BufferUtil.integerFromBuffer(this._buffers.version)).name, + network: Network.get(BufferUtil.unsignedIntegerFromBuffer(this._buffers.version)).name, depth: BufferUtil.integerFromSingleByteBuffer(this._buffers.depth), fingerPrint: BufferUtil.integerFromBuffer(this.fingerPrint), parentFingerPrint: BufferUtil.integerFromBuffer(this._buffers.parentFingerPrint), diff --git a/lib/util/buffer.js b/lib/util/buffer.js index c78b9396e..7fa7f3af2 100644 --- a/lib/util/buffer.js +++ b/lib/util/buffer.js @@ -123,6 +123,17 @@ module.exports = { return buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]; }, + /** + * Transform the first 4 values of a Buffer into a unsigned number, in little endian encoding + * + * @param {Buffer} buffer + * @return {number} + */ + unsignedIntegerFromBuffer: function unsignedIntegerFromBuffer(buffer) { + $.checkArgumentType(buffer, 'Buffer', 'buffer'); + return buffer.readUInt32BE(0); + }, + /** * Transforms the first byte of an array into a number ranging from -128 to 127 * @param {Buffer} buffer