Browse Source
This adds a new Message class with static methods for signing and verifying a message the same way as bitcoind. (In a nutshell, messages a prepended with "Bitcoin Signed Message:" before being hashed and signed). There is one important piece missing ... verifying a signature with an address, and not a public key. I have not yet implemented this because the cryptography interface of bitcore does not allow me to derive the public key from a signature. This will need to be added before verifying from an address is possible.patch-2
Ryan X. Charles
11 years ago
3 changed files with 100 additions and 0 deletions
@ -0,0 +1,42 @@ |
|||||
|
'use strict'; |
||||
|
var imports = require('soop').imports(); |
||||
|
var coinUtil = imports.coinUtil || require('../util'); |
||||
|
var Key = imports.Key || require('./Key'); |
||||
|
|
||||
|
var Message = function() { |
||||
|
}; |
||||
|
|
||||
|
Message.sign = function(str, key) { |
||||
|
var hash = Message.magicHash(str); |
||||
|
var sig = key.signSync(hash); |
||||
|
return sig; |
||||
|
}; |
||||
|
|
||||
|
Message.verifyWithPubKey = function(pubkey, message, sig) { |
||||
|
var hash = Message.magicHash(message); |
||||
|
var key = new Key(); |
||||
|
if (pubkey.length == 65) |
||||
|
key.compressed = false; |
||||
|
key.public = pubkey; |
||||
|
|
||||
|
return key.verifySignatureSync(hash, sig); |
||||
|
}; |
||||
|
|
||||
|
//TODO: Message.verify ... with address, not pubkey
|
||||
|
|
||||
|
Message.magicBytes = new Buffer('Bitcoin Signed Message:\n'); |
||||
|
|
||||
|
Message.magicHash = function(str) { |
||||
|
var magicBytes = Message.magicBytes; |
||||
|
var prefix1 = coinUtil.varIntBuf(magicBytes.length); |
||||
|
var message = new Buffer(str); |
||||
|
var prefix2 = coinUtil.varIntBuf(message.length); |
||||
|
|
||||
|
var buf = Buffer.concat([prefix1, magicBytes, prefix2, message]); |
||||
|
|
||||
|
var hash = coinUtil.twoSha256(buf); |
||||
|
|
||||
|
return hash; |
||||
|
}; |
||||
|
|
||||
|
module.exports = require('soop')(Message); |
@ -0,0 +1,57 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
var chai = chai || require('chai'); |
||||
|
var should = chai.should(); |
||||
|
var bitcore = bitcore || require('../bitcore'); |
||||
|
var Message = bitcore.Message; |
||||
|
var coinUtil = bitcore.util; |
||||
|
|
||||
|
describe('Message', function() { |
||||
|
describe('sign', function() { |
||||
|
it('should return a signature', function() { |
||||
|
var key = bitcore.Key.generateSync(); |
||||
|
var sig = Message.sign('my message', key); |
||||
|
sig.length.should.be.greaterThan(0); |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
describe('verifyWithPubKey', function() { |
||||
|
it('should verify a signed message', function() { |
||||
|
var message = 'my message'; |
||||
|
var key = bitcore.Key.generateSync(); |
||||
|
var sig = Message.sign(message, key); |
||||
|
Message.verifyWithPubKey(key.public, message, sig).should.equal(true); |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
describe('magicBytes', function() { |
||||
|
it('should be "Bitcoin Signed Message:\\n"', function() { |
||||
|
Message.magicBytes.toString().should.equal('Bitcoin Signed Message:\n'); |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
describe('magicHash', function() { |
||||
|
it('should hash the message with the magic bytes', function() { |
||||
|
var str = 'my message'; |
||||
|
var magicBytes = Message.magicBytes; |
||||
|
var prefix1 = coinUtil.varIntBuf(magicBytes.length); |
||||
|
var message = new Buffer(str); |
||||
|
var prefix2 = coinUtil.varIntBuf(message.length); |
||||
|
|
||||
|
var buf = Buffer.concat([prefix1, magicBytes, prefix2, message]); |
||||
|
|
||||
|
var hash = coinUtil.twoSha256(buf); |
||||
|
|
||||
|
var hash2 = Message.magicHash(str); |
||||
|
|
||||
|
hash.toString().should.equal(hash2.toString()); |
||||
|
}); |
||||
|
|
||||
|
it('should hash this message the same way as bitcoinjs-lib', function() { |
||||
|
var hashHex = '74eacdc6c04724869380907bf4aab561a1494a4a800fba266b29b8158c2c4cec'; |
||||
|
|
||||
|
var str = 'this is a test message'; |
||||
|
hashHex.should.equal(Message.magicHash(str).toString('hex')); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
Loading…
Reference in new issue