bitcore/lib/message.js

89 lines
2.2 KiB
JavaScript
Raw Normal View History

2014-08-21 15:50:38 -07:00
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);
2014-08-21 16:21:21 -07:00
m.sign();
var sigbuf = m.sig.toCompressed();
var sigstr = sigbuf.toString('base64');
return sigstr;
2014-08-21 15:50:38 -07:00
};
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;