|
@ -12,24 +12,30 @@ function ECSignature (r, s) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
ECSignature.parseCompact = function (buffer) { |
|
|
ECSignature.parseCompact = function (buffer) { |
|
|
if (buffer.length !== 65) throw new Error('Invalid signature length') |
|
|
typeforce(types.BufferN(65), buffer) |
|
|
|
|
|
|
|
|
var flagByte = buffer.readUInt8(0) - 27 |
|
|
var flagByte = buffer.readUInt8(0) - 27 |
|
|
if (flagByte !== (flagByte & 7)) throw new Error('Invalid signature parameter') |
|
|
if (flagByte !== (flagByte & 7)) throw new Error('Invalid signature parameter') |
|
|
|
|
|
|
|
|
var compressed = !!(flagByte & 4) |
|
|
var compressed = !!(flagByte & 4) |
|
|
var recoveryParam = flagByte & 3 |
|
|
var recoveryParam = flagByte & 3 |
|
|
|
|
|
var signature = ECSignature.fromRSBuffer(buffer.slice(1)) |
|
|
var r = BigInteger.fromBuffer(buffer.slice(1, 33)) |
|
|
|
|
|
var s = BigInteger.fromBuffer(buffer.slice(33)) |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
return { |
|
|
compressed: compressed, |
|
|
compressed: compressed, |
|
|
i: recoveryParam, |
|
|
i: recoveryParam, |
|
|
signature: new ECSignature(r, s) |
|
|
signature: signature |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ECSignature.fromRSBuffer = function (buffer) { |
|
|
|
|
|
typeforce(types.BufferN(64), buffer) |
|
|
|
|
|
|
|
|
|
|
|
var r = BigInteger.fromBuffer(buffer.slice(0, 32)) |
|
|
|
|
|
var s = BigInteger.fromBuffer(buffer.slice(32, 64)) |
|
|
|
|
|
return new ECSignature(r, s) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
ECSignature.fromDER = function (buffer) { |
|
|
ECSignature.fromDER = function (buffer) { |
|
|
var decode = bip66.decode(buffer) |
|
|
var decode = bip66.decode(buffer) |
|
|
var r = BigInteger.fromDERInteger(decode.r) |
|
|
var r = BigInteger.fromDERInteger(decode.r) |
|
@ -60,9 +66,7 @@ ECSignature.prototype.toCompact = function (i, compressed) { |
|
|
|
|
|
|
|
|
var buffer = Buffer.alloc(65) |
|
|
var buffer = Buffer.alloc(65) |
|
|
buffer.writeUInt8(i, 0) |
|
|
buffer.writeUInt8(i, 0) |
|
|
this.r.toBuffer(32).copy(buffer, 1) |
|
|
this.toRSBuffer(buffer, 1) |
|
|
this.s.toBuffer(32).copy(buffer, 33) |
|
|
|
|
|
|
|
|
|
|
|
return buffer |
|
|
return buffer |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -73,6 +77,13 @@ ECSignature.prototype.toDER = function () { |
|
|
return bip66.encode(r, s) |
|
|
return bip66.encode(r, s) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ECSignature.prototype.toRSBuffer = function (buffer, offset) { |
|
|
|
|
|
buffer = buffer || Buffer.alloc(64) |
|
|
|
|
|
this.r.toBuffer(32).copy(buffer, offset) |
|
|
|
|
|
this.s.toBuffer(32).copy(buffer, offset + 32) |
|
|
|
|
|
return buffer |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
ECSignature.prototype.toScriptSignature = function (hashType) { |
|
|
ECSignature.prototype.toScriptSignature = function (hashType) { |
|
|
var hashTypeMod = hashType & ~0x80 |
|
|
var hashTypeMod = hashType & ~0x80 |
|
|
if (hashTypeMod <= 0 || hashTypeMod >= 4) throw new Error('Invalid hashType ' + hashType) |
|
|
if (hashTypeMod <= 0 || hashTypeMod >= 4) throw new Error('Invalid hashType ' + hashType) |
|
|