|
| 1 | +var bip66 = require('bip66') |
1 | 2 | var typeforce = require('typeforce') |
2 | 3 | var types = require('./types') |
3 | 4 |
|
@@ -29,36 +30,10 @@ ECSignature.parseCompact = function (buffer) { |
29 | 30 | } |
30 | 31 | } |
31 | 32 |
|
32 | | -// Strict DER - https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki |
33 | | -// NOTE: SIGHASH byte ignored |
34 | 33 | ECSignature.fromDER = function (buffer) { |
35 | | - // Format: 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S] |
36 | | - if (buffer.length < 8) throw new Error('DER sequence too short') |
37 | | - if (buffer.length > 72) throw new Error('DER sequence too long') |
38 | | - if (buffer[0] !== 0x30) throw new Error('Not a DER sequence') |
39 | | - if (buffer[1] !== buffer.length - 2) throw new Error('Invalid sequence length') |
40 | | - if (buffer[2] !== 0x02) throw new Error('Expected a DER integer') |
41 | | - |
42 | | - var lenR = buffer[3] |
43 | | - if (lenR === 0) throw new Error('R length is zero') |
44 | | - if (5 + lenR >= buffer.length) throw new Error('Invalid DER encoding') |
45 | | - if (buffer[4 + lenR] !== 0x02) throw new Error('Expected a DER integer (2)') |
46 | | - |
47 | | - var lenS = buffer[5 + lenR] |
48 | | - if (lenS === 0) throw new Error('S length is zero') |
49 | | - if ((lenR + lenS + 6) !== buffer.length) throw new Error('Invalid DER encoding (2)') |
50 | | - |
51 | | - if (buffer[4] & 0x80) throw new Error('R value is negative') |
52 | | - if (lenR > 1 && (buffer[4] === 0x00) && !(buffer[5] & 0x80)) throw new Error('R value excessively padded') |
53 | | - |
54 | | - if (buffer[lenR + 6] & 0x80) throw new Error('S value is negative') |
55 | | - if (lenS > 1 && (buffer[lenR + 6] === 0x00) && !(buffer[lenR + 7] & 0x80)) throw new Error('S value excessively padded') |
56 | | - |
57 | | - // non-BIP66 - extract R, S values |
58 | | - var rB = buffer.slice(4, 4 + lenR) |
59 | | - var sB = buffer.slice(lenR + 6) |
60 | | - var r = BigInteger.fromDERInteger(rB) |
61 | | - var s = BigInteger.fromDERInteger(sB) |
| 34 | + var decode = bip66.decode(buffer) |
| 35 | + var r = BigInteger.fromDERInteger(decode.r) |
| 36 | + var s = BigInteger.fromDERInteger(decode.s) |
62 | 37 |
|
63 | 38 | return new ECSignature(r, s) |
64 | 39 | } |
@@ -93,23 +68,10 @@ ECSignature.prototype.toCompact = function (i, compressed) { |
93 | 68 | } |
94 | 69 |
|
95 | 70 | ECSignature.prototype.toDER = function () { |
96 | | - var rBa = this.r.toDERInteger() |
97 | | - var sBa = this.s.toDERInteger() |
| 71 | + var r = new Buffer(this.r.toDERInteger()) |
| 72 | + var s = new Buffer(this.s.toDERInteger()) |
98 | 73 |
|
99 | | - var sequence = [] |
100 | | - |
101 | | - // INTEGER |
102 | | - sequence.push(0x02, rBa.length) |
103 | | - sequence = sequence.concat(rBa) |
104 | | - |
105 | | - // INTEGER |
106 | | - sequence.push(0x02, sBa.length) |
107 | | - sequence = sequence.concat(sBa) |
108 | | - |
109 | | - // SEQUENCE |
110 | | - sequence.unshift(0x30, sequence.length) |
111 | | - |
112 | | - return new Buffer(sequence) |
| 74 | + return bip66.encode(r, s) |
113 | 75 | } |
114 | 76 |
|
115 | 77 | ECSignature.prototype.toScriptSignature = function (hashType) { |
|
0 commit comments