mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-22 07:28:10 +00:00
style: apply black 20.8b1
This commit is contained in:
parent
6dda240f5c
commit
e4785d47e0
@ -8,7 +8,9 @@ def main(file: str = None):
|
|||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
config.read_file(open("hardware.cfg"))
|
config.read_file(open("hardware.cfg"))
|
||||||
t1 = TrezorOne(
|
t1 = TrezorOne(
|
||||||
config["t1"]["location"], config["t1"]["port"], config["t1"]["arduino_serial"],
|
config["t1"]["location"],
|
||||||
|
config["t1"]["port"],
|
||||||
|
config["t1"]["arduino_serial"],
|
||||||
)
|
)
|
||||||
t1.update_firmware(file)
|
t1.update_firmware(file)
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ if False:
|
|||||||
_MAX_COORDINATOR_LEN = const(18)
|
_MAX_COORDINATOR_LEN = const(18)
|
||||||
|
|
||||||
|
|
||||||
async def authorize_coinjoin(ctx: wire.Context, msg: AuthorizeCoinJoin,) -> Success:
|
async def authorize_coinjoin(ctx: wire.Context, msg: AuthorizeCoinJoin) -> Success:
|
||||||
# We cannot use the @with_keychain decorator here, because we need the keychain
|
# We cannot use the @with_keychain decorator here, because we need the keychain
|
||||||
# to survive the function exit. The ownership of the keychain is transferred to
|
# to survive the function exit. The ownership of the keychain is transferred to
|
||||||
# the CoinJoinAuthorization object, which takes care of its destruction.
|
# the CoinJoinAuthorization object, which takes care of its destruction.
|
||||||
|
@ -364,7 +364,8 @@ class Bitcoin:
|
|||||||
if txi.script_type == InputScriptType.SPENDMULTISIG:
|
if txi.script_type == InputScriptType.SPENDMULTISIG:
|
||||||
assert txi.multisig is not None # checked in sanitize_tx_input
|
assert txi.multisig is not None # checked in sanitize_tx_input
|
||||||
script_pubkey = scripts.output_script_multisig(
|
script_pubkey = scripts.output_script_multisig(
|
||||||
multisig.multisig_get_pubkeys(txi.multisig), txi.multisig.m,
|
multisig.multisig_get_pubkeys(txi.multisig),
|
||||||
|
txi.multisig.m,
|
||||||
)
|
)
|
||||||
elif txi.script_type == InputScriptType.SPENDADDRESS:
|
elif txi.script_type == InputScriptType.SPENDADDRESS:
|
||||||
script_pubkey = scripts.output_script_p2pkh(
|
script_pubkey = scripts.output_script_p2pkh(
|
||||||
@ -478,17 +479,26 @@ class Bitcoin:
|
|||||||
return self.get_sighash_type(txi) & 0xFF
|
return self.get_sighash_type(txi) & 0xFF
|
||||||
|
|
||||||
def write_tx_input(
|
def write_tx_input(
|
||||||
self, w: writers.Writer, txi: Union[TxInput, PrevInput], script: bytes,
|
self,
|
||||||
|
w: writers.Writer,
|
||||||
|
txi: Union[TxInput, PrevInput],
|
||||||
|
script: bytes,
|
||||||
) -> None:
|
) -> None:
|
||||||
writers.write_tx_input(w, txi, script)
|
writers.write_tx_input(w, txi, script)
|
||||||
|
|
||||||
def write_tx_output(
|
def write_tx_output(
|
||||||
self, w: writers.Writer, txo: Union[TxOutput, PrevOutput], script_pubkey: bytes,
|
self,
|
||||||
|
w: writers.Writer,
|
||||||
|
txo: Union[TxOutput, PrevOutput],
|
||||||
|
script_pubkey: bytes,
|
||||||
) -> None:
|
) -> None:
|
||||||
writers.write_tx_output(w, txo, script_pubkey)
|
writers.write_tx_output(w, txo, script_pubkey)
|
||||||
|
|
||||||
def write_tx_header(
|
def write_tx_header(
|
||||||
self, w: writers.Writer, tx: Union[SignTx, PrevTx], witness_marker: bool,
|
self,
|
||||||
|
w: writers.Writer,
|
||||||
|
tx: Union[SignTx, PrevTx],
|
||||||
|
witness_marker: bool,
|
||||||
) -> None:
|
) -> None:
|
||||||
writers.write_uint32(w, tx.version) # nVersion
|
writers.write_uint32(w, tx.version) # nVersion
|
||||||
if witness_marker:
|
if witness_marker:
|
||||||
|
@ -62,7 +62,10 @@ class Bitcoinlike(Bitcoin):
|
|||||||
return hashtype
|
return hashtype
|
||||||
|
|
||||||
def write_tx_header(
|
def write_tx_header(
|
||||||
self, w: writers.Writer, tx: Union[SignTx, PrevTx], witness_marker: bool,
|
self,
|
||||||
|
w: writers.Writer,
|
||||||
|
tx: Union[SignTx, PrevTx],
|
||||||
|
witness_marker: bool,
|
||||||
) -> None:
|
) -> None:
|
||||||
writers.write_uint32(w, tx.version) # nVersion
|
writers.write_uint32(w, tx.version) # nVersion
|
||||||
if self.coin.timestamp:
|
if self.coin.timestamp:
|
||||||
|
@ -155,7 +155,10 @@ class Decred(Bitcoin):
|
|||||||
self.write_tx_output(self.h_prefix, txo, script_pubkey)
|
self.write_tx_output(self.h_prefix, txo, script_pubkey)
|
||||||
|
|
||||||
def write_tx_input(
|
def write_tx_input(
|
||||||
self, w: writers.Writer, txi: Union[TxInput, PrevInput], script: bytes,
|
self,
|
||||||
|
w: writers.Writer,
|
||||||
|
txi: Union[TxInput, PrevInput],
|
||||||
|
script: bytes,
|
||||||
) -> None:
|
) -> None:
|
||||||
writers.write_bytes_reversed(w, txi.prev_hash, writers.TX_HASH_SIZE)
|
writers.write_bytes_reversed(w, txi.prev_hash, writers.TX_HASH_SIZE)
|
||||||
writers.write_uint32(w, txi.prev_index or 0)
|
writers.write_uint32(w, txi.prev_index or 0)
|
||||||
@ -163,7 +166,10 @@ class Decred(Bitcoin):
|
|||||||
writers.write_uint32(w, txi.sequence)
|
writers.write_uint32(w, txi.sequence)
|
||||||
|
|
||||||
def write_tx_output(
|
def write_tx_output(
|
||||||
self, w: writers.Writer, txo: Union[TxOutput, PrevOutput], script_pubkey: bytes,
|
self,
|
||||||
|
w: writers.Writer,
|
||||||
|
txo: Union[TxOutput, PrevOutput],
|
||||||
|
script_pubkey: bytes,
|
||||||
) -> None:
|
) -> None:
|
||||||
writers.write_uint64(w, txo.amount)
|
writers.write_uint64(w, txo.amount)
|
||||||
if isinstance(txo, PrevOutput):
|
if isinstance(txo, PrevOutput):
|
||||||
@ -175,7 +181,10 @@ class Decred(Bitcoin):
|
|||||||
writers.write_bytes_prefixed(w, script_pubkey)
|
writers.write_bytes_prefixed(w, script_pubkey)
|
||||||
|
|
||||||
def write_tx_header(
|
def write_tx_header(
|
||||||
self, w: writers.Writer, tx: Union[SignTx, PrevTx], witness_marker: bool,
|
self,
|
||||||
|
w: writers.Writer,
|
||||||
|
tx: Union[SignTx, PrevTx],
|
||||||
|
witness_marker: bool,
|
||||||
) -> None:
|
) -> None:
|
||||||
# The upper 16 bits of the transaction version specify the serialization
|
# The upper 16 bits of the transaction version specify the serialization
|
||||||
# format and the lower 16 bits specify the version number.
|
# format and the lower 16 bits specify the version number.
|
||||||
|
@ -38,7 +38,7 @@ def write_bytes_prefixed(w: Writer, b: bytes) -> None:
|
|||||||
write_bytes_unchecked(w, b)
|
write_bytes_unchecked(w, b)
|
||||||
|
|
||||||
|
|
||||||
def write_tx_input(w: Writer, i: Union[TxInput, PrevInput], script: bytes,) -> None:
|
def write_tx_input(w: Writer, i: Union[TxInput, PrevInput], script: bytes) -> None:
|
||||||
write_bytes_reversed(w, i.prev_hash, TX_HASH_SIZE)
|
write_bytes_reversed(w, i.prev_hash, TX_HASH_SIZE)
|
||||||
write_uint32(w, i.prev_index)
|
write_uint32(w, i.prev_index)
|
||||||
write_bytes_prefixed(w, script)
|
write_bytes_prefixed(w, script)
|
||||||
|
@ -196,7 +196,9 @@ def _derive_byron_address(
|
|||||||
|
|
||||||
|
|
||||||
def _derive_shelley_address(
|
def _derive_shelley_address(
|
||||||
keychain: seed.Keychain, parameters: CardanoAddressParametersType, network_id: int,
|
keychain: seed.Keychain,
|
||||||
|
parameters: CardanoAddressParametersType,
|
||||||
|
network_id: int,
|
||||||
) -> bytes:
|
) -> bytes:
|
||||||
if not is_shelley_path(parameters.address_n):
|
if not is_shelley_path(parameters.address_n):
|
||||||
raise wire.DataError("Invalid path for shelley address!")
|
raise wire.DataError("Invalid path for shelley address!")
|
||||||
@ -213,7 +215,10 @@ def _derive_shelley_address(
|
|||||||
address = _derive_enterprise_address(keychain, parameters.address_n, network_id)
|
address = _derive_enterprise_address(keychain, parameters.address_n, network_id)
|
||||||
elif parameters.address_type == CardanoAddressType.POINTER:
|
elif parameters.address_type == CardanoAddressType.POINTER:
|
||||||
address = _derive_pointer_address(
|
address = _derive_pointer_address(
|
||||||
keychain, parameters.address_n, parameters.certificate_pointer, network_id,
|
keychain,
|
||||||
|
parameters.address_n,
|
||||||
|
parameters.certificate_pointer,
|
||||||
|
network_id,
|
||||||
)
|
)
|
||||||
elif parameters.address_type == CardanoAddressType.REWARD:
|
elif parameters.address_type == CardanoAddressType.REWARD:
|
||||||
address = _derive_reward_address(keychain, parameters.address_n, network_id)
|
address = _derive_reward_address(keychain, parameters.address_n, network_id)
|
||||||
@ -249,7 +254,8 @@ def _derive_base_address(
|
|||||||
|
|
||||||
|
|
||||||
def _validate_base_address_staking_info(
|
def _validate_base_address_staking_info(
|
||||||
staking_path: List[int], staking_key_hash: bytes,
|
staking_path: List[int],
|
||||||
|
staking_key_hash: bytes,
|
||||||
) -> None:
|
) -> None:
|
||||||
if (staking_key_hash is None) == (not staking_path):
|
if (staking_key_hash is None) == (not staking_path):
|
||||||
raise wire.DataError(
|
raise wire.DataError(
|
||||||
@ -311,7 +317,9 @@ def _encode_certificate_pointer(pointer: CardanoBlockchainPointerType) -> bytes:
|
|||||||
|
|
||||||
|
|
||||||
def _derive_enterprise_address(
|
def _derive_enterprise_address(
|
||||||
keychain: seed.Keychain, path: List[int], network_id: int,
|
keychain: seed.Keychain,
|
||||||
|
path: List[int],
|
||||||
|
network_id: int,
|
||||||
) -> bytes:
|
) -> bytes:
|
||||||
header = _create_address_header(CardanoAddressType.ENTERPRISE, network_id)
|
header = _create_address_header(CardanoAddressType.ENTERPRISE, network_id)
|
||||||
spending_key_hash = get_public_key_hash(keychain, path)
|
spending_key_hash = get_public_key_hash(keychain, path)
|
||||||
@ -320,7 +328,9 @@ def _derive_enterprise_address(
|
|||||||
|
|
||||||
|
|
||||||
def _derive_reward_address(
|
def _derive_reward_address(
|
||||||
keychain: seed.Keychain, path: List[int], network_id: int,
|
keychain: seed.Keychain,
|
||||||
|
path: List[int],
|
||||||
|
network_id: int,
|
||||||
) -> bytes:
|
) -> bytes:
|
||||||
if not is_staking_path(path):
|
if not is_staking_path(path):
|
||||||
raise wire.DataError("Invalid path for reward address!")
|
raise wire.DataError("Invalid path for reward address!")
|
||||||
|
@ -20,7 +20,11 @@ async def get_public_key(
|
|||||||
ctx: wire.Context, msg: CardanoGetPublicKey, keychain: seed.Keychain
|
ctx: wire.Context, msg: CardanoGetPublicKey, keychain: seed.Keychain
|
||||||
):
|
):
|
||||||
await paths.validate_path(
|
await paths.validate_path(
|
||||||
ctx, _validate_path_for_get_public_key, keychain, msg.address_n, CURVE,
|
ctx,
|
||||||
|
_validate_path_for_get_public_key,
|
||||||
|
keychain,
|
||||||
|
msg.address_n,
|
||||||
|
CURVE,
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -80,7 +80,9 @@ async def show_warning_tx_no_staking_info(
|
|||||||
|
|
||||||
|
|
||||||
async def show_warning_tx_pointer_address(
|
async def show_warning_tx_pointer_address(
|
||||||
ctx: wire.Context, pointer: CardanoBlockchainPointerType, amount: int,
|
ctx: wire.Context,
|
||||||
|
pointer: CardanoBlockchainPointerType,
|
||||||
|
amount: int,
|
||||||
):
|
):
|
||||||
page1 = Text("Confirm transaction", ui.ICON_SEND, ui.GREEN)
|
page1 = Text("Confirm transaction", ui.ICON_SEND, ui.GREEN)
|
||||||
page1.normal("Change address has a")
|
page1.normal("Change address has a")
|
||||||
@ -100,7 +102,9 @@ async def show_warning_tx_pointer_address(
|
|||||||
|
|
||||||
|
|
||||||
async def show_warning_tx_different_staking_account(
|
async def show_warning_tx_different_staking_account(
|
||||||
ctx: wire.Context, staking_account_path: List[int], amount: int,
|
ctx: wire.Context,
|
||||||
|
staking_account_path: List[int],
|
||||||
|
amount: int,
|
||||||
):
|
):
|
||||||
page1 = Text("Confirm transaction", ui.ICON_SEND, ui.GREEN)
|
page1 = Text("Confirm transaction", ui.ICON_SEND, ui.GREEN)
|
||||||
page1.normal("Change address staking")
|
page1.normal("Change address staking")
|
||||||
@ -117,7 +121,9 @@ async def show_warning_tx_different_staking_account(
|
|||||||
|
|
||||||
|
|
||||||
async def show_warning_tx_staking_key_hash(
|
async def show_warning_tx_staking_key_hash(
|
||||||
ctx: wire.Context, staking_key_hash: bytes, amount: int,
|
ctx: wire.Context,
|
||||||
|
staking_key_hash: bytes,
|
||||||
|
amount: int,
|
||||||
):
|
):
|
||||||
page1 = Text("Confirm transaction", ui.ICON_SEND, ui.GREEN)
|
page1 = Text("Confirm transaction", ui.ICON_SEND, ui.GREEN)
|
||||||
page1.normal("Change address staking")
|
page1.normal("Change address staking")
|
||||||
@ -282,7 +288,9 @@ async def show_warning_address_foreign_staking_key(
|
|||||||
staking_key_message = ("Staking key:", hexlify(staking_key_hash).decode())
|
staking_key_message = ("Staking key:", hexlify(staking_key_hash).decode())
|
||||||
|
|
||||||
await show_warning(
|
await show_warning(
|
||||||
ctx, staking_key_message, button="Ok",
|
ctx,
|
||||||
|
staking_key_message,
|
||||||
|
button="Ok",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -286,7 +286,8 @@ def _build_withdrawals(
|
|||||||
reward_address = derive_address_bytes(
|
reward_address = derive_address_bytes(
|
||||||
keychain,
|
keychain,
|
||||||
CardanoAddressParametersType(
|
CardanoAddressParametersType(
|
||||||
address_type=CardanoAddressType.REWARD, address_n=withdrawal.path,
|
address_type=CardanoAddressType.REWARD,
|
||||||
|
address_n=withdrawal.path,
|
||||||
),
|
),
|
||||||
protocol_magic,
|
protocol_magic,
|
||||||
network_id,
|
network_id,
|
||||||
@ -465,16 +466,22 @@ async def _show_change_output_staking_warnings(
|
|||||||
await show_warning_tx_no_staking_info(ctx, address_type, amount)
|
await show_warning_tx_no_staking_info(ctx, address_type, amount)
|
||||||
elif staking_use_case == staking_use_cases.POINTER_ADDRESS:
|
elif staking_use_case == staking_use_cases.POINTER_ADDRESS:
|
||||||
await show_warning_tx_pointer_address(
|
await show_warning_tx_pointer_address(
|
||||||
ctx, address_parameters.certificate_pointer, amount,
|
ctx,
|
||||||
|
address_parameters.certificate_pointer,
|
||||||
|
amount,
|
||||||
)
|
)
|
||||||
elif staking_use_case == staking_use_cases.MISMATCH:
|
elif staking_use_case == staking_use_cases.MISMATCH:
|
||||||
if address_parameters.address_n_staking:
|
if address_parameters.address_n_staking:
|
||||||
await show_warning_tx_different_staking_account(
|
await show_warning_tx_different_staking_account(
|
||||||
ctx, to_account_path(address_parameters.address_n_staking), amount,
|
ctx,
|
||||||
|
to_account_path(address_parameters.address_n_staking),
|
||||||
|
amount,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
await show_warning_tx_staking_key_hash(
|
await show_warning_tx_staking_key_hash(
|
||||||
ctx, address_parameters.staking_key_hash, amount,
|
ctx,
|
||||||
|
address_parameters.staking_key_hash,
|
||||||
|
amount,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -113,7 +113,10 @@ class Keychain:
|
|||||||
raise FORBIDDEN_KEY_PATH
|
raise FORBIDDEN_KEY_PATH
|
||||||
|
|
||||||
def _derive_with_cache(
|
def _derive_with_cache(
|
||||||
self, prefix_len: int, path: paths.PathType, new_root: Callable[[], NodeType],
|
self,
|
||||||
|
prefix_len: int,
|
||||||
|
path: paths.PathType,
|
||||||
|
new_root: Callable[[], NodeType],
|
||||||
) -> NodeType:
|
) -> NodeType:
|
||||||
cached_prefix = tuple(path[:prefix_len])
|
cached_prefix = tuple(path[:prefix_len])
|
||||||
cached_root = self._cache.get(cached_prefix) # type: Optional[NodeType]
|
cached_root = self._cache.get(cached_prefix) # type: Optional[NodeType]
|
||||||
@ -141,7 +144,9 @@ class Keychain:
|
|||||||
raise FORBIDDEN_KEY_PATH
|
raise FORBIDDEN_KEY_PATH
|
||||||
|
|
||||||
return self._derive_with_cache(
|
return self._derive_with_cache(
|
||||||
prefix_len=1, path=path, new_root=lambda: Slip21Node(seed=self.seed),
|
prefix_len=1,
|
||||||
|
path=path,
|
||||||
|
new_root=lambda: Slip21Node(seed=self.seed),
|
||||||
)
|
)
|
||||||
|
|
||||||
def __enter__(self) -> "Keychain":
|
def __enter__(self) -> "Keychain":
|
||||||
|
@ -153,7 +153,7 @@ async def require_confirm_change_autolock_delay(ctx, delay_ms):
|
|||||||
await require_confirm(ctx, text, ButtonRequestType.ProtectCall)
|
await require_confirm(ctx, text, ButtonRequestType.ProtectCall)
|
||||||
|
|
||||||
|
|
||||||
async def require_confirm_safety_checks(ctx, level: EnumTypeSafetyCheckLevel,) -> None:
|
async def require_confirm_safety_checks(ctx, level: EnumTypeSafetyCheckLevel) -> None:
|
||||||
if level == SafetyCheckLevel.PromptAlways:
|
if level == SafetyCheckLevel.PromptAlways:
|
||||||
text = Text("Safety override", ui.ICON_CONFIG)
|
text = Text("Safety override", ui.ICON_CONFIG)
|
||||||
text.normal(
|
text.normal(
|
||||||
|
@ -55,7 +55,9 @@ async def all_outputs_set(state: State) -> MoneroTransactionAllOutSetAck:
|
|||||||
|
|
||||||
# Initializes RCTsig structure (fee, tx prefix hash, type)
|
# Initializes RCTsig structure (fee, tx prefix hash, type)
|
||||||
rv_pb = MoneroRingCtSig(
|
rv_pb = MoneroRingCtSig(
|
||||||
txn_fee=state.fee, message=state.tx_prefix_hash, rv_type=state.tx_type,
|
txn_fee=state.fee,
|
||||||
|
message=state.tx_prefix_hash,
|
||||||
|
rv_type=state.tx_type,
|
||||||
)
|
)
|
||||||
|
|
||||||
_out_pk(state)
|
_out_pk(state)
|
||||||
|
@ -198,7 +198,9 @@ def sign_tx(
|
|||||||
and cannot be overriden by kwargs.
|
and cannot be overriden by kwargs.
|
||||||
"""
|
"""
|
||||||
signtx = messages.SignTx(
|
signtx = messages.SignTx(
|
||||||
coin_name=coin_name, inputs_count=len(inputs), outputs_count=len(outputs),
|
coin_name=coin_name,
|
||||||
|
inputs_count=len(inputs),
|
||||||
|
outputs_count=len(outputs),
|
||||||
)
|
)
|
||||||
for name, value in kwargs.items():
|
for name, value in kwargs.items():
|
||||||
if hasattr(signtx, name):
|
if hasattr(signtx, name):
|
||||||
|
@ -152,7 +152,8 @@ def create_certificate(certificate) -> messages.CardanoTxCertificateType:
|
|||||||
or certificate_type == messages.CardanoCertificateType.STAKE_DEREGISTRATION
|
or certificate_type == messages.CardanoCertificateType.STAKE_DEREGISTRATION
|
||||||
):
|
):
|
||||||
return messages.CardanoTxCertificateType(
|
return messages.CardanoTxCertificateType(
|
||||||
type=certificate_type, path=tools.parse_path(path),
|
type=certificate_type,
|
||||||
|
path=tools.parse_path(path),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise ValueError("Unknown certificate type")
|
raise ValueError("Unknown certificate type")
|
||||||
@ -164,7 +165,8 @@ def create_withdrawal(withdrawal) -> messages.CardanoTxWithdrawalType:
|
|||||||
|
|
||||||
path = withdrawal["path"]
|
path = withdrawal["path"]
|
||||||
return messages.CardanoTxWithdrawalType(
|
return messages.CardanoTxWithdrawalType(
|
||||||
path=tools.parse_path(path), amount=int(withdrawal["amount"]),
|
path=tools.parse_path(path),
|
||||||
|
amount=int(withdrawal["amount"]),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -145,7 +145,10 @@ def configure_logging(verbose: int):
|
|||||||
"-j", "--json", "is_json", is_flag=True, help="Print result as JSON object"
|
"-j", "--json", "is_json", is_flag=True, help="Print result as JSON object"
|
||||||
)
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
"-P", "--passphrase-on-host", is_flag=True, help="Enter passphrase on host.",
|
"-P",
|
||||||
|
"--passphrase-on-host",
|
||||||
|
is_flag=True,
|
||||||
|
help="Enter passphrase on host.",
|
||||||
)
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
"-s",
|
"-s",
|
||||||
|
@ -83,7 +83,10 @@ class TrezorClient:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, transport, ui, session_id=None,
|
self,
|
||||||
|
transport,
|
||||||
|
ui,
|
||||||
|
session_id=None,
|
||||||
):
|
):
|
||||||
LOG.info("creating client instance for device: {}".format(transport.get_path()))
|
LOG.info("creating client instance for device: {}".format(transport.get_path()))
|
||||||
self.transport = transport
|
self.transport = transport
|
||||||
@ -326,7 +329,9 @@ class TrezorClient:
|
|||||||
|
|
||||||
@tools.expect(messages.Success, field="message")
|
@tools.expect(messages.Success, field="message")
|
||||||
def ping(
|
def ping(
|
||||||
self, msg, button_protection=False,
|
self,
|
||||||
|
msg,
|
||||||
|
button_protection=False,
|
||||||
):
|
):
|
||||||
# We would like ping to work on any valid TrezorClient instance, but
|
# We would like ping to work on any valid TrezorClient instance, but
|
||||||
# due to the protection modes, we need to go through self.call, and that will
|
# due to the protection modes, we need to go through self.call, and that will
|
||||||
@ -345,7 +350,7 @@ class TrezorClient:
|
|||||||
finally:
|
finally:
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
msg = messages.Ping(message=msg, button_protection=button_protection,)
|
msg = messages.Ping(message=msg, button_protection=button_protection)
|
||||||
return self.call(msg)
|
return self.call(msg)
|
||||||
|
|
||||||
def get_device_id(self):
|
def get_device_id(self):
|
||||||
|
@ -110,8 +110,8 @@ def verify(
|
|||||||
|
|
||||||
def pubkey_from_privkey(privkey: Ed25519PrivateKey) -> Ed25519PublicPoint:
|
def pubkey_from_privkey(privkey: Ed25519PrivateKey) -> Ed25519PublicPoint:
|
||||||
"""Interpret 32 bytes of data as an Ed25519 private key.
|
"""Interpret 32 bytes of data as an Ed25519 private key.
|
||||||
Calculate and return the corresponding public key.
|
Calculate and return the corresponding public key.
|
||||||
"""
|
"""
|
||||||
return Ed25519PublicPoint(_ed25519.publickey_unsafe(privkey))
|
return Ed25519PublicPoint(_ed25519.publickey_unsafe(privkey))
|
||||||
|
|
||||||
|
|
||||||
|
@ -397,7 +397,9 @@ def validate_code_hashes(fw: c.Container, version: FirmwareFormat) -> None:
|
|||||||
def validate_onev2(fw: c.Container, allow_unsigned: bool = False) -> None:
|
def validate_onev2(fw: c.Container, allow_unsigned: bool = False) -> None:
|
||||||
try:
|
try:
|
||||||
check_sig_v1(
|
check_sig_v1(
|
||||||
digest_onev2(fw), fw.header.v1_key_indexes, fw.header.v1_signatures,
|
digest_onev2(fw),
|
||||||
|
fw.header.v1_key_indexes,
|
||||||
|
fw.header.v1_signatures,
|
||||||
)
|
)
|
||||||
except Unsigned:
|
except Unsigned:
|
||||||
if not allow_unsigned:
|
if not allow_unsigned:
|
||||||
|
@ -67,11 +67,11 @@ class PinButton(QPushButton):
|
|||||||
|
|
||||||
class PinMatrixWidget(QWidget):
|
class PinMatrixWidget(QWidget):
|
||||||
"""
|
"""
|
||||||
Displays widget with nine blank buttons and password box.
|
Displays widget with nine blank buttons and password box.
|
||||||
Encodes button clicks into sequence of numbers for passing
|
Encodes button clicks into sequence of numbers for passing
|
||||||
into PinAck messages of Trezor.
|
into PinAck messages of Trezor.
|
||||||
|
|
||||||
show_strength=True may be useful for entering new PIN
|
show_strength=True may be useful for entering new PIN
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, show_strength=True, parent=None):
|
def __init__(self, show_strength=True, parent=None):
|
||||||
@ -142,7 +142,7 @@ class PinMatrixWidget(QWidget):
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
"""
|
"""
|
||||||
Demo application showing PinMatrix widget in action
|
Demo application showing PinMatrix widget in action
|
||||||
"""
|
"""
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
|
||||||
|
@ -54,8 +54,7 @@ DEFAULT_NETWORK_PASSPHRASE = "Public Global Stellar Network ; September 2015"
|
|||||||
|
|
||||||
|
|
||||||
def address_from_public_key(pk_bytes):
|
def address_from_public_key(pk_bytes):
|
||||||
"""Returns the base32-encoded version of pk_bytes (G...)
|
"""Returns the base32-encoded version of pk_bytes (G...)"""
|
||||||
"""
|
|
||||||
final_bytes = bytearray()
|
final_bytes = bytearray()
|
||||||
|
|
||||||
# version
|
# version
|
||||||
@ -80,8 +79,8 @@ def address_to_public_key(address_str):
|
|||||||
|
|
||||||
def parse_transaction_bytes(tx_bytes):
|
def parse_transaction_bytes(tx_bytes):
|
||||||
"""Parses base64data into a map with the following keys:
|
"""Parses base64data into a map with the following keys:
|
||||||
tx - a StellarSignTx describing the transaction header
|
tx - a StellarSignTx describing the transaction header
|
||||||
operations - an array of protobuf message objects for each operation
|
operations - an array of protobuf message objects for each operation
|
||||||
"""
|
"""
|
||||||
tx = messages.StellarSignTx()
|
tx = messages.StellarSignTx()
|
||||||
unpacker = xdrlib.Unpacker(tx_bytes)
|
unpacker = xdrlib.Unpacker(tx_bytes)
|
||||||
|
@ -19,7 +19,8 @@ def request_output(n, tx_hash=None):
|
|||||||
|
|
||||||
def request_meta(tx_hash):
|
def request_meta(tx_hash):
|
||||||
return messages.TxRequest(
|
return messages.TxRequest(
|
||||||
request_type=T.TXMETA, details=messages.TxRequestDetailsType(tx_hash=tx_hash),
|
request_type=T.TXMETA,
|
||||||
|
details=messages.TxRequestDetailsType(tx_hash=tx_hash),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -83,7 +83,8 @@ def test_apply_auto_lock_delay_valid(client, seconds):
|
|||||||
|
|
||||||
@pytest.mark.skip_ui
|
@pytest.mark.skip_ui
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"seconds", [0, 1, 9, 536871, 2 ** 22],
|
"seconds",
|
||||||
|
[0, 1, 9, 536871, 2 ** 22],
|
||||||
)
|
)
|
||||||
def test_apply_auto_lock_delay_out_of_range(client, seconds):
|
def test_apply_auto_lock_delay_out_of_range(client, seconds):
|
||||||
with client:
|
with client:
|
||||||
|
@ -957,7 +957,11 @@ class TestMsgSigntx:
|
|||||||
# Now run the attack, must trigger the exception
|
# Now run the attack, must trigger the exception
|
||||||
with pytest.raises(TrezorFailure) as exc:
|
with pytest.raises(TrezorFailure) as exc:
|
||||||
btc.sign_tx(
|
btc.sign_tx(
|
||||||
client, "Testnet", [inp1], [out1, out2], prev_txes=TX_CACHE_TESTNET,
|
client,
|
||||||
|
"Testnet",
|
||||||
|
[inp1],
|
||||||
|
[out1, out2],
|
||||||
|
prev_txes=TX_CACHE_TESTNET,
|
||||||
)
|
)
|
||||||
|
|
||||||
assert exc.value.code == messages.FailureType.ProcessError
|
assert exc.value.code == messages.FailureType.ProcessError
|
||||||
|
@ -299,7 +299,11 @@ def test_p2wpkh_presigned(client):
|
|||||||
# Test with second input as pre-signed external.
|
# Test with second input as pre-signed external.
|
||||||
with client:
|
with client:
|
||||||
_, serialized_tx = btc.sign_tx(
|
_, serialized_tx = btc.sign_tx(
|
||||||
client, "Testnet", [inp1, inp2], [out1, out2], prev_txes=TX_CACHE_TESTNET,
|
client,
|
||||||
|
"Testnet",
|
||||||
|
[inp1, inp2],
|
||||||
|
[out1, out2],
|
||||||
|
prev_txes=TX_CACHE_TESTNET,
|
||||||
)
|
)
|
||||||
|
|
||||||
assert (
|
assert (
|
||||||
@ -311,7 +315,11 @@ def test_p2wpkh_presigned(client):
|
|||||||
inp2.witness[10] ^= 1
|
inp2.witness[10] ^= 1
|
||||||
with pytest.raises(TrezorFailure, match="Invalid signature"):
|
with pytest.raises(TrezorFailure, match="Invalid signature"):
|
||||||
btc.sign_tx(
|
btc.sign_tx(
|
||||||
client, "Testnet", [inp1, inp2], [out1, out2], prev_txes=TX_CACHE_TESTNET,
|
client,
|
||||||
|
"Testnet",
|
||||||
|
[inp1, inp2],
|
||||||
|
[out1, out2],
|
||||||
|
prev_txes=TX_CACHE_TESTNET,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -482,7 +490,11 @@ def test_p2wpkh_with_proof(client):
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
_, serialized_tx = btc.sign_tx(
|
_, serialized_tx = btc.sign_tx(
|
||||||
client, "Testnet", [inp1, inp2], [out1, out2], prev_txes=TX_CACHE_TESTNET,
|
client,
|
||||||
|
"Testnet",
|
||||||
|
[inp1, inp2],
|
||||||
|
[out1, out2],
|
||||||
|
prev_txes=TX_CACHE_TESTNET,
|
||||||
)
|
)
|
||||||
|
|
||||||
assert (
|
assert (
|
||||||
@ -494,7 +506,11 @@ def test_p2wpkh_with_proof(client):
|
|||||||
inp1.ownership_proof[10] ^= 1
|
inp1.ownership_proof[10] ^= 1
|
||||||
with pytest.raises(TrezorFailure, match="Invalid signature"):
|
with pytest.raises(TrezorFailure, match="Invalid signature"):
|
||||||
btc.sign_tx(
|
btc.sign_tx(
|
||||||
client, "Testnet", [inp1, inp2], [out1, out2], prev_txes=TX_CACHE_TESTNET,
|
client,
|
||||||
|
"Testnet",
|
||||||
|
[inp1, inp2],
|
||||||
|
[out1, out2],
|
||||||
|
prev_txes=TX_CACHE_TESTNET,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -551,5 +567,9 @@ def test_p2wpkh_with_false_proof(client):
|
|||||||
|
|
||||||
with pytest.raises(TrezorFailure, match="Invalid external input"):
|
with pytest.raises(TrezorFailure, match="Invalid external input"):
|
||||||
btc.sign_tx(
|
btc.sign_tx(
|
||||||
client, "Testnet", [inp1, inp2], [out1], prev_txes=TX_CACHE_TESTNET,
|
client,
|
||||||
|
"Testnet",
|
||||||
|
[inp1, inp2],
|
||||||
|
[out1],
|
||||||
|
prev_txes=TX_CACHE_TESTNET,
|
||||||
)
|
)
|
||||||
|
@ -408,7 +408,11 @@ class TestMsgSigntxSegwit:
|
|||||||
# "Fee over threshold" warning is displayed - fee is the whole TRUE_AMOUNT
|
# "Fee over threshold" warning is displayed - fee is the whole TRUE_AMOUNT
|
||||||
client.set_expected_responses(expected_responses)
|
client.set_expected_responses(expected_responses)
|
||||||
btc.sign_tx(
|
btc.sign_tx(
|
||||||
client, "Testnet", [inp1, inp2], [out1], prev_txes=TX_API,
|
client,
|
||||||
|
"Testnet",
|
||||||
|
[inp1, inp2],
|
||||||
|
[out1],
|
||||||
|
prev_txes=TX_API,
|
||||||
)
|
)
|
||||||
|
|
||||||
# In Phase 1 make the user confirm a lower value of the segwit input.
|
# In Phase 1 make the user confirm a lower value of the segwit input.
|
||||||
@ -427,7 +431,11 @@ class TestMsgSigntxSegwit:
|
|||||||
with pytest.raises(TrezorFailure) as e, client:
|
with pytest.raises(TrezorFailure) as e, client:
|
||||||
client.set_expected_responses(expected_responses)
|
client.set_expected_responses(expected_responses)
|
||||||
btc.sign_tx(
|
btc.sign_tx(
|
||||||
client, "Testnet", [inp1, inp2], [out1], prev_txes=TX_API,
|
client,
|
||||||
|
"Testnet",
|
||||||
|
[inp1, inp2],
|
||||||
|
[out1],
|
||||||
|
prev_txes=TX_API,
|
||||||
)
|
)
|
||||||
|
|
||||||
assert e.value.failure.message.endswith("Invalid amount specified")
|
assert e.value.failure.message.endswith("Invalid amount specified")
|
||||||
|
@ -159,7 +159,12 @@ class TestMsgSigntxZcash:
|
|||||||
|
|
||||||
with pytest.raises(TrezorFailure, match="Version group ID must be set."):
|
with pytest.raises(TrezorFailure, match="Version group ID must be set."):
|
||||||
btc.sign_tx(
|
btc.sign_tx(
|
||||||
client, "Zcash Testnet", [inp1], [out1], version=4, prev_txes=TX_API,
|
client,
|
||||||
|
"Zcash Testnet",
|
||||||
|
[inp1],
|
||||||
|
[out1],
|
||||||
|
version=4,
|
||||||
|
prev_txes=TX_API,
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_spend_old_versions(self, client):
|
def test_spend_old_versions(self, client):
|
||||||
|
@ -83,7 +83,10 @@ class EmulatorWrapper:
|
|||||||
|
|
||||||
if gen == "legacy":
|
if gen == "legacy":
|
||||||
self.emulator = LegacyEmulator(
|
self.emulator = LegacyEmulator(
|
||||||
executable, self.profile_dir.name, storage=storage, headless=True,
|
executable,
|
||||||
|
self.profile_dir.name,
|
||||||
|
storage=storage,
|
||||||
|
headless=True,
|
||||||
)
|
)
|
||||||
elif gen == "core":
|
elif gen == "core":
|
||||||
self.emulator = CoreEmulator(
|
self.emulator = CoreEmulator(
|
||||||
|
@ -178,7 +178,11 @@ def create_reports():
|
|||||||
"Folder does not exist, has it been recorded?", current_screens
|
"Folder does not exist, has it been recorded?", current_screens
|
||||||
)
|
)
|
||||||
diff(
|
diff(
|
||||||
master_screens, current_screens, test_name, master_hash, current_hash,
|
master_screens,
|
||||||
|
current_screens,
|
||||||
|
test_name,
|
||||||
|
master_hash,
|
||||||
|
current_hash,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,7 +46,9 @@ def emulator(gen, tag):
|
|||||||
with EmulatorWrapper(gen, tag) as emu:
|
with EmulatorWrapper(gen, tag) as emu:
|
||||||
# set up a passphrase-protected device
|
# set up a passphrase-protected device
|
||||||
device.reset(
|
device.reset(
|
||||||
emu.client, pin_protection=False, skip_backup=True,
|
emu.client,
|
||||||
|
pin_protection=False,
|
||||||
|
skip_backup=True,
|
||||||
)
|
)
|
||||||
resp = emu.client.call(
|
resp = emu.client.call(
|
||||||
ApplySettingsCompat(use_passphrase=True, passphrase_source=SOURCE_HOST)
|
ApplySettingsCompat(use_passphrase=True, passphrase_source=SOURCE_HOST)
|
||||||
|
Loading…
Reference in New Issue
Block a user