flocore/lib/Message.js
Ryan X. Charles f87da3b5ba add support for signing messages in compressed format
...this is the standard way to sign messages in bitcoin-qt. Note that the
format of a compressed signature, for messages, is quite distinct from DER
format, which is used in transactions. This commit also adds support for
recovering the public key from a signature, which is necessary for this. The
code for public key recover is taken from bitcoinjs-lib.
2014-07-25 14:07:03 -07:00

62 lines
1.6 KiB
JavaScript

'use strict';
var coinUtil = require('../util');
var Key = require('./Key');
var bignum = require('bignum');
var coinUtil = require('../util');
var Message = function() {};
//creates DER format signatures.
//probably not what you want.
Message.sign = function(str, key) {
var hash = Message.magicHash(str);
var sig = key.signSync(hash);
return sig;
};
//verifies compressed signatures
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);
};
//creates compressed format signatures.
//you probably want this, not .sign
Message.signMessage = function(str, key) {
var hash = Message.magicHash(str);
var privnum = bignum.fromBuffer(key.private);
var sig = Key.signCompressed(hash, privnum);
return sig;
};
//verifies compressed signatures
Message.verifyMessage = function(pubkeyhash, message, sig) {
var hash = Message.magicHash(message);
return Key.verifyCompressed(hash, sig, pubkeyhash);
};
//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 = Message;