How do you sign data with a private key? [javascript]

0

Using BlockCypher’s signing tool (link), I can sign the following data:

05de69f5d37f41340eed3230f03d2394dde5e497738a76f027b7d962a0cbdf39

with the private key:

2fd7cab0970c692b4151d77a6aeebcae2a3284556cbfc6f182c571eccfc2424f

to get the result:

30440220352f6d47bc33e2596600c6a297a0e3e84079a9b2f16d10cb9396993370365976022062a30c63adfeef315bcfc690e254dd3b6d4f14fe9919317e14ebb15c29325326

However, I'm am not able to replicate this using javascript using the bitcoinjs-lib module. My attempt is shown below:

var bitcoin = require('bitcoinjs-lib')
var wif = require('wif')

var dataToSign = '05de69f5d37f41340eed3230f03d2394dde5e497738a76f027b7d962a0cbdf39'

var wifObj = wif.decode('KxpiD4T1QHFahGVyg9onfLXjbwBSf5Dyh3BPYY899uXQHn6gfnbz')
var keys = bitcoin.ECPair.fromPrivateKey(wifObj.privateKey)

var signed = keys.sign(Buffer.from(dataToSign, 'hex'))
var signedHex = signed.toString('hex')

timothyylim

Posted 2019-01-11T09:20:30.990

Reputation: 313

1What exactly are you trying to accomplish? Are you trying to match the signatures exactly? Signatures are not always deterministic, do you get the same result running blockcypher's tool multiple times with the same data?JBaczuk 2019-01-11T14:29:02.937

I'm basically trying to replicate blockcypher's signing tool in javascript and I think I'm quite close... Yes, it's deterministictimothyylim 2019-01-11T14:35:13.547

If it uses RFC6979, signatures can be deterministic, otherwise they are probably not (and should not be).Thorkil Værge 2019-01-11T17:18:35.470

Answers

1

You could try using eccrypto

index.js:

var crypto = require("crypto");
var eccrypto = require("eccrypto");

// A new random 32-byte private key.
var privateKey = Buffer.from('2fd7cab0970c692b4151d77a6aeebcae2a3284556cbfc6f182c571eccfc2424f', 'hex')
// Corresponding uncompressed (65-byte) public key.
var publicKey = eccrypto.getPublic(privateKey);

var buf = Buffer.from('05de69f5d37f41340eed3230f03d2394dde5e497738a76f027b7d962a0cbdf39', 'hex')
// Always hash you message to sign!
var msg = crypto.createHash("sha256").update(buf).digest();

eccrypto.sign(privateKey, buf).then(function(sig) {
  console.log("Signature in DER format (hex):", sig.toString('hex'))
  eccrypto.verify(publicKey, buf, sig).then(function() {
    console.log("Signature is OK");
  }).catch(function() {
    console.log("Signature is BAD");
  });
});

console output:

$ node index.js
Signature in DER format (hex): 30440220352f6d47bc33e2596600c6a297a0e3e84079a9b2f16d10cb9396993370365976022062a30c63adfeef315bcfc690e254dd3b6d4f14fe9919317e14ebb15c29325326
Signature is OK

full disclosure: I'm a maintainer of eccrypto

JBaczuk

Posted 2019-01-11T09:20:30.990

Reputation: 6 172