Skip to the content
nullroute
Browse the docs

4. Reproducing a signature

A device that makes randomised signatures can leak your private key through valid transactions alone: grind the nonce until chosen bits of the signature encode part of the key, publish, repeat. Every signature verifies, and nothing on the device looks wrong.

nullroute is deterministic instead:

  • ECDSA nonces come from RFC 6979
  • Schnorr signing uses BIP-340 with aux_rand fixed to 32 zero bytes

So given the seed and the PSBT, the signature bytes are fully determined, leaving no free space to hide anything in.

To check, sign the same unsigned PSBT with the same seed in any independent implementation that does RFC 6979 and BIP-340 the same way, and compare bytes. A difference means the device put something in your signature that it did not have to.

In CI, the test suite signs one p2wpkh PSBT one hundred times and asserts byte-identical output each time, and signs one taproot input three times and compares. The differential suite checks p2wpkh signature bytes against bitcoinjs-lib; no Schnorr signature is compared with another implementation. Neither replaces checking a signature you care about.

This is a trade. BIP-340 permits a randomised aux_rand, which defends against certain fault injection attacks. Fixing it to zero gives that up for verifiability: right for a device you are meant to audit, but a real trade.


Rendered from docs/VERIFICATION.md, the same bytes that ship with the code. SHA-256 15ae2ba12417b4691f63d9a4777eba2c328ff694961efea68f5e7dec4ae2e0bd