|
|
@ -8,15 +8,9 @@ var Message = require('../src/message') |
|
|
|
var fixtures = require('./fixtures/message.json') |
|
|
|
|
|
|
|
describe('Message', function() { |
|
|
|
var message |
|
|
|
|
|
|
|
beforeEach(function() { |
|
|
|
message = 'vires is numeris' |
|
|
|
}) |
|
|
|
|
|
|
|
describe('magicHash', function() { |
|
|
|
it('matches the test vectors', function() { |
|
|
|
fixtures.magicHash.forEach(function(f) { |
|
|
|
fixtures.valid.magicHash.forEach(function(f) { |
|
|
|
var network = networks[f.network] |
|
|
|
var actual = Message.magicHash(f.message, network) |
|
|
|
|
|
|
@ -26,58 +20,45 @@ describe('Message', function() { |
|
|
|
}) |
|
|
|
|
|
|
|
describe('verify', function() { |
|
|
|
var addr, sig, caddr, csig |
|
|
|
|
|
|
|
beforeEach(function() { |
|
|
|
addr = '16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM' // uncompressed
|
|
|
|
caddr = '1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs' // compressed
|
|
|
|
it('verifies a valid signature', function() { |
|
|
|
fixtures.valid.verify.forEach(function(f) { |
|
|
|
var network = networks[f.network] |
|
|
|
|
|
|
|
sig = new Buffer('G8JawPtQOrybrSP1WHQnQPr67B9S3qrxBrl1mlzoTJOSHEpmnF7D3+t+LX0Xei9J20B5AIdPbeL3AaTBZ4N3bY0=', 'base64') |
|
|
|
csig = new Buffer('H8JawPtQOrybrSP1WHQnQPr67B9S3qrxBrl1mlzoTJOSHEpmnF7D3+t+LX0Xei9J20B5AIdPbeL3AaTBZ4N3bY0=', 'base64') |
|
|
|
}) |
|
|
|
var s1 = new Buffer(f.signature, 'base64') |
|
|
|
assert.ok(Message.verify(f.address, s1, f.message, network)) |
|
|
|
|
|
|
|
it('can verify a signed message', function() { |
|
|
|
assert.ok(Message.verify(addr, sig, message)) |
|
|
|
}) |
|
|
|
if (f.compressed) { |
|
|
|
var s2 = new Buffer(f.compressed.signature, 'base64') |
|
|
|
|
|
|
|
it('will fail for the wrong message', function() { |
|
|
|
assert.ok(!Message.verify(addr, sig, 'foobar')) |
|
|
|
assert.ok(Message.verify(f.compressed.address, s2, f.message, network)) |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
it('will fail for the wrong address', function() { |
|
|
|
assert.ok(!Message.verify('1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a', sig, message)) |
|
|
|
}) |
|
|
|
|
|
|
|
it('does not cross verify (compressed/uncompressed)', function() { |
|
|
|
assert.ok(!Message.verify(addr, csig, message)) |
|
|
|
assert.ok(!Message.verify(caddr, sig, message)) |
|
|
|
fixtures.invalid.verify.forEach(function(f) { |
|
|
|
it(f.description, function() { |
|
|
|
var signature = new Buffer(f.signature, 'base64') |
|
|
|
assert.ok(!Message.verify(f.address, signature, f.message)) |
|
|
|
}) |
|
|
|
|
|
|
|
it('supports alternate networks', function() { |
|
|
|
var dogeaddr = 'DFpN6QqFfUm3gKNaxN6tNcab1FArL9cZLE' |
|
|
|
var dogesig = new Buffer('H6k+dZwJ8oOei3PCSpdj603fDvhlhQ+sqaFNIDvo/bI+Xh6zyIKGzZpyud6YhZ1a5mcrwMVtTWL+VXq/hC5Zj7s=', 'base64') |
|
|
|
|
|
|
|
assert.ok(Message.verify(dogeaddr, dogesig, message, networks.dogecoin)) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
describe('signing', function() { |
|
|
|
it('gives matching signatures irrespective of point compression', function() { |
|
|
|
var privKey = new ECKey(BigInteger.ONE, false) |
|
|
|
var compressedKey = new ECKey(privKey.D, true) |
|
|
|
|
|
|
|
var sig = Message.sign(privKey, message) |
|
|
|
var csig = Message.sign(compressedKey, message) |
|
|
|
fixtures.valid.signing.forEach(function(f) { |
|
|
|
it(f.description, function() { |
|
|
|
var network = networks[f.network] |
|
|
|
|
|
|
|
assert.notDeepEqual(sig.slice(0, 2), csig.slice(0, 2)) // unequal compression flags
|
|
|
|
assert.deepEqual(sig.slice(2), csig.slice(2)) // equal signatures
|
|
|
|
}) |
|
|
|
var k1 = new ECKey(new BigInteger(f.D), false) |
|
|
|
var s1 = Message.sign(k1, f.message, network) |
|
|
|
assert.equal(s1.toString('base64'), f.signature) |
|
|
|
|
|
|
|
it('supports alternate networks', function() { |
|
|
|
var privKey = new ECKey(BigInteger.ONE) |
|
|
|
var signature = Message.sign(privKey, message, networks.dogecoin) |
|
|
|
if (f.compressed) { |
|
|
|
var k2 = new ECKey(new BigInteger(f.D)) |
|
|
|
var s2 = Message.sign(k2, f.message) |
|
|
|
|
|
|
|
assert.equal(signature.toString('base64'), 'H6k+dZwJ8oOei3PCSpdj603fDvhlhQ+sqaFNIDvo/bI+Xh6zyIKGzZpyud6YhZ1a5mcrwMVtTWL+VXq/hC5Zj7s=') |
|
|
|
assert.equal(s2.toString('base64'), f.compressed.signature) |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|