Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)