Skip to content

Commit

Permalink
update tests
Browse files Browse the repository at this point in the history
  • Loading branch information
fanatid committed Apr 6, 2016
1 parent 751521a commit 84d33f6
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 105 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
.nyc_output
coverage
node_modules

npm-debug.log
3 changes: 1 addition & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
sudo: false
os:
- linux
os: linux
language: node_js
node_js:
- "0.10"
Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
The MIT License (MIT)

Copyright (c) 2015 Bitcoinjs developers
Copyright (c) 2015-2016 Bitcoinjs developers

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
12 changes: 9 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ function decodeSignature (buffer) {
}
}

exports.magicHash = function (message, messagePrefix) {
function magicHash (message, messagePrefix) {
var messageVISize = varuint.encodingLength(message.length)
var buffer = new Buffer(messagePrefix.length + messageVISize + message.length)

Expand All @@ -43,13 +43,13 @@ exports.magicHash = function (message, messagePrefix) {
return hash256(buffer)
}

exports.sign = function (message, messagePrefix, privateKey, compressed) {
function sign (message, messagePrefix, privateKey, compressed) {
var hash = magicHash(message, messagePrefix)
var sigObj = secp256k1.sign(hash, privateKey)
return encodeSignature(sigObj.signature, sigObj.recovery, compressed)
}

exports.verify = function (message, messagePrefix, address, signature) {
function verify (message, messagePrefix, address, signature) {
if (!Buffer.isBuffer(signature)) signature = new Buffer(signature, 'base64')

var parsed = decodeSignature(signature)
Expand All @@ -61,3 +61,9 @@ exports.verify = function (message, messagePrefix, address, signature) {

return bufferEquals(actual, expected)
}

module.exports = {
magicHash: magicHash,
sign: sign,
verify: verify
}
32 changes: 7 additions & 25 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,37 +12,19 @@
},
"license": "MIT",
"files": [
"index.js",
"LICENSE",
"package.json",
"README.md"
"index.js"
],
"main": "./index.js",
"repository": {
"type": "git",
"url": "https://github.com/bitcoinjs/bitcoinjs-message.git"
},
"scripts": {
"coverage": "mocha --require blanket -R travis-cov",
"coverage-local": "mocha --require blanket -R html-cov",
"coverage": "nyc tape test/*.js",
"prepublish": "npm run test",
"standard": "standard",
"test": "npm run standard && npm run unit",
"unit": "mocha"
},
"config": {
"blanket": {
"pattern": [
""
],
"data-cover-never": [
"node_modules",
"test"
]
},
"travis-cov": {
"threshold": 99
}
"unit": "tape test/*.js"
},
"dependencies": {
"bs58check": "^1.0.8",
Expand All @@ -53,10 +35,10 @@
},
"devDependencies": {
"bigi": "^1.4.1",
"blanket": "*",
"mocha": "*",
"standard": "*",
"travis-cov": "*"
"bitcoinjs-lib": "^2.2.0",
"nyc": "^6.2.1",
"standard": "^6.0.8",
"tape": "^4.5.1"
},
"engines": {
"node": ">=0.10"
Expand Down
115 changes: 41 additions & 74 deletions test/index.js
Original file line number Diff line number Diff line change
@@ -1,94 +1,61 @@
/* global describe, it */

var assert = require('assert')
var test = require('tape').test
var bitcoin = require('bitcoinjs-lib')
var BigInteger = require('bigi')
var message = require('../')

var fixtures = require('./fixtures.json')
var NETWORKS = bitcoin.networks

describe('message', function () {
describe('_encodeSignature', function () {
fixtures.valid.signature.forEach(function (f) {
it('exports ' + f.hex + ' correctly', function () {
var signature = new Buffer(f.signature, 'hex')
var buffer = message._encodeSignature(signature, f.recovery, f.compressed)
function getMessagePrefix (networkName) {
return bitcoin.networks[networkName].messagePrefix
}

assert.strictEqual(buffer.toString('hex'), f.hex)
})
})
fixtures.valid.magicHash.forEach(function (f) {
test('produces the magicHash for "' + f.message + '" (' + f.network + ')', function (t) {
var actual = message.magicHash(f.message, getMessagePrefix(f.network))
t.same(actual.toString('hex'), f.magicHash)
t.end()
})
})

describe('_decodeSignature', function () {
fixtures.valid.signature.forEach(function (f) {
it('imports ' + f.hex + ' correctly', function () {
var buffer = new Buffer(f.hex, 'hex')
var decode = message._decodeSignature(buffer)

assert.deepEqual(decode, {
signature: new Buffer(f.signature, 'hex'),
recovery: f.recovery,
compressed: f.compressed
})
})
})

fixtures.invalid.signature.forEach(function (f) {
it('throws on ' + f.hex, function () {
var buffer = new Buffer(f.hex, 'hex')

assert.throws(function () {
message._decodeSignature(buffer)
}, new RegExp(f.exception))
})
})
})
fixtures.valid.sign.forEach(function (f) {
test('sign: ' + f.description, function (t) {
var pk = new bitcoin.ECPair(new BigInteger(f.d)).d.toBuffer(32)
var signature = message.sign(f.message, getMessagePrefix(f.network), pk, false)
t.same(signature.toString('base64'), f.signature)

describe('magicHash', function () {
fixtures.valid.magicHash.forEach(function (f) {
it('produces the magicHash for "' + f.message + '" (' + f.network + ')', function () {
var actual = message.magicHash(f.message, NETWORKS[f.network])
if (f.compressed) {
signature = message.sign(f.message, getMessagePrefix(f.network), pk, true)
t.same(signature.toString('base64'), f.compressed.signature)
}

assert.strictEqual(actual.toString('hex'), f.magicHash)
})
})
t.end()
})
})

describe('sign', function () {
fixtures.valid.sign.forEach(function (f) {
it(f.description, function () {
var keyPair = new bitcoin.ECPair(new BigInteger(f.d), null, {
compressed: false
})
var signature = message.sign(keyPair, f.message, NETWORKS[f.network])
assert.strictEqual(signature.toString('base64'), f.signature)
fixtures.valid.verify.forEach(function (f) {
test('verifies a valid signature for "' + f.message + '" (' + f.network + ')', function (t) {
t.true(message.verify(f.message, getMessagePrefix(f.network), f.address, f.signature))

if (f.compressed) {
var compressedPrivKey = new bitcoin.ECPair(new BigInteger(f.d))
var compressedSignature = message.sign(compressedPrivKey, f.message)
if (f.compressed) {
t.true(message.verify(f.message, getMessagePrefix(f.network), f.compressed.address, f.compressed.signature))
}

assert.strictEqual(compressedSignature.toString('base64'), f.compressed.signature)
}
})
})
t.end()
})
})

describe('verify', function () {
fixtures.valid.verify.forEach(function (f) {
it('verifies a valid signature for "' + f.message + '" (' + f.network + ')', function () {
assert(message.verify(f.address, f.signature, f.message, NETWORKS[f.network]))

if (f.compressed) {
assert(message.verify(f.compressed.address, f.compressed.signature, f.message, NETWORKS[f.network]))
}
})
})
fixtures.invalid.signature.forEach(function (f) {
test('decode signature: throws on ' + f.hex, function (t) {
t.throws(function () {
message.verify(null, null, null, new Buffer(f.hex, 'hex'))
}, new RegExp('^Error: ' + f.exception + '$'))
t.end()
})
})

fixtures.invalid.verify.forEach(function (f) {
it(f.description, function () {
assert(!message.verify(f.address, f.signature, f.message))
})
})
fixtures.invalid.verify.forEach(function (f) {
test(f.description, function (t) {
t.false(message.verify(f.message, getMessagePrefix('bitcoin'), f.address, f.signature))
t.end()
})
})

0 comments on commit 84d33f6

Please sign in to comment.