HDNode: use throw over assert

This commit is contained in:
Daniel Cousens 2015-07-28 17:30:14 +10:00
parent 430cdde766
commit bdf92f73b4
2 changed files with 16 additions and 15 deletions
src
test/fixtures

View file

@ -1,4 +1,3 @@
var assert = require('assert')
var base58check = require('bs58check') var base58check = require('bs58check')
var bcrypto = require('./crypto') var bcrypto = require('./crypto')
var createHmac = require('create-hmac') var createHmac = require('create-hmac')
@ -27,9 +26,9 @@ function HDNode (keyPair, chainCode) {
typeForce('ECPair', keyPair) typeForce('ECPair', keyPair)
typeForce('Buffer', chainCode) typeForce('Buffer', chainCode)
assert.equal(chainCode.length, 32, 'Expected chainCode length of 32, got ' + chainCode.length) if (chainCode.length !== 32) throw new TypeError('Expected chainCode length of 32, got ' + chainCode.length)
assert('bip32' in keyPair.network, 'Unknown BIP32 constants for network') if (!keyPair.network.bip32) throw new TypeError('Unknown BIP32 constants for network')
assert.equal(keyPair.compressed, true, 'BIP32 only allows compressed keyPairs') if (!keyPair.compressed) throw new TypeError('BIP32 only allows compressed keyPairs')
this.keyPair = keyPair this.keyPair = keyPair
this.chainCode = chainCode this.chainCode = chainCode
@ -45,8 +44,8 @@ HDNode.LENGTH = 78
HDNode.fromSeedBuffer = function (seed, network) { HDNode.fromSeedBuffer = function (seed, network) {
typeForce('Buffer', seed) typeForce('Buffer', seed)
assert(seed.length >= 16, 'Seed should be at least 128 bits') if (seed.length < 16) throw new TypeError('Seed should be at least 128 bits')
assert(seed.length <= 64, 'Seed should be at most 512 bits') if (seed.length > 64) throw new TypeError('Seed should be at most 512 bits')
var I = createHmac('sha512', HDNode.MASTER_SECRET).update(seed).digest() var I = createHmac('sha512', HDNode.MASTER_SECRET).update(seed).digest()
var IL = I.slice(0, 32) var IL = I.slice(0, 32)
@ -68,13 +67,14 @@ HDNode.fromSeedHex = function (hex, network) {
HDNode.fromBase58 = function (string, network) { HDNode.fromBase58 = function (string, network) {
var buffer = base58check.decode(string) var buffer = base58check.decode(string)
assert.strictEqual(buffer.length, HDNode.LENGTH, 'Invalid buffer length') if (buffer.length !== HDNode.LENGTH) throw new Error('Invalid buffer length')
// 4 byte: version bytes // 4 byte: version bytes
var version = buffer.readUInt32BE(0) var version = buffer.readUInt32BE(0)
if (network) { if (network) {
assert(version === network.bip32.private || version === network.bip32.public, "Network doesn't match") if (version !== network.bip32.private &&
version !== network.bip32.public) throw new Error('Invalid network')
// auto-detect // auto-detect
} else { } else {
@ -87,13 +87,13 @@ HDNode.fromBase58 = function (string, network) {
// 4 bytes: the fingerprint of the parent's key (0x00000000 if master key) // 4 bytes: the fingerprint of the parent's key (0x00000000 if master key)
var parentFingerprint = buffer.readUInt32BE(5) var parentFingerprint = buffer.readUInt32BE(5)
if (depth === 0) { if (depth === 0) {
assert.strictEqual(parentFingerprint, 0x00000000, 'Invalid parent fingerprint') if (parentFingerprint !== 0x00000000) throw new Error('Invalid parent fingerprint')
} }
// 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized. // 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized.
// This is encoded in MSB order. (0x00000000 if master key) // This is encoded in MSB order. (0x00000000 if master key)
var index = buffer.readUInt32BE(9) var index = buffer.readUInt32BE(9)
assert(depth > 0 || index === 0, 'Invalid index') if (depth === 0 && index !== 0) throw new Error('Invalid index')
// 32 bytes: the chain code // 32 bytes: the chain code
var chainCode = buffer.slice(13, 45) var chainCode = buffer.slice(13, 45)
@ -101,7 +101,8 @@ HDNode.fromBase58 = function (string, network) {
// 33 bytes: private key data (0x00 + k) // 33 bytes: private key data (0x00 + k)
if (version === network.bip32.private) { if (version === network.bip32.private) {
assert.strictEqual(buffer.readUInt8(45), 0x00, 'Invalid private key') if (buffer.readUInt8(45) !== 0x00) throw new Error('Invalid private key')
data = buffer.slice(46, 78) data = buffer.slice(46, 78)
var d = BigInteger.fromBuffer(data) var d = BigInteger.fromBuffer(data)
@ -113,7 +114,7 @@ HDNode.fromBase58 = function (string, network) {
} else { } else {
data = buffer.slice(45, 78) data = buffer.slice(45, 78)
var Q = ecurve.Point.decodeFrom(curve, data) var Q = ecurve.Point.decodeFrom(curve, data)
assert.equal(Q.compressed, true, 'Invalid public key') if (!Q.compressed) throw new Error('Invalid public key')
// Verify that the X coordinate in the public point corresponds to a point on the curve. // Verify that the X coordinate in the public point corresponds to a point on the curve.
// If not, the extended public key is invalid. // If not, the extended public key is invalid.
@ -158,7 +159,7 @@ HDNode.prototype.neutered = function () {
} }
HDNode.prototype.toBase58 = function (__isPrivate) { HDNode.prototype.toBase58 = function (__isPrivate) {
assert.strictEqual(__isPrivate, undefined, 'Unsupported argument in 2.0.0') if (__isPrivate !== undefined) throw new TypeError('Unsupported argument in 2.0.0')
// Version // Version
var network = this.keyPair.network var network = this.keyPair.network
@ -207,7 +208,7 @@ HDNode.prototype.derive = function (index) {
// Hardened child // Hardened child
if (isHardened) { if (isHardened) {
assert(this.keyPair.d, 'Could not derive hardened child key') if (!this.keyPair.d) throw new TypeError('Could not derive hardened child key')
// data = 0x00 || ser256(kpar) || ser32(index) // data = 0x00 || ser256(kpar) || ser32(index)
data = Buffer.concat([ data = Buffer.concat([

View file

@ -203,7 +203,7 @@
"string": "1111111111111adADjFaSNPxwXqLjHLj4mBfYxuewDPbw9hEj1uaXCzMxRPXDFF3cUoezTFYom4sEmEVSQmENPPR315cFk9YUFVek73wE9" "string": "1111111111111adADjFaSNPxwXqLjHLj4mBfYxuewDPbw9hEj1uaXCzMxRPXDFF3cUoezTFYom4sEmEVSQmENPPR315cFk9YUFVek73wE9"
}, },
{ {
"exception": "Network doesn\\'t match", "exception": "Invalid network",
"string": "Ltpv73XYpw28ZyVe2zEVyiFnxUZxoKLGQNdZ8NxUi1WcqjNmMBgtLbh3KimGSnPHCoLv1RmvxHs4dnKmo1oXQ8dXuDu8uroxrbVxZPA1gXboYvx", "string": "Ltpv73XYpw28ZyVe2zEVyiFnxUZxoKLGQNdZ8NxUi1WcqjNmMBgtLbh3KimGSnPHCoLv1RmvxHs4dnKmo1oXQ8dXuDu8uroxrbVxZPA1gXboYvx",
"network": "bitcoin" "network": "bitcoin"
} }