mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-22 05:10:56 +00:00
chore(core): use more const to decrease space
This commit is contained in:
parent
49765830de
commit
52558c7b96
@ -1,3 +1,4 @@
|
||||
from micropython import const
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from trezor import utils, wire
|
||||
@ -28,8 +29,8 @@ if TYPE_CHECKING:
|
||||
|
||||
|
||||
_VERSION_MAGIC = b"SL\x00\x19"
|
||||
_FLAG_USER_CONFIRMED = 0x01
|
||||
_OWNERSHIP_ID_LEN = 32
|
||||
_FLAG_USER_CONFIRMED = const(0x01)
|
||||
_OWNERSHIP_ID_LEN = const(32)
|
||||
_OWNERSHIP_ID_KEY_PATH = [b"SLIP-0019", b"Ownership identification key"]
|
||||
|
||||
|
||||
|
@ -53,7 +53,7 @@ _TXSIZE_DECRED_SCRIPT_VERSION = const(2)
|
||||
_TXSIZE_DECRED_EXPIRY = const(4)
|
||||
|
||||
# Decred witness size (without script): 8 byte amount, 4 byte block height, 4 byte block index
|
||||
_TXSIZE_DECRED_WITNESS = 16
|
||||
_TXSIZE_DECRED_WITNESS = const(16)
|
||||
|
||||
|
||||
class DecredTxWeightCalculator(TxWeightCalculator):
|
||||
|
@ -1,3 +1,4 @@
|
||||
from micropython import const
|
||||
from typing import Any
|
||||
|
||||
from trezor import messages, wire
|
||||
@ -37,8 +38,8 @@ ADDRESS_TYPES_PAYMENT_SCRIPT = (
|
||||
CardanoAddressType.ENTERPRISE_SCRIPT,
|
||||
)
|
||||
|
||||
MIN_ADDRESS_BYTES_LENGTH = 29
|
||||
MAX_ADDRESS_BYTES_LENGTH = 65
|
||||
_MIN_ADDRESS_BYTES_LENGTH = const(29)
|
||||
_MAX_ADDRESS_BYTES_LENGTH = const(65)
|
||||
|
||||
|
||||
def assert_params_cond(condition: bool) -> None:
|
||||
@ -282,7 +283,7 @@ def _validate_shelley_address(
|
||||
|
||||
def _validate_size(address_bytes: bytes) -> None:
|
||||
assert_cond(
|
||||
MIN_ADDRESS_BYTES_LENGTH <= len(address_bytes) <= MAX_ADDRESS_BYTES_LENGTH
|
||||
_MIN_ADDRESS_BYTES_LENGTH <= len(address_bytes) <= _MAX_ADDRESS_BYTES_LENGTH
|
||||
)
|
||||
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
from micropython import const
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from trezor import messages, wire
|
||||
@ -27,15 +28,15 @@ if TYPE_CHECKING:
|
||||
|
||||
from . import seed
|
||||
|
||||
AUXILIARY_DATA_HASH_SIZE = 32
|
||||
GOVERNANCE_VOTING_PUBLIC_KEY_LENGTH = 32
|
||||
GOVERNANCE_REGISTRATION_HASH_SIZE = 32
|
||||
_AUXILIARY_DATA_HASH_SIZE = const(32)
|
||||
_GOVERNANCE_VOTING_PUBLIC_KEY_LENGTH = const(32)
|
||||
_GOVERNANCE_REGISTRATION_HASH_SIZE = const(32)
|
||||
|
||||
METADATA_KEY_GOVERNANCE_REGISTRATION = 61284
|
||||
METADATA_KEY_GOVERNANCE_REGISTRATION_SIGNATURE = 61285
|
||||
_METADATA_KEY_GOVERNANCE_REGISTRATION = const(61284)
|
||||
_METADATA_KEY_GOVERNANCE_REGISTRATION_SIGNATURE = const(61285)
|
||||
|
||||
MAX_DELEGATION_COUNT = 32
|
||||
DEFAULT_VOTING_PURPOSE = 0
|
||||
_MAX_DELEGATION_COUNT = const(32)
|
||||
_DEFAULT_VOTING_PURPOSE = const(0)
|
||||
|
||||
|
||||
def assert_cond(condition: bool) -> None:
|
||||
@ -57,7 +58,7 @@ def validate(auxiliary_data: messages.CardanoTxAuxiliaryData) -> None:
|
||||
|
||||
|
||||
def _validate_hash(auxiliary_data_hash: bytes) -> None:
|
||||
assert_cond(len(auxiliary_data_hash) == AUXILIARY_DATA_HASH_SIZE)
|
||||
assert_cond(len(auxiliary_data_hash) == _AUXILIARY_DATA_HASH_SIZE)
|
||||
|
||||
|
||||
def _validate_governance_registration_parameters(
|
||||
@ -84,13 +85,13 @@ def _validate_governance_registration_parameters(
|
||||
|
||||
|
||||
def _validate_voting_public_key(key: bytes) -> None:
|
||||
assert_cond(len(key) == GOVERNANCE_VOTING_PUBLIC_KEY_LENGTH)
|
||||
assert_cond(len(key) == _GOVERNANCE_VOTING_PUBLIC_KEY_LENGTH)
|
||||
|
||||
|
||||
def _validate_delegations(
|
||||
delegations: list[messages.CardanoGovernanceDelegation],
|
||||
) -> None:
|
||||
assert_cond(len(delegations) <= MAX_DELEGATION_COUNT)
|
||||
assert_cond(len(delegations) <= _MAX_DELEGATION_COUNT)
|
||||
for delegation in delegations:
|
||||
_validate_voting_public_key(delegation.voting_public_key)
|
||||
|
||||
@ -101,7 +102,7 @@ def _get_voting_purpose_to_serialize(
|
||||
if parameters.format == CardanoGovernanceRegistrationFormat.CIP15:
|
||||
return None
|
||||
if parameters.voting_purpose is None:
|
||||
return DEFAULT_VOTING_PURPOSE
|
||||
return _DEFAULT_VOTING_PURPOSE
|
||||
return parameters.voting_purpose
|
||||
|
||||
|
||||
@ -218,8 +219,8 @@ def _cborize_governance_registration(
|
||||
governance_registration_signature = {1: governance_registration_payload_signature}
|
||||
|
||||
return {
|
||||
METADATA_KEY_GOVERNANCE_REGISTRATION: governance_registration_payload,
|
||||
METADATA_KEY_GOVERNANCE_REGISTRATION_SIGNATURE: governance_registration_signature,
|
||||
_METADATA_KEY_GOVERNANCE_REGISTRATION: governance_registration_payload,
|
||||
_METADATA_KEY_GOVERNANCE_REGISTRATION_SIGNATURE: governance_registration_signature,
|
||||
}
|
||||
|
||||
|
||||
@ -277,12 +278,12 @@ def _create_governance_registration_payload_signature(
|
||||
node = keychain.derive(path)
|
||||
|
||||
encoded_governance_registration = cbor.encode(
|
||||
{METADATA_KEY_GOVERNANCE_REGISTRATION: governance_registration_payload}
|
||||
{_METADATA_KEY_GOVERNANCE_REGISTRATION: governance_registration_payload}
|
||||
)
|
||||
|
||||
governance_registration_hash = hashlib.blake2b(
|
||||
data=encoded_governance_registration,
|
||||
outlen=GOVERNANCE_REGISTRATION_HASH_SIZE,
|
||||
outlen=_GOVERNANCE_REGISTRATION_HASH_SIZE,
|
||||
).digest()
|
||||
|
||||
return ed25519.sign_ext(
|
||||
@ -304,5 +305,5 @@ def _wrap_metadata(metadata: dict) -> tuple[dict, tuple]:
|
||||
|
||||
def _get_hash(auxiliary_data: bytes) -> bytes:
|
||||
return hashlib.blake2b(
|
||||
data=auxiliary_data, outlen=AUXILIARY_DATA_HASH_SIZE
|
||||
data=auxiliary_data, outlen=_AUXILIARY_DATA_HASH_SIZE
|
||||
).digest()
|
||||
|
@ -1,3 +1,4 @@
|
||||
from micropython import const
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from trezor import log, wire
|
||||
@ -11,7 +12,7 @@ from .helpers.utils import derive_public_key
|
||||
if TYPE_CHECKING:
|
||||
from . import seed
|
||||
|
||||
PROTOCOL_MAGIC_KEY = 2
|
||||
_PROTOCOL_MAGIC_KEY = const(2)
|
||||
|
||||
|
||||
"""
|
||||
@ -44,7 +45,7 @@ def get_address_attributes(protocol_magic: int) -> dict:
|
||||
if protocol_magics.is_mainnet(protocol_magic):
|
||||
address_attributes = {}
|
||||
else:
|
||||
address_attributes = {PROTOCOL_MAGIC_KEY: cbor.encode(protocol_magic)}
|
||||
address_attributes = {_PROTOCOL_MAGIC_KEY: cbor.encode(protocol_magic)}
|
||||
|
||||
return address_attributes
|
||||
|
||||
@ -91,13 +92,13 @@ def _validate_protocol_magic(address_data_encoded: bytes, protocol_magic: int) -
|
||||
|
||||
attributes = address_data[1]
|
||||
if protocol_magics.is_mainnet(protocol_magic):
|
||||
if PROTOCOL_MAGIC_KEY in attributes:
|
||||
if _PROTOCOL_MAGIC_KEY in attributes:
|
||||
raise wire.ProcessError("Output address network mismatch")
|
||||
else: # testnet
|
||||
if len(attributes) == 0 or PROTOCOL_MAGIC_KEY not in attributes:
|
||||
if len(attributes) == 0 or _PROTOCOL_MAGIC_KEY not in attributes:
|
||||
raise wire.ProcessError("Output address network mismatch")
|
||||
|
||||
protocol_magic_cbor = attributes[PROTOCOL_MAGIC_KEY]
|
||||
protocol_magic_cbor = attributes[_PROTOCOL_MAGIC_KEY]
|
||||
address_protocol_magic = cbor.decode(protocol_magic_cbor)
|
||||
|
||||
if not isinstance(address_protocol_magic, int):
|
||||
|
@ -1,3 +1,4 @@
|
||||
from micropython import const
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from trezor import wire
|
||||
@ -19,14 +20,14 @@ if TYPE_CHECKING:
|
||||
from . import seed
|
||||
from .helpers.account_path_check import AccountPathChecker
|
||||
|
||||
POOL_HASH_SIZE = 28
|
||||
VRF_KEY_HASH_SIZE = 32
|
||||
POOL_METADATA_HASH_SIZE = 32
|
||||
IPV4_ADDRESS_SIZE = 4
|
||||
IPV6_ADDRESS_SIZE = 16
|
||||
_POOL_HASH_SIZE = const(28)
|
||||
_VRF_KEY_HASH_SIZE = const(32)
|
||||
_POOL_METADATA_HASH_SIZE = const(32)
|
||||
_IPV4_ADDRESS_SIZE = const(4)
|
||||
_IPV6_ADDRESS_SIZE = const(16)
|
||||
|
||||
MAX_URL_LENGTH = 64
|
||||
MAX_PORT_NUMBER = 65535
|
||||
_MAX_URL_LENGTH = const(64)
|
||||
_MAX_PORT_NUMBER = const(65535)
|
||||
|
||||
|
||||
def validate(
|
||||
@ -50,7 +51,7 @@ def validate(
|
||||
)
|
||||
|
||||
if certificate.type == CardanoCertificateType.STAKE_DELEGATION:
|
||||
if not certificate.pool or len(certificate.pool) != POOL_HASH_SIZE:
|
||||
if not certificate.pool or len(certificate.pool) != _POOL_HASH_SIZE:
|
||||
raise wire.ProcessError("Invalid certificate")
|
||||
|
||||
if certificate.type == CardanoCertificateType.STAKE_POOL_REGISTRATION:
|
||||
@ -169,8 +170,8 @@ def _validate_pool_parameters(
|
||||
protocol_magic: int,
|
||||
network_id: int,
|
||||
) -> None:
|
||||
assert_cond(len(pool_parameters.pool_id) == POOL_HASH_SIZE)
|
||||
assert_cond(len(pool_parameters.vrf_key_hash) == VRF_KEY_HASH_SIZE)
|
||||
assert_cond(len(pool_parameters.pool_id) == _POOL_HASH_SIZE)
|
||||
assert_cond(len(pool_parameters.vrf_key_hash) == _VRF_KEY_HASH_SIZE)
|
||||
assert_cond(0 <= pool_parameters.pledge <= LOVELACE_MAX_SUPPLY)
|
||||
assert_cond(0 <= pool_parameters.cost <= LOVELACE_MAX_SUPPLY)
|
||||
assert_cond(pool_parameters.margin_numerator >= 0)
|
||||
@ -206,32 +207,32 @@ def validate_pool_relay(pool_relay: messages.CardanoPoolRelayParameters) -> None
|
||||
pool_relay.ipv4_address is not None or pool_relay.ipv6_address is not None
|
||||
)
|
||||
if pool_relay.ipv4_address is not None:
|
||||
assert_cond(len(pool_relay.ipv4_address) == IPV4_ADDRESS_SIZE)
|
||||
assert_cond(len(pool_relay.ipv4_address) == _IPV4_ADDRESS_SIZE)
|
||||
if pool_relay.ipv6_address is not None:
|
||||
assert_cond(len(pool_relay.ipv6_address) == IPV6_ADDRESS_SIZE)
|
||||
assert_cond(len(pool_relay.ipv6_address) == _IPV6_ADDRESS_SIZE)
|
||||
assert_cond(
|
||||
pool_relay.port is not None and 0 <= pool_relay.port <= MAX_PORT_NUMBER
|
||||
pool_relay.port is not None and 0 <= pool_relay.port <= _MAX_PORT_NUMBER
|
||||
)
|
||||
elif pool_relay.type == CardanoPoolRelayType.SINGLE_HOST_NAME:
|
||||
assert_cond(
|
||||
pool_relay.host_name is not None
|
||||
and len(pool_relay.host_name) <= MAX_URL_LENGTH
|
||||
and len(pool_relay.host_name) <= _MAX_URL_LENGTH
|
||||
)
|
||||
assert_cond(
|
||||
pool_relay.port is not None and 0 <= pool_relay.port <= MAX_PORT_NUMBER
|
||||
pool_relay.port is not None and 0 <= pool_relay.port <= _MAX_PORT_NUMBER
|
||||
)
|
||||
elif pool_relay.type == CardanoPoolRelayType.MULTIPLE_HOST_NAME:
|
||||
assert_cond(
|
||||
pool_relay.host_name is not None
|
||||
and len(pool_relay.host_name) <= MAX_URL_LENGTH
|
||||
and len(pool_relay.host_name) <= _MAX_URL_LENGTH
|
||||
)
|
||||
else:
|
||||
raise RuntimeError # should be unreachable
|
||||
|
||||
|
||||
def _validate_pool_metadata(pool_metadata: messages.CardanoPoolMetadataType) -> None:
|
||||
assert_cond(len(pool_metadata.url) <= MAX_URL_LENGTH)
|
||||
assert_cond(len(pool_metadata.hash) == POOL_METADATA_HASH_SIZE)
|
||||
assert_cond(len(pool_metadata.url) <= _MAX_URL_LENGTH)
|
||||
assert_cond(len(pool_metadata.hash) == _POOL_METADATA_HASH_SIZE)
|
||||
assert_cond(all((32 <= ord(c) < 127) for c in pool_metadata.url))
|
||||
|
||||
|
||||
@ -251,7 +252,7 @@ def _cborize_ipv6_address(ipv6_address: bytes | None) -> bytes | None:
|
||||
return None
|
||||
|
||||
# ipv6 addresses are serialized to CBOR as uint_32[4] little endian
|
||||
assert len(ipv6_address) == IPV6_ADDRESS_SIZE
|
||||
assert len(ipv6_address) == _IPV6_ADDRESS_SIZE
|
||||
|
||||
result = b""
|
||||
for i in range(0, 4):
|
||||
|
@ -1,6 +1,8 @@
|
||||
LOVELACE_MAX_SUPPLY = 45_000_000_000 * 1_000_000
|
||||
INPUT_PREV_HASH_SIZE = 32
|
||||
ADDRESS_KEY_HASH_SIZE = 28
|
||||
SCRIPT_HASH_SIZE = 28
|
||||
OUTPUT_DATUM_HASH_SIZE = 32
|
||||
SCRIPT_DATA_HASH_SIZE = 32
|
||||
from micropython import const
|
||||
|
||||
LOVELACE_MAX_SUPPLY = const(45_000_000_000 * 1_000_000)
|
||||
INPUT_PREV_HASH_SIZE = const(32)
|
||||
ADDRESS_KEY_HASH_SIZE = const(28)
|
||||
SCRIPT_HASH_SIZE = const(28)
|
||||
OUTPUT_DATUM_HASH_SIZE = const(32)
|
||||
SCRIPT_DATA_HASH_SIZE = const(32)
|
||||
|
@ -1,5 +1,7 @@
|
||||
MAINNET = 1
|
||||
TESTNET = 0
|
||||
from micropython import const
|
||||
|
||||
MAINNET = const(1)
|
||||
TESTNET = const(0)
|
||||
|
||||
|
||||
def is_mainnet(network_id: int) -> bool:
|
||||
|
@ -1,8 +1,10 @@
|
||||
from micropython import const
|
||||
|
||||
# https://book.world.dev.cardano.org/environments.html
|
||||
MAINNET = 764824073
|
||||
TESTNET_PREPROD = 1
|
||||
TESTNET_PREVIEW = 2
|
||||
TESTNET_LEGACY = 1097911063
|
||||
MAINNET = const(764824073)
|
||||
TESTNET_PREPROD = const(1)
|
||||
TESTNET_PREVIEW = const(2)
|
||||
TESTNET_LEGACY = const(1097911063)
|
||||
|
||||
NAMES = {
|
||||
MAINNET: "Mainnet",
|
||||
|
@ -1,3 +1,4 @@
|
||||
from micropython import const
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from trezor import wire
|
||||
@ -23,7 +24,7 @@ if TYPE_CHECKING:
|
||||
|
||||
from apps.common.keychain import Keychain
|
||||
|
||||
TX_TYPE = 2
|
||||
_TX_TYPE = const(2)
|
||||
|
||||
|
||||
def access_list_item_length(item: EthereumAccessList) -> int:
|
||||
@ -86,7 +87,7 @@ async def sign_tx_eip1559(
|
||||
|
||||
sha = HashWriter(sha3_256(keccak=True))
|
||||
|
||||
rlp.write(sha, TX_TYPE)
|
||||
rlp.write(sha, _TX_TYPE)
|
||||
|
||||
rlp.write_header(sha, total_length, rlp.LIST_HEADER_BYTE)
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
from micropython import const
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from trezor import wire
|
||||
@ -34,7 +35,7 @@ if TYPE_CHECKING:
|
||||
|
||||
|
||||
# Maximum data size we support
|
||||
MAX_VALUE_BYTE_SIZE = 1024
|
||||
_MAX_VALUE_BYTE_SIZE = const(1024)
|
||||
|
||||
|
||||
@with_keychain_from_path(*PATTERNS_ADDRESS)
|
||||
@ -423,8 +424,8 @@ def validate_value(field: EthereumFieldType, value: bytes) -> None:
|
||||
if len(value) != field.size:
|
||||
raise wire.DataError("Invalid length")
|
||||
else:
|
||||
if len(value) > MAX_VALUE_BYTE_SIZE:
|
||||
raise wire.DataError(f"Invalid length, bigger than {MAX_VALUE_BYTE_SIZE}")
|
||||
if len(value) > _MAX_VALUE_BYTE_SIZE:
|
||||
raise wire.DataError(f"Invalid length, bigger than {_MAX_VALUE_BYTE_SIZE}")
|
||||
|
||||
# Specific tests for some data types
|
||||
if field.data_type == EthereumDataType.BOOL:
|
||||
|
@ -1,3 +1,4 @@
|
||||
from micropython import const
|
||||
from typing import Sequence
|
||||
|
||||
from trezor import ui, utils, wire
|
||||
@ -18,7 +19,7 @@ from trezor.ui.layouts.reset import ( # noqa: F401
|
||||
if __debug__:
|
||||
from apps import debug
|
||||
|
||||
NUM_OF_CHOICES = 3
|
||||
_NUM_OF_CHOICES = const(3)
|
||||
|
||||
|
||||
async def show_internal_entropy(ctx: wire.GenericContext, entropy: bytes) -> None:
|
||||
@ -45,8 +46,8 @@ async def _confirm_word(
|
||||
non_duplicates = list(set(share_words))
|
||||
# shuffle list
|
||||
random.shuffle(non_duplicates)
|
||||
# take top NUM_OF_CHOICES words
|
||||
choices = non_duplicates[:NUM_OF_CHOICES]
|
||||
# take top _NUM_OF_CHOICES words
|
||||
choices = non_duplicates[:_NUM_OF_CHOICES]
|
||||
# select first of them
|
||||
checked_word = choices[0]
|
||||
# find its index
|
||||
|
@ -14,6 +14,7 @@ encrypted using the private spend key. Here the host sends it back
|
||||
in `MoneroGetTxKeyRequest.tx_enc_keys` to be decrypted and yet again encrypted
|
||||
using the view key, which the host possess.
|
||||
"""
|
||||
from micropython import const
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from trezor import utils, wire
|
||||
@ -24,7 +25,7 @@ from apps.common.keychain import auto_keychain
|
||||
from apps.monero import layout, misc
|
||||
from apps.monero.xmr import chacha_poly, crypto, crypto_helpers
|
||||
|
||||
_GET_TX_KEY_REASON_TX_DERIVATION = 1
|
||||
_GET_TX_KEY_REASON_TX_DERIVATION = const(1)
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from apps.common.keychain import Keychain
|
||||
|
@ -19,7 +19,7 @@ MAX_FEE = const(1_000_000) # equals 1 XRP
|
||||
# the value in docs is in XRP, we declare it here in drops
|
||||
MAX_ALLOWED_AMOUNT = const(100_000_000_000_000_000)
|
||||
|
||||
FLAG_FULLY_CANONICAL = 0x8000_0000
|
||||
FLAG_FULLY_CANONICAL = const(0x8000_0000)
|
||||
|
||||
|
||||
def address_from_public_key(pubkey: bytes) -> str:
|
||||
|
@ -8,6 +8,7 @@
|
||||
# the actual data follow. This currently only supports the Payment
|
||||
# transaction type and the fields that are required for it.
|
||||
|
||||
from micropython import const
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from trezor.messages import RippleSignTx
|
||||
@ -24,24 +25,24 @@ class RippleField:
|
||||
self.key: int = key
|
||||
|
||||
|
||||
FIELD_TYPE_INT16 = 1
|
||||
FIELD_TYPE_INT32 = 2
|
||||
FIELD_TYPE_AMOUNT = 6
|
||||
FIELD_TYPE_VL = 7
|
||||
FIELD_TYPE_ACCOUNT = 8
|
||||
_FIELD_TYPE_INT16 = const(1)
|
||||
_FIELD_TYPE_INT32 = const(2)
|
||||
_FIELD_TYPE_AMOUNT = const(6)
|
||||
_FIELD_TYPE_VL = const(7)
|
||||
_FIELD_TYPE_ACCOUNT = const(8)
|
||||
|
||||
FIELDS_MAP: dict[str, RippleField] = {
|
||||
"account": RippleField(type=FIELD_TYPE_ACCOUNT, key=1),
|
||||
"amount": RippleField(type=FIELD_TYPE_AMOUNT, key=1),
|
||||
"destination": RippleField(type=FIELD_TYPE_ACCOUNT, key=3),
|
||||
"fee": RippleField(type=FIELD_TYPE_AMOUNT, key=8),
|
||||
"sequence": RippleField(type=FIELD_TYPE_INT32, key=4),
|
||||
"type": RippleField(type=FIELD_TYPE_INT16, key=2),
|
||||
"signingPubKey": RippleField(type=FIELD_TYPE_VL, key=3),
|
||||
"flags": RippleField(type=FIELD_TYPE_INT32, key=2),
|
||||
"txnSignature": RippleField(type=FIELD_TYPE_VL, key=4),
|
||||
"lastLedgerSequence": RippleField(type=FIELD_TYPE_INT32, key=27),
|
||||
"destinationTag": RippleField(type=FIELD_TYPE_INT32, key=14),
|
||||
"account": RippleField(type=_FIELD_TYPE_ACCOUNT, key=1),
|
||||
"amount": RippleField(type=_FIELD_TYPE_AMOUNT, key=1),
|
||||
"destination": RippleField(type=_FIELD_TYPE_ACCOUNT, key=3),
|
||||
"fee": RippleField(type=_FIELD_TYPE_AMOUNT, key=8),
|
||||
"sequence": RippleField(type=_FIELD_TYPE_INT32, key=4),
|
||||
"type": RippleField(type=_FIELD_TYPE_INT16, key=2),
|
||||
"signingPubKey": RippleField(type=_FIELD_TYPE_VL, key=3),
|
||||
"flags": RippleField(type=_FIELD_TYPE_INT32, key=2),
|
||||
"txnSignature": RippleField(type=_FIELD_TYPE_VL, key=4),
|
||||
"lastLedgerSequence": RippleField(type=_FIELD_TYPE_INT32, key=27),
|
||||
"destinationTag": RippleField(type=_FIELD_TYPE_INT32, key=14),
|
||||
}
|
||||
|
||||
TRANSACTION_TYPES = {"Payment": 0}
|
||||
@ -73,19 +74,19 @@ def write(w: Writer, field: RippleField, value: int | bytes | str | None) -> Non
|
||||
if value is None:
|
||||
return
|
||||
write_type(w, field)
|
||||
if field.type == FIELD_TYPE_INT16:
|
||||
if field.type == _FIELD_TYPE_INT16:
|
||||
assert isinstance(value, int)
|
||||
w.extend(value.to_bytes(2, "big"))
|
||||
elif field.type == FIELD_TYPE_INT32:
|
||||
elif field.type == _FIELD_TYPE_INT32:
|
||||
assert isinstance(value, int)
|
||||
w.extend(value.to_bytes(4, "big"))
|
||||
elif field.type == FIELD_TYPE_AMOUNT:
|
||||
elif field.type == _FIELD_TYPE_AMOUNT:
|
||||
assert isinstance(value, int)
|
||||
w.extend(serialize_amount(value))
|
||||
elif field.type == FIELD_TYPE_ACCOUNT:
|
||||
elif field.type == _FIELD_TYPE_ACCOUNT:
|
||||
assert isinstance(value, str)
|
||||
write_bytes_varint(w, helpers.decode_address(value))
|
||||
elif field.type == FIELD_TYPE_VL:
|
||||
elif field.type == _FIELD_TYPE_VL:
|
||||
assert isinstance(value, (bytes, bytearray))
|
||||
write_bytes_varint(w, value)
|
||||
else:
|
||||
|
@ -60,7 +60,7 @@ MICHELSON_SEQUENCE_TAG = const(2)
|
||||
BRANCH_HASH_SIZE = const(32)
|
||||
PROPOSAL_HASH_SIZE = const(32)
|
||||
PUBLIC_KEY_HASH_SIZE = const(20)
|
||||
TAGGED_PUBKEY_HASH_SIZE = 1 + PUBLIC_KEY_HASH_SIZE
|
||||
TAGGED_PUBKEY_HASH_SIZE = const(1 + PUBLIC_KEY_HASH_SIZE)
|
||||
CONTRACT_ID_SIZE = const(22)
|
||||
_ED25519_PUBLIC_KEY_SIZE = const(32)
|
||||
_SECP256K1_PUBLIC_KEY_SIZE = const(33)
|
||||
|
@ -1,4 +1,5 @@
|
||||
import gc
|
||||
from micropython import const
|
||||
from trezorcrypto import random # avoid pulling in trezor.crypto
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
@ -10,27 +11,27 @@ if TYPE_CHECKING:
|
||||
T = TypeVar("T")
|
||||
|
||||
|
||||
_MAX_SESSIONS_COUNT = 10
|
||||
_SESSIONLESS_FLAG = 128
|
||||
_SESSION_ID_LENGTH = 32
|
||||
_MAX_SESSIONS_COUNT = const(10)
|
||||
_SESSIONLESS_FLAG = const(128)
|
||||
_SESSION_ID_LENGTH = const(32)
|
||||
|
||||
# Traditional cache keys
|
||||
APP_COMMON_SEED = 0
|
||||
APP_COMMON_AUTHORIZATION_TYPE = 1
|
||||
APP_COMMON_AUTHORIZATION_DATA = 2
|
||||
APP_COMMON_NONCE = 3
|
||||
APP_COMMON_SEED = const(0)
|
||||
APP_COMMON_AUTHORIZATION_TYPE = const(1)
|
||||
APP_COMMON_AUTHORIZATION_DATA = const(2)
|
||||
APP_COMMON_NONCE = const(3)
|
||||
if not utils.BITCOIN_ONLY:
|
||||
APP_COMMON_DERIVE_CARDANO = 4
|
||||
APP_CARDANO_ICARUS_SECRET = 5
|
||||
APP_CARDANO_ICARUS_TREZOR_SECRET = 6
|
||||
APP_MONERO_LIVE_REFRESH = 7
|
||||
APP_COMMON_DERIVE_CARDANO = const(4)
|
||||
APP_CARDANO_ICARUS_SECRET = const(5)
|
||||
APP_CARDANO_ICARUS_TREZOR_SECRET = const(6)
|
||||
APP_MONERO_LIVE_REFRESH = const(7)
|
||||
|
||||
# Keys that are valid across sessions
|
||||
APP_COMMON_SEED_WITHOUT_PASSPHRASE = 0 | _SESSIONLESS_FLAG
|
||||
APP_COMMON_SAFETY_CHECKS_TEMPORARY = 1 | _SESSIONLESS_FLAG
|
||||
STORAGE_DEVICE_EXPERIMENTAL_FEATURES = 2 | _SESSIONLESS_FLAG
|
||||
APP_COMMON_REQUEST_PIN_LAST_UNLOCK = 3 | _SESSIONLESS_FLAG
|
||||
APP_COMMON_BUSY_DEADLINE_MS = 4 | _SESSIONLESS_FLAG
|
||||
APP_COMMON_SEED_WITHOUT_PASSPHRASE = const(0 | _SESSIONLESS_FLAG)
|
||||
APP_COMMON_SAFETY_CHECKS_TEMPORARY = const(1 | _SESSIONLESS_FLAG)
|
||||
STORAGE_DEVICE_EXPERIMENTAL_FEATURES = const(2 | _SESSIONLESS_FLAG)
|
||||
APP_COMMON_REQUEST_PIN_LAST_UNLOCK = const(3 | _SESSIONLESS_FLAG)
|
||||
APP_COMMON_BUSY_DEADLINE_MS = const(4 | _SESSIONLESS_FLAG)
|
||||
|
||||
|
||||
# === Homescreen storage ===
|
||||
|
@ -45,16 +45,16 @@ if TYPE_CHECKING:
|
||||
StorageSafetyCheckLevel = Literal[0, 1]
|
||||
# fmt: on
|
||||
|
||||
HOMESCREEN_MAXSIZE = 16384
|
||||
LABEL_MAXLENGTH = 32
|
||||
HOMESCREEN_MAXSIZE = const(16384)
|
||||
LABEL_MAXLENGTH = const(32)
|
||||
|
||||
if __debug__:
|
||||
AUTOLOCK_DELAY_MINIMUM = 10 * 1000 # 10 seconds
|
||||
else:
|
||||
AUTOLOCK_DELAY_MINIMUM = 60 * 1000 # 1 minute
|
||||
AUTOLOCK_DELAY_DEFAULT = 10 * 60 * 1000 # 10 minutes
|
||||
AUTOLOCK_DELAY_DEFAULT = const(10 * 60 * 1000) # 10 minutes
|
||||
# autolock intervals larger than AUTOLOCK_DELAY_MAXIMUM cause issues in the scheduler
|
||||
AUTOLOCK_DELAY_MAXIMUM = 0x2000_0000 # ~6 days
|
||||
AUTOLOCK_DELAY_MAXIMUM = const(0x2000_0000) # ~6 days
|
||||
|
||||
# Length of SD salt auth tag.
|
||||
# Other SD-salt-related constants are in sd_salt.py
|
||||
|
@ -20,10 +20,9 @@
|
||||
|
||||
"""Reference implementation for Bech32/Bech32m and segwit addresses."""
|
||||
|
||||
from trezorcrypto import bech32
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
bech32_decode = bech32.decode
|
||||
from micropython import const
|
||||
|
||||
|
||||
if TYPE_CHECKING:
|
||||
@ -43,12 +42,12 @@ else:
|
||||
class Encoding(IntEnum):
|
||||
"""Enumeration type to list the various supported encodings."""
|
||||
|
||||
BECH32 = 1
|
||||
BECH32M = 2
|
||||
BECH32 = const(1)
|
||||
BECH32M = const(2)
|
||||
|
||||
|
||||
CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
|
||||
BECH32M_CONST = 0x2BC830A3
|
||||
_BECH32M_CONST = const(0x2BC830A3)
|
||||
|
||||
|
||||
def bech32_polymod(values: list[int]) -> int:
|
||||
@ -71,7 +70,7 @@ def bech32_hrp_expand(hrp: str) -> list[int]:
|
||||
def bech32_create_checksum(hrp: str, data: list[int], spec: Encoding) -> list[int]:
|
||||
"""Compute the checksum values given HRP and data."""
|
||||
values = bech32_hrp_expand(hrp) + data
|
||||
const = BECH32M_CONST if spec == Encoding.BECH32M else 1
|
||||
const = _BECH32M_CONST if spec == Encoding.BECH32M else 1
|
||||
polymod = bech32_polymod(values + [0, 0, 0, 0, 0, 0]) ^ const
|
||||
return [(polymod >> 5 * (5 - i)) & 31 for i in range(6)]
|
||||
|
||||
@ -127,8 +126,10 @@ def convertbits(
|
||||
|
||||
def decode(hrp: str, addr: str) -> OptionalTuple2[int, bytes]:
|
||||
"""Decode a segwit address."""
|
||||
from trezorcrypto import bech32
|
||||
|
||||
try:
|
||||
hrpgot, data, spec = bech32_decode(addr)
|
||||
hrpgot, data, spec = bech32.decode(addr)
|
||||
decoded = bytes(convertbits(data[1:], 5, 8, False))
|
||||
except ValueError:
|
||||
return (None, None)
|
||||
|
@ -20,11 +20,13 @@
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
|
||||
from micropython import const
|
||||
|
||||
from .bech32 import convertbits
|
||||
|
||||
CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
|
||||
ADDRESS_TYPE_P2KH = 0
|
||||
ADDRESS_TYPE_P2SH = 8
|
||||
ADDRESS_TYPE_P2KH = const(0)
|
||||
ADDRESS_TYPE_P2SH = const(8)
|
||||
|
||||
|
||||
def cashaddr_polymod(values: list[int]) -> int:
|
||||
|
@ -35,6 +35,7 @@ reads the message's header. When the message type is known the first handler is
|
||||
|
||||
"""
|
||||
|
||||
from micropython import const
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from storage.cache import InvalidSessionError
|
||||
@ -132,9 +133,9 @@ class DummyContext:
|
||||
|
||||
DUMMY_CONTEXT = DummyContext()
|
||||
|
||||
PROTOBUF_BUFFER_SIZE = 8192
|
||||
_PROTOBUF_BUFFER_SIZE = const(8192)
|
||||
|
||||
WIRE_BUFFER = bytearray(PROTOBUF_BUFFER_SIZE)
|
||||
WIRE_BUFFER = bytearray(_PROTOBUF_BUFFER_SIZE)
|
||||
|
||||
if __debug__:
|
||||
PROTOBUF_BUFFER_SIZE_DEBUG = 1024
|
||||
|
Loading…
Reference in New Issue
Block a user