plugins/bitbox02: add support for signing a message
This commit is contained in:
@@ -372,6 +372,9 @@ class BitBox02Client(HardwareClientBase):
|
||||
display=True,
|
||||
)
|
||||
|
||||
def _get_coin(self):
|
||||
return bitbox02.btc.TBTC if constants.net.TESTNET else bitbox02.btc.BTC
|
||||
|
||||
@runs_in_hwd_thread
|
||||
def sign_transaction(
|
||||
self,
|
||||
@@ -387,10 +390,7 @@ class BitBox02Client(HardwareClientBase):
|
||||
"Need to setup communication first before attempting any BitBox02 calls"
|
||||
)
|
||||
|
||||
coin = bitbox02.btc.BTC
|
||||
if constants.net.TESTNET:
|
||||
coin = bitbox02.btc.TBTC
|
||||
|
||||
coin = self._get_coin()
|
||||
tx_script_type = None
|
||||
|
||||
# Build BTCInputType list
|
||||
@@ -531,6 +531,31 @@ class BitBox02Client(HardwareClientBase):
|
||||
signatures = [bh2u(ecc.der_sig_from_sig_string(x[1])) + "01" for x in sigs]
|
||||
tx.update_signatures(signatures)
|
||||
|
||||
def sign_message(self, keypath: str, message: bytes, xtype: str) -> bytes:
|
||||
if self.bitbox02_device is None:
|
||||
raise Exception(
|
||||
"Need to setup communication first before attempting any BitBox02 calls"
|
||||
)
|
||||
|
||||
try:
|
||||
simple_type = {
|
||||
"p2wpkh-p2sh":bitbox02.btc.BTCScriptConfig.P2WPKH_P2SH,
|
||||
"p2wpkh": bitbox02.btc.BTCScriptConfig.P2WPKH,
|
||||
}[xtype]
|
||||
except KeyError:
|
||||
raise UserFacingException("The BitBox02 does not support signing messages for this address type: {}".format(xtype))
|
||||
|
||||
_, _, signature = self.bitbox02_device.btc_sign_msg(
|
||||
self._get_coin(),
|
||||
bitbox02.btc.BTCScriptConfigWithKeypath(
|
||||
script_config=bitbox02.btc.BTCScriptConfig(
|
||||
simple_type=simple_type,
|
||||
),
|
||||
keypath=bip32.convert_bip32_path_to_list_of_uint32(keypath),
|
||||
),
|
||||
message,
|
||||
)
|
||||
return signature
|
||||
|
||||
class BitBox02_KeyStore(Hardware_KeyStore):
|
||||
hw_type = "bitbox02"
|
||||
@@ -563,11 +588,13 @@ class BitBox02_KeyStore(Hardware_KeyStore):
|
||||
)
|
||||
|
||||
def sign_message(self, sequence, message, password):
|
||||
raise UserFacingException(
|
||||
_(
|
||||
"Message encryption, decryption and signing are currently not supported for {}"
|
||||
).format(self.device)
|
||||
)
|
||||
if password:
|
||||
raise Exception("BitBox02 does not accept a password from the host")
|
||||
client = self.get_client()
|
||||
keypath = self.get_derivation_prefix() + "/%d/%d" % sequence
|
||||
xtype = self.get_bip32_node_for_xpub().xtype
|
||||
return client.sign_message(keypath, message.encode("utf-8"), xtype)
|
||||
|
||||
|
||||
@runs_in_hwd_thread
|
||||
def sign_transaction(self, tx: PartialTransaction, password: str):
|
||||
|
||||
Reference in New Issue
Block a user