apps.webauthn.boot() does not need an if-condition because it's only
called from session.py when the usb interface is enabled
This means that they do not need to be stored in RAM at all. The obvious
drawback is that we need to hand-edit the if/elif sequence, but we don't
register new handlers all that often so 🤷
pull/1610/head
parent
391976bcda
commit
e629a72c3a
@ -1,13 +0,0 @@
|
||||
from trezor import wire
|
||||
from trezor.messages import MessageType
|
||||
|
||||
|
||||
def boot() -> None:
|
||||
wire.add(MessageType.AuthorizeCoinJoin, __name__, "authorize_coinjoin")
|
||||
wire.add(MessageType.GetPublicKey, __name__, "get_public_key")
|
||||
wire.add(MessageType.GetAddress, __name__, "get_address")
|
||||
wire.add(MessageType.GetOwnershipId, __name__, "get_ownership_id")
|
||||
wire.add(MessageType.GetOwnershipProof, __name__, "get_ownership_proof")
|
||||
wire.add(MessageType.SignTx, __name__, "sign_tx")
|
||||
wire.add(MessageType.SignMessage, __name__, "sign_message")
|
||||
wire.add(MessageType.VerifyMessage, __name__, "verify_message")
|
@ -1,10 +0,0 @@
|
||||
from trezor import wire
|
||||
from trezor.messages import MessageType
|
||||
|
||||
CURVE = "ed25519"
|
||||
|
||||
|
||||
def boot() -> None:
|
||||
wire.add(MessageType.CardanoGetAddress, __name__, "get_address")
|
||||
wire.add(MessageType.CardanoGetPublicKey, __name__, "get_public_key")
|
||||
wire.add(MessageType.CardanoSignTx, __name__, "sign_tx")
|
@ -1,16 +0,0 @@
|
||||
from trezor import wire
|
||||
from trezor.messages import MessageType
|
||||
|
||||
|
||||
def boot() -> None:
|
||||
wire.add(MessageType.ResetDevice, __name__, "reset_device")
|
||||
wire.add(MessageType.BackupDevice, __name__, "backup_device")
|
||||
wire.add(MessageType.WipeDevice, __name__, "wipe_device")
|
||||
wire.add(MessageType.RecoveryDevice, __name__, "recovery_device")
|
||||
wire.add(MessageType.ApplySettings, __name__, "apply_settings")
|
||||
wire.add(MessageType.ApplyFlags, __name__, "apply_flags")
|
||||
wire.add(MessageType.ChangePin, __name__, "change_pin")
|
||||
wire.add(MessageType.SetU2FCounter, __name__, "set_u2f_counter")
|
||||
wire.add(MessageType.GetNextU2FCounter, __name__, "get_next_u2f_counter")
|
||||
wire.add(MessageType.SdProtect, __name__, "sd_protect")
|
||||
wire.add(MessageType.ChangeWipeCode, __name__, "change_wipe_code")
|
@ -1,9 +0,0 @@
|
||||
from trezor import wire
|
||||
from trezor.messages import MessageType
|
||||
|
||||
|
||||
def boot() -> None:
|
||||
wire.add(MessageType.GetEntropy, __name__, "get_entropy")
|
||||
wire.add(MessageType.SignIdentity, __name__, "sign_identity")
|
||||
wire.add(MessageType.GetECDHSessionKey, __name__, "get_ecdh_session_key")
|
||||
wire.add(MessageType.CipherKeyValue, __name__, "cipher_key_value")
|
@ -1,24 +1,9 @@
|
||||
from trezor import loop, wire
|
||||
from trezor.messages import MessageType
|
||||
from trezor import loop
|
||||
|
||||
import usb
|
||||
|
||||
from .fido2 import handle_reports
|
||||
|
||||
|
||||
def boot() -> None:
|
||||
wire.add(
|
||||
MessageType.WebAuthnListResidentCredentials,
|
||||
__name__,
|
||||
"list_resident_credentials",
|
||||
)
|
||||
wire.add(
|
||||
MessageType.WebAuthnAddResidentCredential, __name__, "add_resident_credential"
|
||||
)
|
||||
wire.add(
|
||||
MessageType.WebAuthnRemoveResidentCredential,
|
||||
__name__,
|
||||
"remove_resident_credential",
|
||||
)
|
||||
import usb
|
||||
|
||||
if usb.ENABLE_IFACE_WEBAUTHN:
|
||||
loop.schedule(handle_reports(usb.iface_webauthn))
|
||||
loop.schedule(handle_reports(usb.iface_webauthn))
|
||||
|
@ -0,0 +1,200 @@
|
||||
from trezor import utils
|
||||
from trezor.messages import MessageType
|
||||
|
||||
if False:
|
||||
from trezor.wire import Handler
|
||||
from trezorio import WireInterface
|
||||
|
||||
|
||||
workflow_handlers: dict[int, Handler] = {}
|
||||
|
||||
|
||||
def register(wire_type: int, handler: Handler) -> None:
|
||||
"""Register `handler` to get scheduled after `wire_type` message is received."""
|
||||
workflow_handlers[wire_type] = handler
|
||||
|
||||
|
||||
def find_message_handler_module(msg_type: int) -> str:
|
||||
"""Statically find the appropriate workflow handler.
|
||||
|
||||
For now, new messages must be registered by hand in the if-elif manner below.
|
||||
The reason for this is memory fragmentation optimization:
|
||||
- using a dict would mean that the whole thing stays in RAM, whereas an if-elif
|
||||
sequence is run from flash
|
||||
- collecting everything as strings instead of importing directly means that we don't
|
||||
need to load any of the modules into memory until we actually need them
|
||||
"""
|
||||
if False:
|
||||
raise RuntimeError
|
||||
|
||||
# debug
|
||||
elif __debug__ and msg_type == MessageType.LoadDevice:
|
||||
return "apps.debug.load_device"
|
||||
|
||||
# management
|
||||
elif msg_type == MessageType.ResetDevice:
|
||||
return "apps.management.reset_device"
|
||||
elif msg_type == MessageType.BackupDevice:
|
||||
return "apps.management.backup_device"
|
||||
elif msg_type == MessageType.WipeDevice:
|
||||
return "apps.management.wipe_device"
|
||||
elif msg_type == MessageType.RecoveryDevice:
|
||||
return "apps.management.recovery_device"
|
||||
elif msg_type == MessageType.ApplySettings:
|
||||
return "apps.management.apply_settings"
|
||||
elif msg_type == MessageType.ApplyFlags:
|
||||
return "apps.management.apply_flags"
|
||||
elif msg_type == MessageType.ChangePin:
|
||||
return "apps.management.change_pin"
|
||||
elif msg_type == MessageType.SetU2FCounter:
|
||||
return "apps.management.set_u2f_counter"
|
||||
elif msg_type == MessageType.GetNextU2FCounter:
|
||||
return "apps.management.get_next_u2f_counter"
|
||||
elif msg_type == MessageType.SdProtect:
|
||||
return "apps.management.sd_protect"
|
||||
elif msg_type == MessageType.ChangeWipeCode:
|
||||
return "apps.management.change_wipe_code"
|
||||
|
||||
# bitcoin
|
||||
elif msg_type == MessageType.AuthorizeCoinJoin:
|
||||
return "apps.bitcoin.authorize_coinjoin"
|
||||
elif msg_type == MessageType.GetPublicKey:
|
||||
return "apps.bitcoin.get_public_key"
|
||||
elif msg_type == MessageType.GetAddress:
|
||||
return "apps.bitcoin.get_address"
|
||||
elif msg_type == MessageType.GetOwnershipId:
|
||||
return "apps.bitcoin.get_ownership_id"
|
||||
elif msg_type == MessageType.GetOwnershipProof:
|
||||
return "apps.bitcoin.get_ownership_proof"
|
||||
elif msg_type == MessageType.SignTx:
|
||||
return "apps.bitcoin.sign_tx"
|
||||
elif msg_type == MessageType.SignMessage:
|
||||
return "apps.bitcoin.sign_message"
|
||||
elif msg_type == MessageType.VerifyMessage:
|
||||
return "apps.bitcoin.verify_message"
|
||||
|
||||
# misc
|
||||
elif msg_type == MessageType.GetEntropy:
|
||||
return "apps.misc.get_entropy"
|
||||
elif msg_type == MessageType.SignIdentity:
|
||||
return "apps.misc.sign_identity"
|
||||
elif msg_type == MessageType.GetECDHSessionKey:
|
||||
return "apps.misc.get_ecdh_session_key"
|
||||
elif msg_type == MessageType.CipherKeyValue:
|
||||
return "apps.misc.cipher_key_value"
|
||||
|
||||
elif not utils.BITCOIN_ONLY:
|
||||
if False:
|
||||
raise RuntimeError
|
||||
|
||||
# webauthn
|
||||
elif msg_type == MessageType.WebAuthnListResidentCredentials:
|
||||
return "apps.webauthn.list_resident_credentials"
|
||||
elif msg_type == MessageType.WebAuthnAddResidentCredential:
|
||||
return "apps.webauthn.add_resident_credential"
|
||||
elif msg_type == MessageType.WebAuthnRemoveResidentCredential:
|
||||
return "apps.webauthn.remove_resident_credential"
|
||||
|
||||
# ethereum
|
||||
elif msg_type == MessageType.EthereumGetAddress:
|
||||
return "apps.ethereum.get_address"
|
||||
elif msg_type == MessageType.EthereumGetPublicKey:
|
||||
return "apps.ethereum.get_public_key"
|
||||
elif msg_type == MessageType.EthereumSignTx:
|
||||
return "apps.ethereum.sign_tx"
|
||||
elif msg_type == MessageType.EthereumSignMessage:
|
||||
return "apps.ethereum.sign_message"
|
||||
elif msg_type == MessageType.EthereumVerifyMessage:
|
||||
return "apps.ethereum.verify_message"
|
||||
|
||||
# lisk
|
||||
elif msg_type == MessageType.LiskGetPublicKey:
|
||||
return "apps.lisk.get_public_key"
|
||||
elif msg_type == MessageType.LiskGetAddress:
|
||||
return "apps.lisk.get_address"
|
||||
elif msg_type == MessageType.LiskSignTx:
|
||||
return "apps.lisk.sign_tx"
|
||||
elif msg_type == MessageType.LiskSignMessage:
|
||||
return "apps.lisk.sign_message"
|
||||
elif msg_type == MessageType.LiskVerifyMessage:
|
||||
return "apps.lisk.verify_message"
|
||||
|
||||
# monero
|
||||
elif msg_type == MessageType.MoneroGetAddress:
|
||||
return "apps.monero.get_address"
|
||||
elif msg_type == MessageType.MoneroGetWatchKey:
|
||||
return "apps.monero.get_watch_only"
|
||||
elif msg_type == MessageType.MoneroTransactionInitRequest:
|
||||
return "apps.monero.sign_tx"
|
||||
elif msg_type == MessageType.MoneroKeyImageExportInitRequest:
|
||||
return "apps.monero.key_image_sync"
|
||||
elif msg_type == MessageType.MoneroGetTxKeyRequest:
|
||||
return "apps.monero.get_tx_keys"
|
||||
elif msg_type == MessageType.MoneroLiveRefreshStartRequest:
|
||||
return "apps.monero.live_refresh"
|
||||
if __debug__ and msg_type == MessageType.DebugMoneroDiagRequest:
|
||||
return "apps.monero.diag"
|
||||
|
||||
# nem
|
||||
elif msg_type == MessageType.NEMGetAddress:
|
||||
return "apps.nem.get_address"
|
||||
elif msg_type == MessageType.NEMSignTx:
|
||||
return "apps.nem.sign_tx"
|
||||
|
||||
# stellar
|
||||
elif msg_type == MessageType.StellarGetAddress:
|
||||
return "apps.stellar.get_address"
|
||||
elif msg_type == MessageType.StellarSignTx:
|
||||
return "apps.stellar.sign_tx"
|
||||
|
||||
# ripple
|
||||
elif msg_type == MessageType.RippleGetAddress:
|
||||
return "apps.ripple.get_address"
|
||||
elif msg_type == MessageType.RippleSignTx:
|
||||
return "apps.ripple.sign_tx"
|
||||
|
||||
# cardano
|
||||
elif msg_type == MessageType.CardanoGetAddress:
|
||||
return "apps.cardano.get_address"
|
||||
elif msg_type == MessageType.CardanoGetPublicKey:
|
||||
return "apps.cardano.get_public_key"
|
||||
elif msg_type == MessageType.CardanoSignTx:
|
||||
return "apps.cardano.sign_tx"
|
||||
|
||||
# tezos
|
||||
elif msg_type == MessageType.TezosGetAddress:
|
||||
return "apps.tezos.get_address"
|
||||
elif msg_type == MessageType.TezosSignTx:
|
||||
return "apps.tezos.sign_tx"
|
||||
elif msg_type == MessageType.TezosGetPublicKey:
|
||||
return "apps.tezos.get_public_key"
|
||||
|
||||
# eos
|
||||
elif msg_type == MessageType.EosGetPublicKey:
|
||||
return "apps.eos.get_public_key"
|
||||
elif msg_type == MessageType.EosSignTx:
|
||||
return "apps.eos.sign_tx"
|
||||
|
||||
# binance
|
||||
elif msg_type == MessageType.BinanceGetAddress:
|
||||
return "apps.binance.get_address"
|
||||
elif msg_type == MessageType.BinanceGetPublicKey:
|
||||
return "apps.binance.get_public_key"
|
||||
elif msg_type == MessageType.BinanceSignTx:
|
||||
return "apps.binance.sign_tx"
|
||||
|
||||
raise ValueError
|
||||
|
||||
|
||||
def find_registered_handler(iface: WireInterface, msg_type: int) -> Handler | None:
|
||||
if msg_type in workflow_handlers:
|
||||
# Message has a handler available, return it directly.
|
||||
return workflow_handlers[msg_type]
|
||||
|
||||
try:
|
||||
modname = find_message_handler_module(msg_type)
|
||||
handler_name = modname[modname.rfind(".") + 1 :]
|
||||
module = __import__(modname, None, None, (handler_name,), 0)
|
||||
return getattr(module, handler_name) # type: ignore
|
||||
except ValueError:
|
||||
return None
|
Loading…
Reference in new issue