From 1e23085ad7e28172440c7335af1350977da58ca4 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Fri, 21 Aug 2015 20:35:22 +1000 Subject: [PATCH] use bip66 module --- package.json | 1 + src/ecsignature.js | 52 +++++++--------------------------------------- 2 files changed, 8 insertions(+), 45 deletions(-) diff --git a/package.json b/package.json index d74bd03..538dd80 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ }, "dependencies": { "bigi": "^1.4.0", + "bip66": "^1.0.2", "bs58check": "^1.0.5", "create-hash": "^1.1.0", "create-hmac": "^1.1.3", diff --git a/src/ecsignature.js b/src/ecsignature.js index 940387b..4fd3b8f 100644 --- a/src/ecsignature.js +++ b/src/ecsignature.js @@ -1,3 +1,4 @@ +var bip66 = require('bip66') var typeforce = require('typeforce') var types = require('./types') @@ -29,36 +30,10 @@ ECSignature.parseCompact = function (buffer) { } } -// Strict DER - https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki -// NOTE: SIGHASH byte ignored ECSignature.fromDER = function (buffer) { - // Format: 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S] - if (buffer.length < 8) throw new Error('DER sequence too short') - if (buffer.length > 72) throw new Error('DER sequence too long') - if (buffer[0] !== 0x30) throw new Error('Not a DER sequence') - if (buffer[1] !== buffer.length - 2) throw new Error('Invalid sequence length') - if (buffer[2] !== 0x02) throw new Error('Expected a DER integer') - - var lenR = buffer[3] - if (lenR === 0) throw new Error('R length is zero') - if (5 + lenR >= buffer.length) throw new Error('Invalid DER encoding') - if (buffer[4 + lenR] !== 0x02) throw new Error('Expected a DER integer (2)') - - var lenS = buffer[5 + lenR] - if (lenS === 0) throw new Error('S length is zero') - if ((lenR + lenS + 6) !== buffer.length) throw new Error('Invalid DER encoding (2)') - - if (buffer[4] & 0x80) throw new Error('R value is negative') - if (lenR > 1 && (buffer[4] === 0x00) && !(buffer[5] & 0x80)) throw new Error('R value excessively padded') - - if (buffer[lenR + 6] & 0x80) throw new Error('S value is negative') - if (lenS > 1 && (buffer[lenR + 6] === 0x00) && !(buffer[lenR + 7] & 0x80)) throw new Error('S value excessively padded') - - // non-BIP66 - extract R, S values - var rB = buffer.slice(4, 4 + lenR) - var sB = buffer.slice(lenR + 6) - var r = BigInteger.fromDERInteger(rB) - var s = BigInteger.fromDERInteger(sB) + var decode = bip66.decode(buffer) + var r = BigInteger.fromDERInteger(decode.r) + var s = BigInteger.fromDERInteger(decode.s) return new ECSignature(r, s) } @@ -93,23 +68,10 @@ ECSignature.prototype.toCompact = function (i, compressed) { } ECSignature.prototype.toDER = function () { - var rBa = this.r.toDERInteger() - var sBa = this.s.toDERInteger() + var r = new Buffer(this.r.toDERInteger()) + var s = new Buffer(this.s.toDERInteger()) - var sequence = [] - - // INTEGER - sequence.push(0x02, rBa.length) - sequence = sequence.concat(rBa) - - // INTEGER - sequence.push(0x02, sBa.length) - sequence = sequence.concat(sBa) - - // SEQUENCE - sequence.unshift(0x30, sequence.length) - - return new Buffer(sequence) + return bip66.encode(r, s) } ECSignature.prototype.toScriptSignature = function (hashType) {