Typechecking indexes
As a consequence, it will not allow accidentally double-hardened indexes. It also won't allow strings or forgotten parameters.
This commit is contained in:
parent
75bd8331cd
commit
4a72001335
3 changed files with 51 additions and 0 deletions
|
@ -206,6 +206,8 @@ HDNode.prototype.toBase58 = function (__isPrivate) {
|
||||||
|
|
||||||
// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#child-key-derivation-ckd-functions
|
// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#child-key-derivation-ckd-functions
|
||||||
HDNode.prototype.derive = function (index) {
|
HDNode.prototype.derive = function (index) {
|
||||||
|
typeforce(types.UInt32, index)
|
||||||
|
|
||||||
var isHardened = index >= HDNode.HIGHEST_BIT
|
var isHardened = index >= HDNode.HIGHEST_BIT
|
||||||
var data = new Buffer(37)
|
var data = new Buffer(37)
|
||||||
|
|
||||||
|
@ -277,6 +279,8 @@ HDNode.prototype.derive = function (index) {
|
||||||
}
|
}
|
||||||
|
|
||||||
HDNode.prototype.deriveHardened = function (index) {
|
HDNode.prototype.deriveHardened = function (index) {
|
||||||
|
typeforce(types.UInt31, index)
|
||||||
|
|
||||||
// Only derives hardened private keys by default
|
// Only derives hardened private keys by default
|
||||||
return this.derive(index + HDNode.HIGHEST_BIT)
|
return this.derive(index + HDNode.HIGHEST_BIT)
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,9 +12,13 @@ function Hash256bit (value) { return nBuffer(value, 32) }
|
||||||
function Buffer256bit (value) { return nBuffer(value, 32) }
|
function Buffer256bit (value) { return nBuffer(value, 32) }
|
||||||
|
|
||||||
var UINT53_MAX = Math.pow(2, 53) - 1
|
var UINT53_MAX = Math.pow(2, 53) - 1
|
||||||
|
var UINT31_MAX = Math.pow(2, 31) - 1
|
||||||
function UInt2 (value) { return (value & 3) === value }
|
function UInt2 (value) { return (value & 3) === value }
|
||||||
function UInt8 (value) { return (value & 0xff) === value }
|
function UInt8 (value) { return (value & 0xff) === value }
|
||||||
function UInt32 (value) { return (value >>> 0) === value }
|
function UInt32 (value) { return (value >>> 0) === value }
|
||||||
|
function UInt31 (value) {
|
||||||
|
return UInt32(value) && value <= UINT31_MAX
|
||||||
|
}
|
||||||
function UInt53 (value) {
|
function UInt53 (value) {
|
||||||
return typeforce.Number(value) &&
|
return typeforce.Number(value) &&
|
||||||
value >= 0 &&
|
value >= 0 &&
|
||||||
|
@ -51,6 +55,7 @@ var types = {
|
||||||
Network: Network,
|
Network: Network,
|
||||||
UInt2: UInt2,
|
UInt2: UInt2,
|
||||||
UInt8: UInt8,
|
UInt8: UInt8,
|
||||||
|
UInt31: UInt31,
|
||||||
UInt32: UInt32,
|
UInt32: UInt32,
|
||||||
UInt53: UInt53
|
UInt53: UInt53
|
||||||
}
|
}
|
||||||
|
|
|
@ -327,5 +327,47 @@ describe('HDNode', function () {
|
||||||
master.deriveHardened(c.m)
|
master.deriveHardened(c.m)
|
||||||
}, /Could not derive hardened child key/)
|
}, /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/)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue