Skip to content

Commit

Permalink
Merge pull request #539 from runn1ng/patch-3
Browse files Browse the repository at this point in the history
Adding some checks on deriving indexes
  • Loading branch information
dcousens committed Feb 7, 2016
2 parents 75bd833 + 4a72001 commit b3b2397
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/hdnode.js
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,8 @@ HDNode.prototype.toBase58 = function (__isPrivate) {

// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#child-key-derivation-ckd-functions
HDNode.prototype.derive = function (index) {
typeforce(types.UInt32, index)

var isHardened = index >= HDNode.HIGHEST_BIT
var data = new Buffer(37)

Expand Down Expand Up @@ -277,6 +279,8 @@ HDNode.prototype.derive = function (index) {
}

HDNode.prototype.deriveHardened = function (index) {
typeforce(types.UInt31, index)

// Only derives hardened private keys by default
return this.derive(index + HDNode.HIGHEST_BIT)
}
Expand Down
5 changes: 5 additions & 0 deletions src/types.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,13 @@ function Hash256bit (value) { return nBuffer(value, 32) }
function Buffer256bit (value) { return nBuffer(value, 32) }

var UINT53_MAX = Math.pow(2, 53) - 1
var UINT31_MAX = Math.pow(2, 31) - 1
function UInt2 (value) { return (value & 3) === value }
function UInt8 (value) { return (value & 0xff) === value }
function UInt32 (value) { return (value >>> 0) === value }
function UInt31 (value) {
return UInt32(value) && value <= UINT31_MAX
}
function UInt53 (value) {
return typeforce.Number(value) &&
value >= 0 &&
Expand Down Expand Up @@ -51,6 +55,7 @@ var types = {
Network: Network,
UInt2: UInt2,
UInt8: UInt8,
UInt31: UInt31,
UInt32: UInt32,
UInt53: UInt53
}
Expand Down
42 changes: 42 additions & 0 deletions test/hdnode.js
Original file line number Diff line number Diff line change
Expand Up @@ -327,5 +327,47 @@ describe('HDNode', function () {
master.deriveHardened(c.m)
}, /Could not derive hardened child key/)
})

it('throws on negative indexes', function () {
var f = fixtures.valid[0]
var master = HDNode.fromBase58(f.master.base58, NETWORKS_LIST)

assert.throws(function () {
master.deriveHardened(-1)
}, /Expected UInt31/)
assert.throws(function () {
master.derive(-1)
}, /Expected UInt32/)
})

it('throws on high indexes', function () {
var f = fixtures.valid[0]
var master = HDNode.fromBase58(f.master.base58, NETWORKS_LIST)

assert.throws(function () {
master.deriveHardened(0x80000000)
}, /Expected UInt31/)
assert.throws(function () {
master.derive(0x100000000)
}, /Expected UInt32/)
})

it('throws on non-numbers', function () {
var f = fixtures.valid[0]
var master = HDNode.fromBase58(f.master.base58, NETWORKS_LIST)

assert.throws(function () {
master.deriveHardened()
}, /Expected UInt31/)
assert.throws(function () {
master.derive()
}, /Expected UInt32/)
assert.throws(function () {
master.deriveHardened('foo')
}, /Expected UInt31/)
assert.throws(function () {
master.derive('foo')
}, /Expected UInt32/)
})
})
})

0 comments on commit b3b2397

Please sign in to comment.