fix(test): skip incompatible tests with BTC-only FW
What changed, and why it matters
This commit only changes test files so that ten unit tests are skipped when running against the Bitcoin-only firmware variant. It does not modify the actual Trezor firmware code that users run, so it cannot directly affect device security or user funds.
No security action required; this is a test-suite maintenance change. Continue normal review/CI verification.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch wraps imports and module-level test data in if not utils.BITCOIN_ONLY: guards and adds @unittest.skipUnless(not utils.BITCOIN_ONLY, ...) decorators in eleven test files (Cardano, Ethereum typed data, Solana, Zcash, and protobuf tests). This prevents ImportError/AttributeError failures on BTC-only builds where altcoin modules are excluded. The protobuf test additionally swaps example message types from WebAuthnCredential/DebugLinkMemoryRead to ApplySettings/MoneroTransactionDestinationEntry, still purely within test helpers.
Changed components
core/tests/test_apps.cardano.address.pycore/tests/test_apps.cardano.certificate.pycore/tests/test_apps.cardano.credential.pycore/tests/test_apps.cardano.get_public_key.pycore/tests/test_apps.cardano.native_script.pycore/tests/test_apps.cardano.seed.pycore/tests/test_apps.ethereum.sign_typed_data.pycore/tests/test_apps.solana.predefined_transaction.pycore/tests/test_apps.solana.predefined_transaction.py.makocore/tests/test_apps.zcash.unified_addresses.pycore/tests/test_trezor.protobuf.pyInspect captured patch +865 / −803
diff --git a/core/tests/test_apps.cardano.address.py b/core/tests/test_apps.cardano.address.py
index 007d4110..63dc5001 100644
--- a/core/tests/test_apps.cardano.address.py
+++ b/core/tests/test_apps.cardano.address.py
@@ -1,15 +1,16 @@
# flake8: noqa: F403,F405
from common import * # isort:skip
-from trezor import wire
-from trezor.crypto import bip39, cardano, slip39
-from trezor.enums import CardanoAddressType
-from trezor.messages import CardanoAddressParametersType, CardanoBlockchainPointerType
+if not utils.BITCOIN_ONLY:
-from apps.common import seed
-from apps.common.paths import HARDENED
+ from trezor import wire
+ from trezor.crypto import bip39, cardano, slip39
+ from trezor.enums import CardanoAddressType
+ from trezor.messages import (
+ CardanoAddressParametersType,
+ CardanoBlockchainPointerType,
+ )
-if not utils.BITCOIN_ONLY:
from apps.cardano.addresses import (
derive_human_readable,
validate_address_parameters,
@@ -17,6 +18,8 @@ if not utils.BITCOIN_ONLY:
from apps.cardano.byron_addresses import _address_hash
from apps.cardano.helpers import network_ids, protocol_magics
from apps.cardano.seed import Keychain
+ from apps.common import seed
+ from apps.common.paths import HARDENED
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
diff --git a/core/tests/test_apps.cardano.certificate.py b/core/tests/test_apps.cardano.certificate.py
index e0399249..198d5e74 100644
--- a/core/tests/test_apps.cardano.certificate.py
+++ b/core/tests/test_apps.cardano.certificate.py
@@ -1,16 +1,20 @@
# flake8: noqa: F403,F405
from common import * # isort:skip
-from trezor import wire
-from trezor.enums import CardanoCertificateType, CardanoDRepType
-from trezor.messages import CardanoDRep, CardanoPoolParametersType, CardanoTxCertificate
+if not utils.BITCOIN_ONLY:
-from apps.common.paths import HARDENED
+ from trezor import wire
+ from trezor.enums import CardanoCertificateType, CardanoDRepType
+ from trezor.messages import (
+ CardanoDRep,
+ CardanoPoolParametersType,
+ CardanoTxCertificate,
+ )
-if not utils.BITCOIN_ONLY:
from apps.cardano import certificates
from apps.cardano.helpers import network_ids, protocol_magics
from apps.cardano.helpers.account_path_check import AccountPathChecker
+ from apps.common.paths import HARDENED
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
diff --git a/core/tests/test_apps.cardano.credential.py b/core/tests/test_apps.cardano.credential.py
index a86dbc42..3734a9f0 100644
--- a/core/tests/test_apps.cardano.credential.py
+++ b/core/tests/test_apps.cardano.credential.py
@@ -1,253 +1,315 @@
# flake8: noqa: F403,F405
from common import * # isort:skip
-from trezor.enums import CardanoAddressType
-from trezor.messages import CardanoAddressParametersType, CardanoBlockchainPointerType
+if not utils.BITCOIN_ONLY:
-from apps.cardano.helpers.credential import Credential
-from apps.common.paths import HARDENED
-
-CERTIFICATE_POINTER = CardanoBlockchainPointerType(
- block_index=24157,
- tx_index=177,
- certificate_index=42,
-)
+ from trezor.enums import CardanoAddressType
+ from trezor.messages import (
+ CardanoAddressParametersType,
+ CardanoBlockchainPointerType,
+ )
+ from apps.cardano.helpers.credential import Credential
+ from apps.common.paths import HARDENED
-def _create_flags(
- is_reward: bool = False,
- is_no_staking: bool = False,
- is_mismatch: bool = False,
- is_unusual_path: bool = False,
- is_other_warning: bool = False,
-) -> tuple[bool, ...]:
- return (is_reward, is_no_staking, is_mismatch, is_unusual_path, is_other_warning)
+ CERTIFICATE_POINTER = CardanoBlockchainPointerType(
+ block_index=24157,
+ tx_index=177,
+ certificate_index=42,
+ )
+ def _create_flags(
+ is_reward: bool = False,
+ is_no_staking: bool = False,
+ is_mismatch: bool = False,
+ is_unusual_path: bool = False,
+ is_other_warning: bool = False,
+ ) -> tuple[bool, ...]:
+ return (
+ is_reward,
+ is_no_staking,
+ is_mismatch,
+ is_unusual_path,
+ is_other_warning,
+ )
-ADDRESS_PARAMETERS_CASES = [
- # base
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BASE,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
- address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 2, 0],
+ ADDRESS_PARAMETERS_CASES = [
+ # base
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BASE,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ address_n_staking=[
+ 1852 | HARDENED,
+ 1815 | HARDENED,
+ 0 | HARDENED,
+ 2,
+ 0,
+ ],
+ ),
+ _create_flags(),
+ _create_flags(),
),
- _create_flags(),
- _create_flags(),
- ),
- # base mismatch
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BASE,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
- address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 1 | HARDENED, 2, 0],
+ # base mismatch
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BASE,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ address_n_staking=[
+ 1852 | HARDENED,
+ 1815 | HARDENED,
+ 1 | HARDENED,
+ 2,
+ 0,
+ ],
+ ),
+ _create_flags(),
+ _create_flags(is_mismatch=True),
),
- _create_flags(),
- _create_flags(is_mismatch=True),
- ),
- # base payment unusual
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BASE,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
- address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 2, 0],
+ # base payment unusual
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BASE,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
+ address_n_staking=[
+ 1852 | HARDENED,
+ 1815 | HARDENED,
+ 0 | HARDENED,
+ 2,
+ 0,
+ ],
+ ),
+ _create_flags(is_unusual_path=True),
+ _create_flags(is_mismatch=True),
),
- _create_flags(is_unusual_path=True),
- _create_flags(is_mismatch=True),
- ),
- # base staking unusual
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BASE,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
- address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 2, 0],
+ # base staking unusual
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BASE,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
+ address_n_staking=[
+ 1852 | HARDENED,
+ 1815 | HARDENED,
+ 101 | HARDENED,
+ 2,
+ 0,
+ ],
+ ),
+ _create_flags(is_unusual_path=True),
+ _create_flags(is_unusual_path=True),
),
- _create_flags(is_unusual_path=True),
- _create_flags(is_unusual_path=True),
- ),
- # base both unusual and mismatch
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BASE,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
- address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 102 | HARDENED, 2, 0],
+ # base both unusual and mismatch
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BASE,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
+ address_n_staking=[
+ 1852 | HARDENED,
+ 1815 | HARDENED,
+ 102 | HARDENED,
+ 2,
+ 0,
+ ],
+ ),
+ _create_flags(is_unusual_path=True),
+ _create_flags(is_mismatch=True, is_unusual_path=True),
),
- _create_flags(is_unusual_path=True),
- _create_flags(is_mismatch=True, is_unusual_path=True),
- ),
- # base staking key hash
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BASE,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
- staking_key_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ # base staking key hash
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BASE,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ staking_key_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ ),
+ _create_flags(),
+ _create_flags(is_other_warning=True),
),
- _create_flags(),
- _create_flags(is_other_warning=True),
- ),
- # base key script
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BASE_KEY_SCRIPT,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
- staking_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ # base key script
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BASE_KEY_SCRIPT,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ staking_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ ),
+ _create_flags(),
+ _create_flags(is_other_warning=True),
),
- _create_flags(),
- _create_flags(is_other_warning=True),
- ),
- # base key script unusual
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BASE_KEY_SCRIPT,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
- staking_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ # base key script unusual
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BASE_KEY_SCRIPT,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
+ staking_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ ),
+ _create_flags(is_unusual_path=True),
+ _create_flags(is_other_warning=True),
),
- _create_flags(is_unusual_path=True),
- _create_flags(is_other_warning=True),
- ),
- # base script key
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BASE_SCRIPT_KEY,
- payment_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
- address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 2, 0],
+ # base script key
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BASE_SCRIPT_KEY,
+ payment_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ address_n_staking=[
+ 1852 | HARDENED,
+ 1815 | HARDENED,
+ 0 | HARDENED,
+ 2,
+ 0,
+ ],
+ ),
+ _create_flags(is_other_warning=True),
+ _create_flags(),
),
- _create_flags(is_other_warning=True),
- _create_flags(),
- ),
- # base script key unusual
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BASE_SCRIPT_KEY,
- payment_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
- address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 2, 0],
+ # base script key unusual
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BASE_SCRIPT_KEY,
+ payment_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ address_n_staking=[
+ 1852 | HARDENED,
+ 1815 | HARDENED,
+ 101 | HARDENED,
+ 2,
+ 0,
+ ],
+ ),
+ _create_flags(is_other_warning=True),
+ _create_flags(is_unusual_path=True),
),
- _create_flags(is_other_warning=True),
- _create_flags(is_unusual_path=True),
- ),
- # base script script
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BASE_SCRIPT_SCRIPT,
- payment_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
- staking_script_hash="2bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ # base script script
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BASE_SCRIPT_SCRIPT,
+ payment_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ staking_script_hash="2bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ ),
+ _create_flags(is_other_warning=True),
+ _create_flags(is_other_warning=True),
),
- _create_flags(is_other_warning=True),
- _create_flags(is_other_warning=True),
- ),
- # pointer
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.POINTER,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
- certificate_pointer=CERTIFICATE_POINTER,
+ # pointer
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.POINTER,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ certificate_pointer=CERTIFICATE_POINTER,
+ ),
+ _create_flags(),
+ _create_flags(is_other_warning=True),
),
- _create_flags(),
- _create_flags(is_other_warning=True),
- ),
- # pointer unusual
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.POINTER,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
- certificate_pointer=CERTIFICATE_POINTER,
+ # pointer unusual
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.POINTER,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
+ certificate_pointer=CERTIFICATE_POINTER,
+ ),
+ _create_flags(is_unusual_path=True),
+ _create_flags(is_other_warning=True),
),
- _create_flags(is_unusual_path=True),
- _create_flags(is_other_warning=True),
- ),
- # pointer script
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.POINTER_SCRIPT,
- payment_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
- certificate_pointer=CERTIFICATE_POINTER,
+ # pointer script
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.POINTER_SCRIPT,
+ payment_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ certificate_pointer=CERTIFICATE_POINTER,
+ ),
+ _create_flags(is_other_warning=True),
+ _create_flags(is_other_warning=True),
),
- _create_flags(is_other_warning=True),
- _create_flags(is_other_warning=True),
- ),
- # enterprise
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.ENTERPRISE,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ # enterprise
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.ENTERPRISE,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ ),
+ _create_flags(),
+ _create_flags(is_no_staking=True),
),
- _create_flags(),
- _create_flags(is_no_staking=True),
- ),
- # enterprise unusual
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.ENTERPRISE,
- address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
+ # enterprise unusual
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.ENTERPRISE,
+ address_n=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
+ ),
+ _create_flags(is_unusual_path=True),
+ _create_flags(is_no_staking=True),
),
- _create_flags(is_unusual_path=True),
- _create_flags(is_no_staking=True),
- ),
- # enterprise script
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.ENTERPRISE_SCRIPT,
- payment_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ # enterprise script
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.ENTERPRISE_SCRIPT,
+ payment_script_hash="1bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ ),
+ _create_flags(is_other_warning=True),
+ _create_flags(is_no_staking=True),
),
- _create_flags(is_other_warning=True),
- _create_flags(is_no_staking=True),
- ),
- # reward
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.REWARD,
- address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 2, 0],
+ # reward
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.REWARD,
+ address_n_staking=[
+ 1852 | HARDENED,
+ 1815 | HARDENED,
+ 0 | HARDENED,
+ 2,
+ 0,
+ ],
+ ),
+ _create_flags(is_reward=True),
+ _create_flags(),
),
- _create_flags(is_reward=True),
- _create_flags(),
- ),
- # reward unusual
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.REWARD,
- address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 2, 0],
+ # reward unusual
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.REWARD,
+ address_n_staking=[
+ 1852 | HARDENED,
+ 1815 | HARDENED,
+ 101 | HARDENED,
+ 2,
+ 0,
+ ],
+ ),
+ _create_flags(is_reward=True),
+ _create_flags(is_unusual_path=True),
),
- _create_flags(is_reward=True),
- _create_flags(is_unusual_path=True),
- ),
- # reward script
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.REWARD_SCRIPT,
- staking_script_hash="2bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ # reward script
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.REWARD_SCRIPT,
+ staking_script_hash="2bc428e4720732ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff",
+ ),
+ _create_flags(is_reward=True),
+ _create_flags(is_other_warning=True),
),
- _create_flags(is_reward=True),
- _create_flags(is_other_warning=True),
- ),
- # byron
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BYRON,
- address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ # byron
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BYRON,
+ address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ ),
+ _create_flags(),
+ _create_flags(is_no_staking=True),
),
- _create_flags(),
- _create_flags(is_no_staking=True),
- ),
- # byron unusual
- (
- CardanoAddressParametersType(
- address_type=CardanoAddressType.BYRON,
- address_n=[44 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
+ # byron unusual
+ (
+ CardanoAddressParametersType(
+ address_type=CardanoAddressType.BYRON,
+ address_n=[44 | HARDENED, 1815 | HARDENED, 101 | HARDENED, 0, 0],
+ ),
+ _create_flags(is_unusual_path=True),
+ _create_flags(is_no_staking=True),
),
- _create_flags(is_unusual_path=True),
- _create_flags(is_no_staking=True),
- ),
-]
+ ]
-
-def _get_flags(credential: Credential) -> tuple[bool, ...]:
- return (
- credential.is_reward,
- credential.is_no_staking,
- credential.is_mismatch,
- credential.is_unusual_path,
- credential.is_other_warning,
- )
+ def _get_flags(credential: Credential) -> tuple[bool, ...]:
+ return (
+ credential.is_reward,
+ credential.is_no_staking,
+ credential.is_mismatch,
+ credential.is_unusual_path,
+ credential.is_other_warning,
+ )
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
diff --git a/core/tests/test_apps.cardano.get_public_key.py b/core/tests/test_apps.cardano.get_public_key.py
index 75d9d50a..be487b5d 100644
--- a/core/tests/test_apps.cardano.get_public_key.py
+++ b/core/tests/test_apps.cardano.get_public_key.py
@@ -1,10 +1,11 @@
# flake8: noqa: F403,F405
from common import * # isort:skip
-from trezor.crypto import bip39, cardano, slip39
+if not utils.BITCOIN_ONLY:
+ from trezor.crypto import bip39, cardano, slip39
-from apps.cardano.get_public_key import _get_public_key
-from apps.cardano.seed import Keychain
+ from apps.cardano.get_public_key import _get_public_key
+ from apps.cardano.seed import Keychain
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
diff --git a/core/tests/test_apps.cardano.native_script.py b/core/tests/test_apps.cardano.native_script.py
index 4c7f7871..5385d0ee 100644
--- a/core/tests/test_apps.cardano.native_script.py
+++ b/core/tests/test_apps.cardano.native_script.py
@@ -1,297 +1,301 @@
# flake8: noqa: F403,F405
from common import * # isort:skip
-from trezor import wire
-from trezor.crypto import bip39, cardano
-from trezor.enums import CardanoNativeScriptType
-from trezor.messages import CardanoNativeScript
-
if not utils.BITCOIN_ONLY:
+ from trezor import wire
+ from trezor.crypto import bip39, cardano
+ from trezor.enums import CardanoNativeScriptType
+ from trezor.messages import CardanoNativeScript
+
from apps.cardano.native_script import (
get_native_script_hash,
validate_native_script,
)
from apps.cardano.seed import Keychain
-VALID_NATIVE_SCRIPTS = [
- # PUB_KEY
- [
+ VALID_NATIVE_SCRIPTS = [
+ # PUB_KEY
+ [
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "c4b9265645fde9536c0795adbcc5291767a0c61fd62448341d7e0386"
+ ),
+ ),
+ b"29fb5fd4aa8cadd6705acc8263cee0fc62edca5ac38db593fec2f9fd",
+ ],
+ # PUB_KEY with path
+ [
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ ),
+ b"29fb5fd4aa8cadd6705acc8263cee0fc62edca5ac38db593fec2f9fd",
+ ],
+ # ALL
+ [
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.ALL,
+ scripts=[
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
+ ),
+ ),
+ ],
+ ),
+ b"af5c2ce476a6ede1c879f7b1909d6a0b96cb2081391712d4a355cef6",
+ ],
+ # ALL with 1855 path
+ [
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.ALL,
+ scripts=[
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_path=[1855 | HARDENED, 1815 | HARDENED, 0 | HARDENED],
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
+ ),
+ ),
+ ],
+ ),
+ b"fbf6672eb655c29b0f148fa1429be57c2174b067a7b3e3942e967fe8",
+ ],
+ # ALL scripts are empty
+ [
+ CardanoNativeScript(type=CardanoNativeScriptType.ALL, scripts=[]),
+ b"d441227553a0f1a965fee7d60a0f724b368dd1bddbc208730fccebcf",
+ ],
+ # ANY
+ [
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.ANY,
+ scripts=[
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
+ ),
+ ),
+ ],
+ ),
+ b"d6428ec36719146b7b5fb3a2d5322ce702d32762b8c7eeeb797a20db",
+ ],
+ # ANY scripts are empty
+ [
+ CardanoNativeScript(type=CardanoNativeScriptType.ANY, scripts=[]),
+ b"52dc3d43b6d2465e96109ce75ab61abe5e9c1d8a3c9ce6ff8a3af528",
+ ],
+ # N OF K
+ [
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.N_OF_K,
+ required_signatures_count=2,
+ scripts=[
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
+ ),
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "cecb1d427c4ae436d28cc0f8ae9bb37501a5b77bcc64cd1693e9ae20"
+ ),
+ ),
+ ],
+ ),
+ b"2b2b17fd18e18acae4601d4818a1dee00a917ff72e772fa8482e36c9",
+ ],
+ # N_OF_K scripts are empty
+ [
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.N_OF_K,
+ required_signatures_count=0,
+ scripts=[],
+ ),
+ b"3530cc9ae7f2895111a99b7a02184dd7c0cea7424f1632d73951b1d7",
+ ],
+ # INVALID BEFORE
+ [
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.ALL,
+ scripts=[
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "c4b9265645fde9536c0795adbcc5291767a0c61fd62448341d7e0386"
+ ),
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.INVALID_BEFORE, invalid_before=100
+ ),
+ ],
+ ),
+ b"c6262ef9bb2b1291c058d93b46dabf458e2d135f803f60713f84b0b7",
+ ],
+ # INVALID HEREAFTER
+ [
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.ALL,
+ scripts=[
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "c4b9265645fde9536c0795adbcc5291767a0c61fd62448341d7e0386"
+ ),
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.INVALID_HEREAFTER,
+ invalid_hereafter=200,
+ ),
+ ],
+ ),
+ b"b12ac304f89f4cd4d23f59a2b90d2b2697f7540b8f470d6aa05851b5",
+ ],
+ # NESTED SCRIPT
+ [
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.ALL,
+ scripts=[
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "c4b9265645fde9536c0795adbcc5291767a0c61fd62448341d7e0386"
+ ),
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.ANY,
+ scripts=[
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_path=[
+ 1854 | HARDENED,
+ 1815 | HARDENED,
+ 0 | HARDENED,
+ 0,
+ 0,
+ ],
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
+ ),
+ ),
+ ],
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.N_OF_K,
+ required_signatures_count=2,
+ scripts=[
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_path=[
+ 1854 | HARDENED,
+ 1815 | HARDENED,
+ 0 | HARDENED,
+ 0,
+ 0,
+ ],
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
+ ),
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_hash=unhexlify(
+ "cecb1d427c4ae436d28cc0f8ae9bb37501a5b77bcc64cd1693e9ae20"
+ ),
+ ),
+ ],
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.INVALID_BEFORE, invalid_before=100
+ ),
+ CardanoNativeScript(
+ type=CardanoNativeScriptType.INVALID_HEREAFTER,
+ invalid_hereafter=200,
+ ),
+ ],
+ ),
+ b"4a6b4288459bf34668c0b281f922691460caf0c7c09caee3a726c27a",
+ ],
+ ]
+
+ INVALID_SCRIPTS = [
+ # PUB_KEY key_hash has invalid length
CardanoNativeScript(
type=CardanoNativeScriptType.PUB_KEY,
key_hash=unhexlify(
- "c4b9265645fde9536c0795adbcc5291767a0c61fd62448341d7e0386"
+ "3a55d9f68255dfbefa1efd711f82d005fae1be2e145d616c90cf0f"
),
),
- b"29fb5fd4aa8cadd6705acc8263cee0fc62edca5ac38db593fec2f9fd",
- ],
- # PUB_KEY with path
- [
+ # PUB_KEY key_path is not multisig or mint
CardanoNativeScript(
type=CardanoNativeScriptType.PUB_KEY,
- key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
+ key_path=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
),
- b"29fb5fd4aa8cadd6705acc8263cee0fc62edca5ac38db593fec2f9fd",
- ],
- # ALL
- [
+ # PUB_KEY mint key_path is too long
CardanoNativeScript(
- type=CardanoNativeScriptType.ALL,
- scripts=[
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify(
- "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
- ),
- ),
- ],
- ),
- b"af5c2ce476a6ede1c879f7b1909d6a0b96cb2081391712d4a355cef6",
- ],
- # ALL with 1855 path
- [
- CardanoNativeScript(
- type=CardanoNativeScriptType.ALL,
- scripts=[
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_path=[1855 | HARDENED, 1815 | HARDENED, 0 | HARDENED],
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify(
- "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
- ),
- ),
- ],
+ type=CardanoNativeScriptType.PUB_KEY,
+ key_path=[1855 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0],
),
- b"fbf6672eb655c29b0f148fa1429be57c2174b067a7b3e3942e967fe8",
- ],
- # ALL scripts are empty
- [
- CardanoNativeScript(type=CardanoNativeScriptType.ALL, scripts=[]),
- b"d441227553a0f1a965fee7d60a0f724b368dd1bddbc208730fccebcf",
- ],
- # ANY
- [
+ # N_OF_K required_signatures_count is not set
CardanoNativeScript(
- type=CardanoNativeScriptType.ANY,
+ type=CardanoNativeScriptType.N_OF_K,
scripts=[
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
- ),
CardanoNativeScript(
type=CardanoNativeScriptType.PUB_KEY,
key_hash=unhexlify(
- "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
+ "3a55d9f68255dfbefa1efd711f82d005fae1be2e145d616c90cf0fa9"
),
),
],
),
- b"d6428ec36719146b7b5fb3a2d5322ce702d32762b8c7eeeb797a20db",
- ],
- # ANY scripts are empty
- [
- CardanoNativeScript(type=CardanoNativeScriptType.ANY, scripts=[]),
- b"52dc3d43b6d2465e96109ce75ab61abe5e9c1d8a3c9ce6ff8a3af528",
- ],
- # N OF K
- [
+ # N_OF_K N is larger than K
CardanoNativeScript(
type=CardanoNativeScriptType.N_OF_K,
required_signatures_count=2,
scripts=[
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
- ),
CardanoNativeScript(
type=CardanoNativeScriptType.PUB_KEY,
key_hash=unhexlify(
- "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
- ),
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify(
- "cecb1d427c4ae436d28cc0f8ae9bb37501a5b77bcc64cd1693e9ae20"
+ "3a55d9f68255dfbefa1efd711f82d005fae1be2e145d616c90cf0fa9"
),
),
],
),
- b"2b2b17fd18e18acae4601d4818a1dee00a917ff72e772fa8482e36c9",
- ],
- # N_OF_K scripts are empty
- [
- CardanoNativeScript(
- type=CardanoNativeScriptType.N_OF_K, required_signatures_count=0, scripts=[]
- ),
- b"3530cc9ae7f2895111a99b7a02184dd7c0cea7424f1632d73951b1d7",
- ],
- # INVALID BEFORE
- [
- CardanoNativeScript(
- type=CardanoNativeScriptType.ALL,
- scripts=[
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify(
- "c4b9265645fde9536c0795adbcc5291767a0c61fd62448341d7e0386"
- ),
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.INVALID_BEFORE, invalid_before=100
- ),
- ],
- ),
- b"c6262ef9bb2b1291c058d93b46dabf458e2d135f803f60713f84b0b7",
- ],
- # INVALID HEREAFTER
- [
- CardanoNativeScript(
- type=CardanoNativeScriptType.ALL,
- scripts=[
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify(
- "c4b9265645fde9536c0795adbcc5291767a0c61fd62448341d7e0386"
- ),
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.INVALID_HEREAFTER,
- invalid_hereafter=200,
- ),
- ],
- ),
- b"b12ac304f89f4cd4d23f59a2b90d2b2697f7540b8f470d6aa05851b5",
- ],
- # NESTED SCRIPT
- [
- CardanoNativeScript(
- type=CardanoNativeScriptType.ALL,
- scripts=[
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify(
- "c4b9265645fde9536c0795adbcc5291767a0c61fd62448341d7e0386"
- ),
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.ANY,
- scripts=[
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_path=[
- 1854 | HARDENED,
- 1815 | HARDENED,
- 0 | HARDENED,
- 0,
- 0,
- ],
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify(
- "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
- ),
- ),
- ],
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.N_OF_K,
- required_signatures_count=2,
- scripts=[
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_path=[
- 1854 | HARDENED,
- 1815 | HARDENED,
- 0 | HARDENED,
- 0,
- 0,
- ],
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify(
- "0241f2d196f52a92fbd2183d03b370c30b6960cfdeae364ffabac889"
- ),
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify(
- "cecb1d427c4ae436d28cc0f8ae9bb37501a5b77bcc64cd1693e9ae20"
- ),
- ),
- ],
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.INVALID_BEFORE, invalid_before=100
- ),
- CardanoNativeScript(
- type=CardanoNativeScriptType.INVALID_HEREAFTER,
- invalid_hereafter=200,
- ),
- ],
- ),
- b"4a6b4288459bf34668c0b281f922691460caf0c7c09caee3a726c27a",
- ],
-]
-
-INVALID_SCRIPTS = [
- # PUB_KEY key_hash has invalid length
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify("3a55d9f68255dfbefa1efd711f82d005fae1be2e145d616c90cf0f"),
- ),
- # PUB_KEY key_path is not multisig or mint
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_path=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
- ),
- # PUB_KEY mint key_path is too long
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_path=[1855 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0],
- ),
- # N_OF_K required_signatures_count is not set
- CardanoNativeScript(
- type=CardanoNativeScriptType.N_OF_K,
- scripts=[
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify(
- "3a55d9f68255dfbefa1efd711f82d005fae1be2e145d616c90cf0fa9"
- ),
- ),
- ],
- ),
- # N_OF_K N is larger than K
- CardanoNativeScript(
- type=CardanoNativeScriptType.N_OF_K,
- required_signatures_count=2,
- scripts=[
- CardanoNativeScript(
- type=CardanoNativeScriptType.PUB_KEY,
- key_hash=unhexlify(
- "3a55d9f68255dfbefa1efd711f82d005fae1be2e145d616c90cf0fa9"
- ),
- ),
- ],
- ),
- # INVALID_BEFORE invalid_before is not set
- CardanoNativeScript(type=CardanoNativeScriptType.INVALID_BEFORE),
- # INVALID_HEREAFTER invalid_hereafter is not set
- CardanoNativeScript(type=CardanoNativeScriptType.INVALID_HEREAFTER),
-]
+ # INVALID_BEFORE invalid_before is not set
+ CardanoNativeScript(type=CardanoNativeScriptType.INVALID_BEFORE),
+ # INVALID_HEREAFTER invalid_hereafter is not set
+ CardanoNativeScript(type=CardanoNativeScriptType.INVALID_HEREAFTER),
+ ]
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
diff --git a/core/tests/test_apps.cardano.seed.py b/core/tests/test_apps.cardano.seed.py
index 8e9a0450..94cec6fd 100644
--- a/core/tests/test_apps.cardano.seed.py
+++ b/core/tests/test_apps.cardano.seed.py
@@ -1,13 +1,12 @@
# flake8: noqa: F403,F405
from common import * # isort:skip
-from trezor.crypto import bip39, cardano
-
-from apps.common.paths import HARDENED
-
if not utils.BITCOIN_ONLY:
+ from trezor.crypto import bip39, cardano
+
from apps.cardano.get_public_key import _get_public_key
from apps.cardano.seed import Keychain
+ from apps.common.paths import HARDENED
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
diff --git a/core/tests/test_apps.ethereum.sign_typed_data.py b/core/tests/test_apps.ethereum.sign_typed_data.py
index 3516f276..f992028c 100644
--- a/core/tests/test_apps.ethereum.sign_typed_data.py
+++ b/core/tests/test_apps.ethereum.sign_typed_data.py
@@ -1,15 +1,15 @@
# flake8: noqa: F403,F405
from common import * # isort:skip
-from trezor import wire
-from trezor.enums import EthereumDataType as EDT
-from trezor.messages import EthereumFieldType as EFT
-from trezor.messages import EthereumStructMember as ESM
-from trezor.messages import EthereumTypedDataStructAck as ETDSA
-from trezor.messages import EthereumTypedDataValueAck
-from trezor.wire import context
-
if not utils.BITCOIN_ONLY:
+ from trezor import wire
+ from trezor.enums import EthereumDataType as EDT
+ from trezor.messages import EthereumFieldType as EFT
+ from trezor.messages import EthereumStructMember as ESM
+ from trezor.messages import EthereumTypedDataStructAck as ETDSA
+ from trezor.messages import EthereumTypedDataValueAck
+ from trezor.wire import context
+
from apps.ethereum.helpers import decode_typed_data, get_type_name
from apps.ethereum.sign_typed_data import (
TypedDataEnvelope,
@@ -19,251 +19,242 @@ if not utils.BITCOIN_ONLY:
validate_field_type,
)
-
-class MockContext:
- """Simulating the client sending us data values."""
-
- def __init__(self, message_contents: list):
- # TODO: it could be worth (for better readability and quicker modification)
- # to accept a whole EIP712 JSON object and create the list internally
- self.message_contents = message_contents
- self.next_response = b""
-
- async def write(self, request) -> None:
- entry = self.message_contents
- for index in request.member_path:
- entry = entry[index]
-
- if isinstance(entry, list):
- self.next_response = len(entry).to_bytes(2, "big")
+ class MockContext:
+ """Simulating the client sending us data values."""
+
+ def __init__(self, message_contents: list):
+ # TODO: it could be worth (for better readability and quicker modification)
+ # to accept a whole EIP712 JSON object and create the list internally
+ self.message_contents = message_contents
+ self.next_response = b""
+
+ async def write(self, request) -> None:
+ entry = self.message_contents
+ for index in request.member_path:
+ entry = entry[index]
+
+ if isinstance(entry, list):
+ self.next_response = len(entry).to_bytes(2, "big")
+ else:
+ self.next_response = entry
+
+ async def read(self, _resp_types, _resp_type):
+ return EthereumTypedDataValueAck(value=self.next_response)
+
+ async def call(
+ self,
+ msg: protobuf.MessageType,
+ expected_type: type[LoadedMessageType],
+ ) -> LoadedMessageType:
+ assert expected_type.MESSAGE_WIRE_TYPE is not None
+
+ await self.write(msg)
+ del msg
+ return await self.read((expected_type.MESSAGE_WIRE_TYPE,), expected_type)
+
+ # Helper functions from trezorctl to build expected type data structures
+ # TODO: it could be better to group these functions into a class, to visibly differentiate it
+ def get_type_definitions(types: dict) -> dict:
+ result = {}
+ for struct, fields in types.items():
+ members = []
+ for name, type in fields:
+ field_type = get_field_type(type, types)
+ struct_member = ESM(
+ type=field_type,
+ name=name,
+ )
+ members.append(struct_member)
+
+ result[struct] = ETDSA(members=members)
+
+ return result
+
+ def get_field_type(type_name: str, types: dict) -> EFT:
+ data_type = None
+ size = None
+ entry_type = None
+ struct_name = None
+
+ if is_array(type_name):
+ data_type = EDT.ARRAY
+ size = parse_array_n(type_name)
+ member_typename = typeof_array(type_name)
+ entry_type = get_field_type(member_typename, types)
+ elif type_name.startswith("uint"):
+ data_type = EDT.UINT
+ size = get_byte_size_for_int_type(type_name)
+ elif type_name.startswith("int"):
+ data_type = EDT.INT
+ size = get_byte_size_for_int_type(type_name)
+ elif type_name.startswith("bytes"):
+ data_type = EDT.BYTES
+ size = None if type_name == "bytes" else parse_type_n(type_name)
+ elif type_name == "string":
+ data_type = EDT.STRING
+ elif type_name == "bool":
+ data_type = EDT.BOOL
+ elif type_name == "address":
+ data_type = EDT.ADDRESS
+ elif type_name in types:
+ data_type = EDT.STRUCT
+ size = len(types[type_name])
+ struct_name = type_name
else:
- self.next_response = entry
-
- async def read(self, _resp_types, _resp_type):
- return EthereumTypedDataValueAck(value=self.next_response)
-
- async def call(
- self,
- msg: protobuf.MessageType,
- expected_type: type[LoadedMessageType],
- ) -> LoadedMessageType:
- assert expected_type.MESSAGE_WIRE_TYPE is not None
-
- await self.write(msg)
- del msg
- return await self.read((expected_type.MESSAGE_WIRE_TYPE,), expected_type)
-
-
-# Helper functions from trezorctl to build expected type data structures
-# TODO: it could be better to group these functions into a class, to visibly differentiate it
-def get_type_definitions(types: dict) -> dict:
- result = {}
- for struct, fields in types.items():
- members = []
- for name, type in fields:
- field_type = get_field_type(type, types)
- struct_member = ESM(
- type=field_type,
- name=name,
- )
- members.append(struct_member)
-
- result[struct] = ETDSA(members=members)
-
- return result
-
-
-def get_field_type(type_name: str, types: dict) -> EFT:
- data_type = None
- size = None
- entry_type = None
- struct_name = None
-
- if is_array(type_name):
- data_type = EDT.ARRAY
- size = parse_array_n(type_name)
- member_typename = typeof_array(type_name)
- entry_type = get_field_type(member_typename, types)
- elif type_name.startswith("uint"):
- data_type = EDT.UINT
- size = get_byte_size_for_int_type(type_name)
- elif type_name.startswith("int"):
- data_type = EDT.INT
- size = get_byte_size_for_int_type(type_name)
- elif type_name.startswith("bytes"):
- data_type = EDT.BYTES
- size = None if type_name == "bytes" else parse_type_n(type_name)
- elif type_name == "string":
- data_type = EDT.STRING
- elif type_name == "bool":
- data_type = EDT.BOOL
- elif type_name == "address":
- data_type = EDT.ADDRESS
- elif type_name in types:
- data_type = EDT.STRUCT
- size = len(types[type_name])
- struct_name = type_name
- else:
- raise ValueError(f"Unsupported type name: {type_name}")
-
- return EFT(
- data_type=data_type,
- size=size,
- entry_type=entry_type,
- struct_name=struct_name,
- )
-
-
-def is_array(type_name: str) -> bool:
- return type_name[-1] == "]"
+ raise ValueError(f"Unsupported type name: {type_name}")
+ return EFT(
+ data_type=data_type,
+ size=size,
+ entry_type=entry_type,
+ struct_name=struct_name,
+ )
-def typeof_array(type_name: str) -> str:
- return type_name[: type_name.rindex("[")]
-
-
-def parse_type_n(type_name: str) -> int:
- """Parse N from type<N>.
-
- Example: "uint256" -> 256
- """
- # STRANGE: "ImportError: no module named 're'" in Micropython?
- buf = ""
- for char in reversed(type_name):
- if char.isdigit():
- buf += char
- else:
- return int("".join(reversed(buf)))
- raise ValueError(f"Invalid type name: {type_name}")
-
-
-def parse_array_n(type_name: str) -> int | None:
- """Parse N in type[<N>] where "type" can itself be an array type."""
- if type_name.endswith("[]"):
- return None
-
- start_idx = type_name.rindex("[") + 1
- return int(type_name[start_idx:-1])
-
-
-def get_byte_size_for_int_type(int_type: str) -> int:
- return parse_type_n(int_type) // 8
-
-
-types_basic = {
- "EIP712Domain": [
- ("name", "string"),
- ("version", "string"),
- ("chainId", "uint256"),
- ("verifyingContract", "address"),
- ],
- "Person": [
- ("name", "string"),
- ("wallet", "address"),
- ],
- "Mail": [
- ("from", "Person"),
- ("to", "Person"),
- ("contents", "string"),
- ],
-}
-TYPES_BASIC = get_type_definitions(types_basic)
-
-types_complex = {
- "EIP712Domain": [
- ("name", "string"),
- ("version", "string"),
- ("chainId", "uint256"),
- ("verifyingContract", "address"),
- ("salt", "bytes32"),
- ],
- "Person": [
- ("name", "string"),
- ("wallet", "address"),
- ("married", "bool"),
- ("kids", "uint8"),
- ("karma", "int16"),
- ("secret", "bytes"),
- ("small_secret", "bytes16"),
- ("pets", "string[]"),
- ("two_best_friends", "string[2]"),
- ],
- "Mail": [
- ("from", "Person"),
- ("to", "Person"),
- ("messages", "string[]"),
- ],
-}
-TYPES_COMPLEX = get_type_definitions(types_complex)
-
-DOMAIN_VALUES = [
- [
- b"Ether Mail",
- b"1",
- # 1
- b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01",
- # 0x1e0Ae8205e9726E6F296ab8869160A6423E2337E
- b"\x1e\n\xe8 ^\x97&\xe6\xf2\x96\xab\x88i\x16\nd#\xe23~",
- ]
-]
-MESSAGE_VALUES_BASIC = [
- [
- [
- b"Cow",
- b"\xc0\x00Kb\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4\xa4\xe5K\x15\xad",
+ def is_array(type_name: str) -> bool:
+ return type_name[-1] == "]"
+
+ def typeof_array(type_name: str) -> str:
+ return type_name[: type_name.rindex("[")]
+
+ def parse_type_n(type_name: str) -> int:
+ """Parse N from type<N>.
+
+ Example: "uint256" -> 256
+ """
+ # STRANGE: "ImportError: no module named 're'" in Micropython?
+ buf = ""
+ for char in reversed(type_name):
+ if char.isdigit():
+ buf += char
+ else:
+ return int("".join(reversed(buf)))
+ raise ValueError(f"Invalid type name: {type_name}")
+
+ def parse_array_n(type_name: str) -> int | None:
+ """Parse N in type[<N>] where "type" can itself be an array type."""
+ if type_name.endswith("[]"):
+ return None
+
+ start_idx = type_name.rindex("[") + 1
+ return int(type_name[start_idx:-1])
+
+ def get_byte_size_for_int_type(int_type: str) -> int:
+ return parse_type_n(int_type) // 8
+
+ types_basic = {
+ "EIP712Domain": [
+ ("name", "string"),
+ ("version", "string"),
+ ("chainId", "uint256"),
+ ("verifyingContract", "address"),
],
- [
- b"Bob",
- b"T\xb0\xfaf\xa0et\x8c@\xdc\xa2\xc7\xfe\x12Z (\xcf\x99\x82",
+ "Person": [
+ ("name", "string"),
+ ("wallet", "address"),
+ ],
+ "Mail": [
+ ("from", "Person"),
+ ("to", "Person"),
+ ("contents", "string"),
+ ],
+ }
+ TYPES_BASIC = get_type_definitions(types_basic)
+
+ types_complex = {
+ "EIP712Domain": [
+ ("name", "string"),
+ ("version", "string"),
+ ("chainId", "uint256"),
+ ("verifyingContract", "address"),
+ ("salt", "bytes32"),
],
- b"Hello, Bob!",
+ "Person": [
+ ("name", "string"),
+ ("wallet", "address"),
+ ("married", "bool"),
+ ("kids", "uint8"),
+ ("karma", "int16"),
+ ("secret", "bytes"),
+ ("small_secret", "bytes16"),
+ ("pets", "string[]"),
+ ("two_best_friends", "string[2]"),
+ ],
+ "Mail": [
+ ("from", "Person"),
+ ("to", "Person"),
+ ("messages", "string[]"),
+ ],
+ }
+ TYPES_COMPLEX = get_type_definitions(types_complex)
+
+ DOMAIN_VALUES = [
+ [
+ b"Ether Mail",
+ b"1",
+ # 1
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01",
+ # 0x1e0Ae8205e9726E6F296ab8869160A6423E2337E
+ b"\x1e\n\xe8 ^\x97&\xe6\xf2\x96\xab\x88i\x16\nd#\xe23~",
+ ]
]
-]
-MESSAGE_VALUES_COMPLEX = [
- [
+ MESSAGE_VALUES_BASIC = [
[
- b"Amy",
- b"\xc0\x00Kb\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4\xa4\xe5K\x15\xad",
- b"\x01",
- b"\x02",
- b"\x00\x04",
- b"b\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4b\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4b\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4b\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4",
- b"\\\xcf\x0eT6q\x04yZG\xbc\x04\x81d]\x9e",
[
- b"parrot",
+ b"Cow",
+ b"\xc0\x00Kb\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4\xa4\xe5K\x15\xad",
],
[
- b"Carl",
- b"Denis",
+ b"Bob",
+ b"T\xb0\xfaf\xa0et\x8c@\xdc\xa2\xc7\xfe\x12Z (\xcf\x99\x82",
],
- ],
+ b"Hello, Bob!",
+ ]
+ ]
+ MESSAGE_VALUES_COMPLEX = [
[
- b"Bob",
- b"T\xb0\xfaf\xa0et\x8c@\xdc\xa2\xc7\xfe\x12Z (\xcf\x99\x82",
- b"\x00",
- b"\x00",
- b"\xff\xfc",
- b"\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9",
- b"\xa5\xe5\xc4{dwZ\xbcGm)b@2X\xde",
[
- b"dog",
- b"cat",
+ b"Amy",
+ b"\xc0\x00Kb\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4\xa4\xe5K\x15\xad",
+ b"\x01",
+ b"\x02",
+ b"\x00\x04",
+ b"b\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4b\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4b\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4b\xc5\xa3\x9ar\x8eJ\xf5\xbe\xe0\xc6\xb4",
+ b"\\\xcf\x0eT6q\x04yZG\xbc\x04\x81d]\x9e",
+ [
+ b"parrot",
+ ],
+ [
+ b"Carl",
+ b"Denis",
+ ],
],
[
- b"Emil",
- b"Franz",
+ b"Bob",
+ b"T\xb0\xfaf\xa0et\x8c@\xdc\xa2\xc7\xfe\x12Z (\xcf\x99\x82",
+ b"\x00",
+ b"\x00",
+ b"\xff\xfc",
+ b"\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9\x7f\xe1%\xa2\x02\x8c\xf9",
+ b"\xa5\xe5\xc4{dwZ\xbcGm)b@2X\xde",
+ [
+ b"dog",
+ b"cat",
+ ],
+ [
+ b"Emil",
+ b"Franz",
+ ],
],
- ],
- [b"Hello, Bob!", b"How are you?", b"Hope you're fine"],
+ [b"Hello, Bob!", b"How are you?", b"Hope you're fine"],
+ ]
]
-]
-
-# Object for testing functionality not needing context
-# (Each test needs to assign EMPTY_ENVELOPE.types as needed)
-EMPTY_ENVELOPE = TypedDataEnvelope(
- primary_type="test",
- metamask_v4_compat=True,
-)
+
+ # Object for testing functionality not needing context
+ # (Each test needs to assign EMPTY_ENVELOPE.types as needed)
+ EMPTY_ENVELOPE = TypedDataEnvelope(
+ primary_type="test",
+ metamask_v4_compat=True,
+ )
# TODO: validate it more by some third party app, like signing data by Metamask
# ??? How to approach the testing ???
diff --git a/core/tests/test_apps.solana.predefined_transaction.py b/core/tests/test_apps.solana.predefined_transaction.py
index b8ef8143..d0ada56f 100644
--- a/core/tests/test_apps.solana.predefined_transaction.py
+++ b/core/tests/test_apps.solana.predefined_transaction.py
@@ -2,10 +2,11 @@
# do not edit manually!
from common import Any, unittest, utils # isort:skip
-from trezor.crypto import base58
+if not utils.BITCOIN_ONLY:
+ from trezor.crypto import base58
-from apps.solana.predefined_transaction import is_predefined_token_transfer
-from apps.solana.transaction.instruction import Instruction
+ from apps.solana.predefined_transaction import is_predefined_token_transfer
+ from apps.solana.transaction.instruction import Instruction
SYSTEM_PROGRAM_ID = "11111111111111111111111111111111"
STAKE_PROGRAM_ID = "Stake11111111111111111111111111111111111111"
diff --git a/core/tests/test_apps.solana.predefined_transaction.py.mako b/core/tests/test_apps.solana.predefined_transaction.py.mako
index c9dac28f..16f1543c 100644
--- a/core/tests/test_apps.solana.predefined_transaction.py.mako
+++ b/core/tests/test_apps.solana.predefined_transaction.py.mako
@@ -4,10 +4,11 @@
<%def name="getInstructionIdText(program, instruction)">${"_".join([getProgramId(program)] + ["INS"] + instruction["name"].upper().split(" "))}</%def>\
from common import Any, unittest, utils # isort:skip
-from trezor.crypto import base58
+if not utils.BITCOIN_ONLY:
+ from trezor.crypto import base58
-from apps.solana.predefined_transaction import is_predefined_token_transfer
-from apps.solana.transaction.instruction import Instruction
+ from apps.solana.predefined_transaction import is_predefined_token_transfer
+ from apps.solana.transaction.instruction import Instruction
% for program in programs["programs"]:
${getProgramId(program)} = "${program["id"]}"
diff --git a/core/tests/test_apps.zcash.unified_addresses.py b/core/tests/test_apps.zcash.unified_addresses.py
index b7d2aba2..98f5110e 100644
--- a/core/tests/test_apps.zcash.unified_addresses.py
+++ b/core/tests/test_apps.zcash.unified_addresses.py
@@ -1,13 +1,15 @@
# flake8: noqa: F403,F405
from common import * # isort:skip
-from apps.common import coininfo
-from apps.zcash import unified_addresses
+if not utils.BITCOIN_ONLY:
+ from apps.common import coininfo
+ from apps.zcash import unified_addresses
-P2PKH = unified_addresses.Typecode.P2PKH
-P2SH = unified_addresses.Typecode.P2SH
-SAPLING = unified_addresses.Typecode.SAPLING
-ORCHARD = unified_addresses.Typecode.ORCHARD
+ P2PKH = unified_addresses.Typecode.P2PKH
+ P2SH = unified_addresses.Typecode.P2SH
+ SAPLING = unified_addresses.Typecode.SAPLING
+ ORCHARD = unified_addresses.Typecode.ORCHARD
+ COIN = coininfo.by_name("Zcash")
TESTVECTORS = [
[
@@ -284,9 +286,6 @@ def get_receivers(tv: ZcashTestVector):
return receivers
-COIN = coininfo.by_name("Zcash")
-
-
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestZcashAddress(unittest.TestCase):
def test_encode_unified(self):
diff --git a/core/tests/test_trezor.protobuf.py b/core/tests/test_trezor.protobuf.py
index 0d04e3ed..91cd23dd 100644
--- a/core/tests/test_trezor.protobuf.py
+++ b/core/tests/test_trezor.protobuf.py
@@ -1,66 +1,63 @@
# flake8: noqa: F403,F405
from common import * # isort:skip
-from trezor import protobuf
-from trezor.messages import (
- DebugLinkMemoryRead,
- Failure,
- SignMessage,
- WebAuthnCredential,
-)
-
-
-def load_uvarint32(data: bytes) -> int:
- # use known uint32 field in an all-optional message
- buffer = bytearray(len(data) + 1)
- buffer[1:] = data
- buffer[0] = (1 << 3) | 0 # field number 1, wire type 0
- msg = protobuf.decode(buffer, WebAuthnCredential, False)
- return msg.index
-
-
-def load_uvarint64(data: bytes) -> int:
- # use known uint64 field in an all-optional message
- buffer = bytearray(len(data) + 1)
- buffer[1:] = data
- buffer[0] = (2 << 3) | 0 # field number 1, wire type 0
- msg = protobuf.decode(buffer, DebugLinkMemoryRead, False)
- return msg.length
-
-
-def dump_uvarint32(value: int) -> bytearray:
- # use known uint32 field in an all-optional message
- msg = WebAuthnCredential(index=value)
- length = protobuf.encoded_length(msg)
- buffer = bytearray(length)
- protobuf.encode(buffer, msg)
- assert buffer[0] == (1 << 3) | 0 # field number 1, wire type 0
- return buffer[1:]
-
-
-def dump_uvarint64(value: int) -> bytearray:
- # use known uint64 field in an all-optional message
- msg = DebugLinkMemoryRead(length=value)
- length = protobuf.encoded_length(msg)
- buffer = bytearray(length)
- protobuf.encode(buffer, msg)
- assert buffer[0] == (2 << 3) | 0 # field number 2, wire type 0
- return buffer[1:]
-
-
-def dump_message(msg: protobuf.MessageType) -> bytearray:
- length = protobuf.encoded_length(msg)
- buffer = bytearray(length)
- protobuf.encode(buffer, msg)
- return buffer
-
-
-def load_message(
- msg_type: Type[protobuf.MessageType], buffer: bytes
-) -> protobuf.MessageType:
- return protobuf.decode(buffer, msg_type, False)
-
-
+if not utils.BITCOIN_ONLY:
+
+ from trezor import protobuf
+ from trezor.messages import (
+ ApplySettings,
+ Failure,
+ MoneroTransactionDestinationEntry,
+ SignMessage,
+ )
+
+ def load_uvarint32(data: bytes) -> int:
+ # use known uint32 field in an all-optional message
+ buffer = bytearray(len(data) + 1)
+ buffer[1:] = data
+ buffer[0] = (6 << 3) | 0 # field number 6, wire type 0
+ msg = protobuf.decode(buffer, ApplySettings, False)
+ return msg.auto_lock_delay_ms
+
+ def load_uvarint64(data: bytes) -> int:
+ # use known uint64 field in an all-optional message
+ buffer = bytearray(len(data) + 1)
+ buffer[1:] = data
+ buffer[0] = (1 << 3) | 0 # field number 1, wire type 0
+ msg = protobuf.decode(buffer, MoneroTransactionDestinationEntry, False)
+ return msg.amount
+
+ def dump_uvarint32(value: int) -> bytearray:
+ # use known uint32 field in an all-optional message
+ msg = ApplySettings(auto_lock_delay_ms=value)
+ length = protobuf.encoded_length(msg)
+ buffer = bytearray(length)
+ protobuf.encode(buffer, msg)
+ assert buffer[0] == (6 << 3) | 0 # field number 6, wire type 0
+ return buffer[1:]
+
+ def dump_uvarint64(value: int) -> bytearray:
+ # use known uint64 field in an all-optional message
+ msg = MoneroTransactionDestinationEntry(amount=value)
+ length = protobuf.encoded_length(msg)
+ buffer = bytearray(length)
+ protobuf.encode(buffer, msg)
+ assert buffer[0] == (1 << 3) | 0 # field number 1, wire type 0
+ return buffer[1:]
+
+ def dump_message(msg: protobuf.MessageType) -> bytearray:
+ length = protobuf.encoded_length(msg)
+ buffer = bytearray(length)
+ protobuf.encode(buffer, msg)
+ return buffer
+
+ def load_message(
+ msg_type: Type[protobuf.MessageType], buffer: bytes
+ ) -> protobuf.MessageType:
+ return protobuf.decode(buffer, msg_type, False)
+
+
+@unittest.skipUnless(not utils.BITCOIN_ONLY, "incompatible with BTC-only FW")
class TestProtobuf(unittest.TestCase):
def test_dump_uvarint(self):
for dump_uvarint in (dump_uvarint32, dump_uvarint64):
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.