From bf109f32a92e32a3ad55993e37facc486a32a818 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Fri, 16 May 2014 13:42:37 +1000 Subject: [PATCH] ECPubKey: improve tests and extract test data to fixtures The use of fixtures allows for more behavioural driven tests and simpler addition of more test cases in future. However, as ECPubKey is just a wrapper around other strenuously tested modules, the test data is currently limited to testing a subset of the total wrapper. This should probably be done better by using mocked out modules instead. --- test/ecpubkey.js | 155 ++++++++++++++++++++------------------ test/fixtures/ecpubkey.js | 19 +++++ 2 files changed, 101 insertions(+), 73 deletions(-) create mode 100644 test/fixtures/ecpubkey.js diff --git a/test/ecpubkey.js b/test/ecpubkey.js index faf338d..c7aefd8 100644 --- a/test/ecpubkey.js +++ b/test/ecpubkey.js @@ -1,95 +1,104 @@ var assert = require('assert') +var crypto = require('../src/crypto') +var sec = require('../src/sec') +var ecparams = sec('secp256k1') +var BigInteger = require('bigi') +var ECPointFp = require('../src/ec').ECPointFp var ECPubKey = require('../src/ecpubkey') +var fixtures = require('./fixtures/ecpubkey') + describe('ECPubKey', function() { - describe('toBuffer/toHex', function() { - var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992' - var hpub = '044b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea81199283fbec990dad6fb98f93f712d50cb874dd717de6a184158d63886dda3090f566' + var Q + + beforeEach(function() { + var curve = ecparams.getCurve() + + Q = new ECPointFp( + curve, + curve.fromBigInteger(new BigInteger(fixtures.Q.x)), + curve.fromBigInteger(new BigInteger(fixtures.Q.y)) + ) + }) - it('using toHex should support compression', function() { - var pub = ECPubKey.fromHex(hcpub) + describe('constructor', function() { + it('defaults to compressed', function() { + var pubKey = new ECPubKey(Q) - assert.equal(pub.toHex(), hcpub) - assert.equal(pub.compressed, true) + assert.equal(pubKey.compressed, true) }) - it('using toHex should support uncompressed', function() { - var pub = ECPubKey.fromHex(hpub) + it('supports the uncompressed flag', function() { + var pubKey = new ECPubKey(Q, false) - assert.equal(pub.toHex(), hpub) - assert.equal(pub.compressed, false) + assert.equal(pubKey.compressed, false) + }) + }) + + describe('fromHex/toHex', function() { + it('supports compressed points', function() { + var pubKey = ECPubKey.fromHex(fixtures.compressed.hex) + + assert(pubKey.Q.equals(Q)) + assert.equal(pubKey.toHex(), fixtures.compressed.hex) + assert.equal(pubKey.compressed, true) + }) + + it('supports uncompressed points', function() { + var pubKey = ECPubKey.fromHex(fixtures.uncompressed.hex) + + assert(pubKey.Q.equals(Q)) + assert.equal(pubKey.toHex(), fixtures.uncompressed.hex) + assert.equal(pubKey.compressed, false) }) }) describe('getAddress', function() { - var privkeys = [ - 'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458', - '1111111111111111111111111111111111111111111111111111111111111111', - '18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725' - ] - - // compressed pubkeys - var cpubkeys = [ - '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992', - '034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa', - '0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352' - ] - - var pubkeys = cpubkeys.map(function(x) { - var pk = ECPubKey.fromHex(x) - pk.compressed = false - return pk.toHex() + it('calculates the expected hash (compressed)', function() { + var pubKey = new ECPubKey(Q, true) + var address = pubKey.getAddress() + + assert.equal(address.hash.toString('hex'), fixtures.compressed.hash160) }) - it('bitcoin', function() { - var addresses = [ - '19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui', - '1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a', - '16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM' - ] - var compressedAddresses = [ - '1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q', - '1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9', - '1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs', - ] - - for (var i = 0; i < addresses.length; ++i) { - var pub = ECPubKey.fromHex(pubkeys[i]) - var cpub = ECPubKey.fromHex(cpubkeys[i]) - cpub.compressed = true - - var addr = addresses[i] - var caddr = compressedAddresses[i] - - assert.equal(pub.getAddress().toString(), addr) - assert.equal(cpub.getAddress().toString(), caddr) - } + it('calculates the expected hash (uncompressed)', function() { + var pubKey = new ECPubKey(Q, false) + var address = pubKey.getAddress() + + assert.equal(address.hash.toString('hex'), fixtures.uncompressed.hash160) + }) + + it('supports alternative networks', function() { + var pubKey = new ECPubKey(Q) + var address = pubKey.getAddress(0x09) + + assert.equal(address.version, 0x09) + assert.equal(address.hash.toString('hex'), fixtures.compressed.hash160) }) + }) + + describe('verify', function() { + var pubKey, signature + beforeEach(function() { + pubKey = new ECPubKey(Q) - it('testnet', function() { - var addresses = [ - '19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui', - '1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a', - '16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM' - ] - var compressedAddresses = [ - '1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q', - '1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9', - '1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs', - ] - - for (var i = 0; i < addresses.length; ++i) { - var pub = ECPubKey.fromHex(pubkeys[i]) - var cpub = ECPubKey.fromHex(cpubkeys[i]) - cpub.compressed = true - - var addr = addresses[i] - var caddr = compressedAddresses[i] - - assert.equal(pub.getAddress().toString(), addr) - assert.equal(cpub.getAddress().toString(), caddr) + signature = { + r: new BigInteger(fixtures.signature.r), + s: new BigInteger(fixtures.signature.s) } }) + + it('verifies a valid signature', function() { + var hash = crypto.sha256(fixtures.message) + + assert.ok(pubKey.verify(hash, signature)) + }) + + it('doesn\'t verify the wrong signature', function() { + var hash = crypto.sha256('mushrooms') + + assert.ok(!pubKey.verify(hash, signature)) + }) }) }) diff --git a/test/fixtures/ecpubkey.js b/test/fixtures/ecpubkey.js new file mode 100644 index 0000000..77b9b42 --- /dev/null +++ b/test/fixtures/ecpubkey.js @@ -0,0 +1,19 @@ +module.exports = { + "Q": { + "x": "55066263022277343669578718895168534326250603453777594175500187360389116729240", + "y": "32670510020758816978083085130507043184471273380659243275938904335757337482424" + }, + "compressed": { + "hex": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "hash160": "751e76e8199196d454941c45d1b3a323f1433bd6" + }, + "uncompressed": { + "hex": "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "hash160": "91b24bf9f5288532960ac687abb035127b1d28a5" + }, + "message": "vires in numeris", + "signature": { + "r": "68972263025625296948424563184904289678530916807200550828762374724416876919710", + "s": "43478152510424186005054433052302509227777805602212468112169549534899266476898" + } +} \ No newline at end of file