ecdsa: moved all signature encoding to ECSignature

This commit is contained in:
Daniel Cousens 2014-06-15 16:44:52 +10:00
parent c5252fc509
commit eb3d9a25f7
9 changed files with 350 additions and 297 deletions

View file

@ -2,6 +2,7 @@ var assert = require('assert')
var crypto = require('./crypto')
var BigInteger = require('bigi')
var ECSignature = require('./ecsignature')
var Point = require('ecurve').Point
function deterministicGenerateK(curve, hash, d) {
@ -51,7 +52,7 @@ function sign(curve, hash, d) {
s = n.subtract(s)
}
return {r: r, s: s}
return new ECSignature(r, s)
}
function verify(curve, hash, signature, Q) {
@ -81,102 +82,6 @@ function verifyRaw(curve, e, signature, Q) {
return v.equals(r)
}
/**
* Serialize a signature into DER format.
*
* Takes two BigIntegers representing r and s and returns a byte array.
*/
function serializeSig(signature) {
var rBa = signature.r.toDERInteger()
var sBa = signature.s.toDERInteger()
var sequence = []
sequence.push(0x02) // INTEGER
sequence.push(rBa.length)
sequence = sequence.concat(rBa)
sequence.push(0x02) // INTEGER
sequence.push(sBa.length)
sequence = sequence.concat(sBa)
sequence.unshift(sequence.length)
sequence.unshift(0x30) // SEQUENCE
return new Buffer(sequence)
}
/**
* Parses a buffer containing a DER-encoded signature.
*
* This function will return an object of the form:
*
* {
* r: BigInteger,
* s: BigInteger
* }
*/
function parseSig(buffer) {
assert.equal(buffer.readUInt8(0), 0x30, 'Not a DER sequence')
assert.equal(buffer.readUInt8(1), buffer.length - 2, 'Invalid sequence length')
assert.equal(buffer.readUInt8(2), 0x02, 'Expected a DER integer')
var rLen = buffer.readUInt8(3)
var rB = buffer.slice(4, 4 + rLen)
var offset = 4 + rLen
assert.equal(buffer.readUInt8(offset), 0x02, 'Expected a DER integer (2)')
var sLen = buffer.readUInt8(1 + offset)
var sB = buffer.slice(2 + offset)
offset += 2 + sLen
assert.equal(offset, buffer.length, 'Invalid DER encoding')
return {
r: BigInteger.fromDERInteger(rB),
s: BigInteger.fromDERInteger(sB)
}
}
function serializeSigCompact(signature, i, compressed) {
if (compressed) {
i += 4
}
i += 27
var buffer = new Buffer(65)
buffer.writeUInt8(i, 0)
signature.r.toBuffer(32).copy(buffer, 1)
signature.s.toBuffer(32).copy(buffer, 33)
return buffer
}
function parseSigCompact(buffer) {
assert.equal(buffer.length, 65, 'Invalid signature length')
var i = buffer.readUInt8(0) - 27
// At most 3 bits
assert.equal(i, i & 7, 'Invalid signature parameter')
var compressed = !!(i & 4)
// Recovery param only
i = i & 3
var r = BigInteger.fromBuffer(buffer.slice(1, 33))
var s = BigInteger.fromBuffer(buffer.slice(33))
return {
signature: {
r: r,
s: s
},
i: i,
compressed: compressed
}
}
/**
* Recover a public key from a signature.
*
@ -269,9 +174,5 @@ module.exports = {
recoverPubKey: recoverPubKey,
sign: sign,
verify: verify,
verifyRaw: verifyRaw,
serializeSig: serializeSig,
parseSig: parseSig,
serializeSigCompact: serializeSigCompact,
parseSigCompact: parseSigCompact
verifyRaw: verifyRaw
}