text: '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;
  