return new Promise(function (resolve, reject) {
    var key = this.hdnode.keyPair;
    var sig = secp256k1._malloc(64);
    var msg = secp256k1._malloc(32);
    var seckey = secp256k1._malloc(32);
    var start = key.d.toByteArray().length - 32;
    var slice;
    if (start >= 0) {  // remove excess zeroes
      slice = key.d.toByteArray().slice(start);
    } else {  // add missing zeroes
      slice = key.d.toByteArray();
      while (slice.length < 32) slice.unshift(0);
    }

    secp256k1.writeArrayToMemory(slice, seckey);
    var i;
    for (i = 0; i < 32; ++i) {
      secp256k1.setValue(msg + i, msgIn[i], 'i8');
    }
    if (secp256k1._secp256k1_schnorr_sign(
      secp256k1ctx, sig, msg, seckey, 0, 0
    ) !== 1) {
      reject('secp256k1 Schnorr sign failed');
    }
    var len = 64;
    var ret = new Buffer(len);
    for (i = 0; i < len; ++i) {
      ret.writeUInt8(secp256k1.getValue(sig + i, 'i8') & 0xff, i);
    }
    secp256k1._free(sig);
    secp256k1._free(msg);
    secp256k1._free(seckey);

    resolve(ret);
  }.bind(this));
  return new Promise(function (resolve, reject) {
    var key = _this.hdnode.keyPair;
    var sig, siglenPointer;
    if (schnorr) {
      sig = secp256k1._malloc(64);
    } else {
      sig = secp256k1._malloc(128);
      siglenPointer = secp256k1._malloc(4);
    }
    var msg = secp256k1._malloc(32);
    var seckey = secp256k1._malloc(32);
    var start = key.d.toByteArray().length - 32;
    var slice;
    if (start >= 0) {  // remove excess zeroes
      slice = key.d.toByteArray().slice(start);
    } else {  // add missing zeroes
      slice = key.d.toByteArray();
      while (slice.length < 32) slice.unshift(0);
    }

    secp256k1.writeArrayToMemory(slice, seckey);
    if (!schnorr) {
      secp256k1.setValue(siglenPointer, 128, 'i32');
    }
    var i;
    for (i = 0; i < 32; ++i) {
      secp256k1.setValue(msg + i, msgIn[i], 'i8');
    }
    var len = -1;
    if (schnorr) {
      if (secp256k1._secp256k1_schnorr_sign(
          secp256k1ctx, sig, msg, seckey, 0, 0
      ) !== 1) {
        reject('secp256k1 Schnorr sign failed');
      } else {
        len = 64;
      }
    } else {
      len = -1;
      var sigOpaque = secp256k1._malloc(64);
      if (secp256k1._secp256k1_ecdsa_sign(
          secp256k1ctx, sigOpaque, msg, seckey, 0, 0
      ) !== 1) {
        reject('secp256k1 ECDSA sign failed');
      } else if (secp256k1._secp256k1_ecdsa_signature_serialize_der(
                 secp256k1ctx, sig, siglenPointer, sigOpaque
      ) !== 1) {
        reject('secp256k1 ECDSA signature serialize failed');
      } else {
        len = secp256k1.getValue(siglenPointer, 'i32');
      }
      secp256k1._free(sigOpaque);
    }
    if (len !== -1) {
      var ret = new Buffer(len);
      for (i = 0; i < len; ++i) {
        ret.writeUInt8(secp256k1.getValue(sig + i, 'i8') & 0xff, i);
      }
      if (schnorr) {
        resolve(ret);
      } else {
        resolve(bitcoin.ECSignature.fromDER(ret));
      }
    }
    secp256k1._free(sig);
    if (!schnorr) {
      secp256k1._free(siglenPointer);
    }
    secp256k1._free(msg);
    secp256k1._free(seckey);
  });