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.
This commit is contained in:
parent
cf39de4035
commit
bf109f32a9
2 changed files with 94 additions and 66 deletions
test
141
test/ecpubkey.js
141
test/ecpubkey.js
|
@ -1,95 +1,104 @@
|
||||||
var assert = require('assert')
|
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 ECPubKey = require('../src/ecpubkey')
|
||||||
|
|
||||||
|
var fixtures = require('./fixtures/ecpubkey')
|
||||||
|
|
||||||
describe('ECPubKey', function() {
|
describe('ECPubKey', function() {
|
||||||
describe('toBuffer/toHex', function() {
|
var Q
|
||||||
var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992'
|
|
||||||
var hpub = '044b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea81199283fbec990dad6fb98f93f712d50cb874dd717de6a184158d63886dda3090f566'
|
|
||||||
|
|
||||||
it('using toHex should support compression', function() {
|
beforeEach(function() {
|
||||||
var pub = ECPubKey.fromHex(hcpub)
|
var curve = ecparams.getCurve()
|
||||||
|
|
||||||
assert.equal(pub.toHex(), hcpub)
|
Q = new ECPointFp(
|
||||||
assert.equal(pub.compressed, true)
|
curve,
|
||||||
|
curve.fromBigInteger(new BigInteger(fixtures.Q.x)),
|
||||||
|
curve.fromBigInteger(new BigInteger(fixtures.Q.y))
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('constructor', function() {
|
||||||
|
it('defaults to compressed', function() {
|
||||||
|
var pubKey = new ECPubKey(Q)
|
||||||
|
|
||||||
|
assert.equal(pubKey.compressed, true)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('using toHex should support uncompressed', function() {
|
it('supports the uncompressed flag', function() {
|
||||||
var pub = ECPubKey.fromHex(hpub)
|
var pubKey = new ECPubKey(Q, false)
|
||||||
|
|
||||||
assert.equal(pub.toHex(), hpub)
|
assert.equal(pubKey.compressed, false)
|
||||||
assert.equal(pub.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() {
|
describe('getAddress', function() {
|
||||||
var privkeys = [
|
it('calculates the expected hash (compressed)', function() {
|
||||||
'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458',
|
var pubKey = new ECPubKey(Q, true)
|
||||||
'1111111111111111111111111111111111111111111111111111111111111111',
|
var address = pubKey.getAddress()
|
||||||
'18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725'
|
|
||||||
]
|
|
||||||
|
|
||||||
// compressed pubkeys
|
assert.equal(address.hash.toString('hex'), fixtures.compressed.hash160)
|
||||||
var cpubkeys = [
|
|
||||||
'024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992',
|
|
||||||
'034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa',
|
|
||||||
'0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352'
|
|
||||||
]
|
|
||||||
|
|
||||||
var pubkeys = cpubkeys.map(function(x) {
|
|
||||||
var pk = ECPubKey.fromHex(x)
|
|
||||||
pk.compressed = false
|
|
||||||
return pk.toHex()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('bitcoin', function() {
|
it('calculates the expected hash (uncompressed)', function() {
|
||||||
var addresses = [
|
var pubKey = new ECPubKey(Q, false)
|
||||||
'19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui',
|
var address = pubKey.getAddress()
|
||||||
'1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a',
|
|
||||||
'16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM'
|
|
||||||
]
|
|
||||||
var compressedAddresses = [
|
|
||||||
'1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q',
|
|
||||||
'1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9',
|
|
||||||
'1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs',
|
|
||||||
]
|
|
||||||
|
|
||||||
for (var i = 0; i < addresses.length; ++i) {
|
assert.equal(address.hash.toString('hex'), fixtures.uncompressed.hash160)
|
||||||
var pub = ECPubKey.fromHex(pubkeys[i])
|
})
|
||||||
var cpub = ECPubKey.fromHex(cpubkeys[i])
|
|
||||||
cpub.compressed = true
|
|
||||||
|
|
||||||
var addr = addresses[i]
|
it('supports alternative networks', function() {
|
||||||
var caddr = compressedAddresses[i]
|
var pubKey = new ECPubKey(Q)
|
||||||
|
var address = pubKey.getAddress(0x09)
|
||||||
|
|
||||||
assert.equal(pub.getAddress().toString(), addr)
|
assert.equal(address.version, 0x09)
|
||||||
assert.equal(cpub.getAddress().toString(), caddr)
|
assert.equal(address.hash.toString('hex'), fixtures.compressed.hash160)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('verify', function() {
|
||||||
|
var pubKey, signature
|
||||||
|
beforeEach(function() {
|
||||||
|
pubKey = new ECPubKey(Q)
|
||||||
|
|
||||||
|
signature = {
|
||||||
|
r: new BigInteger(fixtures.signature.r),
|
||||||
|
s: new BigInteger(fixtures.signature.s)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
it('testnet', function() {
|
it('verifies a valid signature', function() {
|
||||||
var addresses = [
|
var hash = crypto.sha256(fixtures.message)
|
||||||
'19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui',
|
|
||||||
'1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a',
|
|
||||||
'16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM'
|
|
||||||
]
|
|
||||||
var compressedAddresses = [
|
|
||||||
'1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q',
|
|
||||||
'1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9',
|
|
||||||
'1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs',
|
|
||||||
]
|
|
||||||
|
|
||||||
for (var i = 0; i < addresses.length; ++i) {
|
assert.ok(pubKey.verify(hash, signature))
|
||||||
var pub = ECPubKey.fromHex(pubkeys[i])
|
})
|
||||||
var cpub = ECPubKey.fromHex(cpubkeys[i])
|
|
||||||
cpub.compressed = true
|
|
||||||
|
|
||||||
var addr = addresses[i]
|
it('doesn\'t verify the wrong signature', function() {
|
||||||
var caddr = compressedAddresses[i]
|
var hash = crypto.sha256('mushrooms')
|
||||||
|
|
||||||
assert.equal(pub.getAddress().toString(), addr)
|
assert.ok(!pubKey.verify(hash, signature))
|
||||||
assert.equal(cpub.getAddress().toString(), caddr)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
19
test/fixtures/ecpubkey.js
vendored
Normal file
19
test/fixtures/ecpubkey.js
vendored
Normal file
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue