def btc_sign_msg(self, coin: btc.BTCCoin, script_config: btc.BTCScriptConfigWithKeypath, msg: bytes) -> Tuple[bytes, int, bytes]: """ Returns a 64 byte sig, the recoverable id, and a 65 byte signature containing the recid, compatible with Electrum. """ # pylint: disable=no-member,line-too-long self._require_atleast(semver.VersionInfo(9, 2, 0)) request = btc.BTCRequest() request.sign_message.CopyFrom( btc.BTCSignMessageRequest(coin=coin, script_config=script_config, msg=msg)) sig = self._btc_msg_query( request, expected_response="sign_message").sign_message.signature sig, recid = sig[:64], sig[64] # See https://github.com/spesmilo/electrum/blob/84dc181b6e7bb20e88ef6b98fb8925c5f645a765/electrum/ecc.py#L521-L523 compressed = 4 # BitBox02 uses only compressed pubkeys electrum_sig65 = bytes([27 + compressed + recid]) + sig return (sig, recid, electrum_sig65)
def btc_sign_msg( self, coin: btc.BTCCoin, script_config: btc.BTCScriptConfigWithKeypath, msg: bytes ) -> Tuple[bytes, int, bytes]: """ Returns a 64 byte sig, the recoverable id, and a 65 byte signature containing the recid, compatible with Electrum. """ # pylint: disable=no-member,line-too-long self._require_atleast(semver.VersionInfo(9, 2, 0)) request = btc.BTCRequest() request.sign_message.CopyFrom( btc.BTCSignMessageRequest(coin=coin, script_config=script_config, msg=msg) ) supports_antiklepto = self.version >= semver.VersionInfo(9, 5, 0) if supports_antiklepto: host_nonce = os.urandom(32) request.sign_message.host_nonce_commitment.commitment = antiklepto_host_commit( host_nonce ) signer_commitment = self._btc_msg_query( request, expected_response="antiklepto_signer_commitment" ).antiklepto_signer_commitment.commitment request = btc.BTCRequest() request.antiklepto_signature.CopyFrom( antiklepto.AntiKleptoSignatureRequest(host_nonce=host_nonce) ) signature = self._btc_msg_query( request, expected_response="sign_message" ).sign_message.signature antiklepto_verify(host_nonce, signer_commitment, signature[:64]) if self.debug: print(f"Antiklepto nonce verification PASSED") else: signature = self._btc_msg_query( request, expected_response="sign_message" ).sign_message.signature sig, recid = signature[:64], signature[64] # See https://github.com/spesmilo/electrum/blob/84dc181b6e7bb20e88ef6b98fb8925c5f645a765/electrum/ecc.py#L521-L523 compressed = 4 # BitBox02 uses only compressed pubkeys electrum_sig65 = bytes([27 + compressed + recid]) + sig return (sig, recid, electrum_sig65)