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')
  • 1
    What 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 Jan 11 at 14:29
  • I'm basically trying to replicate blockcypher's signing tool in javascript and I think I'm quite close... Yes, it's deterministic – timothyylim Jan 11 at 14:35
  • If it uses RFC6979, signatures can be deterministic, otherwise they are probably not (and should not be). – Thorkil Værge Jan 11 at 17:18
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

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.