Ryan X. Charles
11 years ago
4 changed files with 145 additions and 2 deletions
@ -0,0 +1,90 @@ |
|||||
|
var ECDSA = require('./ecdsa'); |
||||
|
var Key = require('./key'); |
||||
|
var Privkey = require('./privkey'); |
||||
|
var Pubkey = require('./pubkey'); |
||||
|
var BufferWriter = require('./bufferwriter'); |
||||
|
var Hash = require('./hash'); |
||||
|
var Address = require('./address'); |
||||
|
|
||||
|
var Message = function Message(messagebuf, key, sig, address, verified) { |
||||
|
if (!(this instanceof Message)) |
||||
|
return new Message(messagebuf, key, sig); |
||||
|
this.messagebuf = messagebuf; |
||||
|
this.key = key; |
||||
|
this.sig = sig; |
||||
|
this.address = address; |
||||
|
this.verified = verified; |
||||
|
}; |
||||
|
|
||||
|
Message.magicBytes = new Buffer('Bitcoin Signed Message:\n'); |
||||
|
|
||||
|
Message.magicHash = function(messagebuf) { |
||||
|
if (!Buffer.isBuffer(messagebuf)) |
||||
|
throw new Error('messagebuf must be a buffer'); |
||||
|
var bw = new BufferWriter(); |
||||
|
bw.writeVarInt(Message.magicBytes.length); |
||||
|
bw.write(Message.magicBytes); |
||||
|
bw.writeVarInt(messagebuf.length); |
||||
|
bw.write(messagebuf); |
||||
|
var buf = bw.concat(); |
||||
|
|
||||
|
var hashbuf = Hash.sha256sha256(buf); |
||||
|
|
||||
|
return hashbuf; |
||||
|
}; |
||||
|
|
||||
|
Message.prototype.sign = function() { |
||||
|
var hashbuf = Message.magicHash(this.messagebuf); |
||||
|
var ecdsa = ECDSA(hashbuf, this.key); |
||||
|
ecdsa.signRandomK(); |
||||
|
ecdsa.calci(); |
||||
|
this.sig = ecdsa.sig; |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
/* |
||||
|
Message.sign = function(messagebuf, key) { |
||||
|
var m = Message(messagebuf, key); |
||||
|
var sig = m.sign(); |
||||
|
var sigbuf = sig.toCompressed(); |
||||
|
var base64 = sigbuf.toString('base64'); |
||||
|
return base64; |
||||
|
}; |
||||
|
*/ |
||||
|
|
||||
|
Message.prototype.verify = function() { |
||||
|
var hashbuf = Message.magicHash(this.messagebuf); |
||||
|
|
||||
|
var ecdsa = new ECDSA(); |
||||
|
ecdsa.hashbuf = hashbuf; |
||||
|
ecdsa.sig = this.sig; |
||||
|
ecdsa.key = new Key(); |
||||
|
ecdsa.key.pubkey = ecdsa.sig2pubkey(); |
||||
|
|
||||
|
if (!ecdsa.verify()) { |
||||
|
console.log(ecdsa.sigError()); |
||||
|
this.verified = false; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
var address = Address().fromPubkey(ecdsa.key.pubkey); |
||||
|
//TODO: what if livenet/testnet mismatch?
|
||||
|
if (address.hashbuf.toString('hex') === this.address.hashbuf.toString('hex')) |
||||
|
this.verified = true; |
||||
|
else |
||||
|
this.verified = false; |
||||
|
|
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
/* |
||||
|
Message.verify = function(messagebuf, sigstr, address) { |
||||
|
var sigbuf = new Buffer(sigstr, 'base64'); |
||||
|
var message = new Message(); |
||||
|
message.messagebuf = messagebuf; |
||||
|
message.sig = Signature().fromCompressed(sigbuf); |
||||
|
message.address = address; |
||||
|
}; |
||||
|
*/ |
||||
|
|
||||
|
module.exports = Message; |
@ -0,0 +1,49 @@ |
|||||
|
var Address = require('../lib/address'); |
||||
|
var Message = require('../lib/message'); |
||||
|
var Key = require('../lib/key'); |
||||
|
var should = require('chai').should(); |
||||
|
|
||||
|
describe('Message', function() { |
||||
|
|
||||
|
it('should make a new message', function() { |
||||
|
var message = new Message(); |
||||
|
should.exist(message); |
||||
|
}); |
||||
|
|
||||
|
it('should make a new message when called without "new"', function() { |
||||
|
var message = Message(); |
||||
|
should.exist(message); |
||||
|
}); |
||||
|
|
||||
|
describe('#sign', function() { |
||||
|
var messagebuf = new Buffer('this is my message'); |
||||
|
var key = Key().fromRandom(); |
||||
|
|
||||
|
it('should sign a message', function() { |
||||
|
var message = new Message(); |
||||
|
message.messagebuf = messagebuf; |
||||
|
message.key = key; |
||||
|
message.sign(); |
||||
|
var sig = message.sig; |
||||
|
should.exist(sig); |
||||
|
}); |
||||
|
|
||||
|
}); |
||||
|
|
||||
|
describe('#verify', function() { |
||||
|
var messagebuf = new Buffer('this is my message'); |
||||
|
var key = Key().fromRandom(); |
||||
|
|
||||
|
it('should verify a message that was just signed', function() { |
||||
|
var message = new Message(); |
||||
|
message.messagebuf = messagebuf; |
||||
|
message.key = key; |
||||
|
message.address = Address().fromPubkey(key.pubkey); |
||||
|
message.sign(); |
||||
|
message.verify(); |
||||
|
message.verified.should.equal(true); |
||||
|
}); |
||||
|
|
||||
|
}); |
||||
|
|
||||
|
}); |
Loading…
Reference in new issue