diff --git a/common/protob/messages-debug.proto b/common/protob/messages-debug.proto index d508311f9..43c75a564 100644 --- a/common/protob/messages-debug.proto +++ b/common/protob/messages-debug.proto @@ -173,7 +173,6 @@ message DebugLinkFlashErase { optional uint32 sector = 1; } - /** * Request: Erase the SD card * @start @@ -185,6 +184,16 @@ message DebugLinkEraseSdCard { // if false, it will be all 0xFF bytes. } +/** + * Request: Insert SD card into device (emulator). + * If serial_number is not supplied, the message is interpreted as a request for ejecting a card. + * @next Success + */ +message DebugLinkInsertSdCard { + optional uint32 serial_number = 1; // mocked serial number of the card (e.g.: 1, 2, 3,...) + optional uint32 capacity_bytes = 2; // capacity of the card in bytes + optional uint32 manuf_ID = 3; // mocked manufacturer ID +} /** * Request: Start or stop tracking layout changes diff --git a/common/protob/messages-management.proto b/common/protob/messages-management.proto index 2394f2efc..27d1840c7 100644 --- a/common/protob/messages-management.proto +++ b/common/protob/messages-management.proto @@ -113,7 +113,7 @@ message Features { Capability_Solana = 18; } optional BackupType backup_type = 31; // type of device backup (BIP-39 / SLIP-39 basic / SLIP-39 advanced) - optional bool sd_card_present = 32; // is SD card present + optional bool sd_card_present = 32; // is SD card inserted in the device optional bool sd_protection = 33; // is SD Protect enabled optional bool wipe_code_protection = 34; // is wipe code protection enabled optional bytes session_id = 35; diff --git a/common/protob/messages.proto b/common/protob/messages.proto index e54e7ed6a..5e9a0736a 100644 --- a/common/protob/messages.proto +++ b/common/protob/messages.proto @@ -184,8 +184,9 @@ enum MessageType { MessageType_DebugLinkReseedRandom = 9002 [(bitcoin_only) = true, (wire_debug_in) = true]; MessageType_DebugLinkRecordScreen = 9003 [(bitcoin_only) = true, (wire_debug_in) = true]; MessageType_DebugLinkEraseSdCard = 9005 [(bitcoin_only) = true, (wire_debug_in) = true]; - MessageType_DebugLinkWatchLayout = 9006 [(bitcoin_only) = true, (wire_debug_in) = true]; - MessageType_DebugLinkResetDebugEvents = 9007 [(bitcoin_only) = true, (wire_debug_in) = true]; + MessageType_DebugLinkInsertSdCard = 9006 [(bitcoin_only) = true, (wire_debug_in) = true]; + MessageType_DebugLinkWatchLayout = 9007 [(bitcoin_only) = true, (wire_debug_in) = true]; + MessageType_DebugLinkResetDebugEvents = 9008 [(bitcoin_only) = true, (wire_debug_in) = true]; // Ethereum MessageType_EthereumGetPublicKey = 450 [(wire_in) = true]; diff --git a/core/SConscript.unix b/core/SConscript.unix index a1dda73a9..b8b2b43c1 100644 --- a/core/SConscript.unix +++ b/core/SConscript.unix @@ -380,6 +380,7 @@ SOURCE_UNIX = [ 'embed/unix/main.c', 'embed/unix/main_main.c', 'embed/unix/profile.c', + 'embed/unix/sdcard_emu_mock.c', 'vendor/micropython/shared/runtime/gchelper_generic.c', 'vendor/micropython/ports/unix/alloc.c', 'vendor/micropython/ports/unix/gccollect.c', diff --git a/core/embed/extmod/modtrezorio/modtrezorio-sdcard_switcher.h b/core/embed/extmod/modtrezorio/modtrezorio-sdcard_switcher.h new file mode 100644 index 000000000..07cd48042 --- /dev/null +++ b/core/embed/extmod/modtrezorio/modtrezorio-sdcard_switcher.h @@ -0,0 +1,111 @@ +/* + * This file is part of the Trezor project, https://trezor.io/ + * + * Copyright (c) SatoshiLabs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "embed/extmod/trezorobj.h" +#include "py/mpconfig.h" +#include "sdcard.h" +#include "sdcard_emu_mock.h" + +/// package: trezorio.sdcard_switcher + +/// def insert( +/// card_sn: int, +/// capacity_bytes: int | None = 122_945_536, +/// manuf_id: int | None = 27, +/// ) -> None: +/// """ +/// Inserts SD card to the emulator. +/// """ +STATIC mp_obj_t mod_trezorio_sdcard_switcher_insert(size_t n_args, + const mp_obj_t *args, + mp_map_t *kw_args) { + STATIC const mp_arg_t allowed_args[] = { + {MP_QSTR_card_sn, MP_ARG_REQUIRED | MP_ARG_INT}, + {MP_QSTR_capacity_bytes, + MP_ARG_OBJ, + {.u_rom_obj = MP_ROM_INT(122945536)}}, + {MP_QSTR_manuf_id, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_INT(27)}}, + }; + + mp_arg_val_t vals[MP_ARRAY_SIZE(allowed_args)] = {0}; + mp_arg_parse_all(n_args, args, kw_args, MP_ARRAY_SIZE(allowed_args), + allowed_args, vals); + + const mp_int_t card_sn = vals[0].u_int; + + // FIXME: default arguments should be somehow accessible by .u_rom_obj, no? + mp_int_t capacity_bytes; + if (vals[1].u_obj == mp_const_none) { + /* capacity_bytes = mp_obj_get_int(vals[1].u_rom_obj); */ + capacity_bytes = 122945536; + } else { + capacity_bytes = mp_obj_get_int(vals[1].u_obj); + } + mp_int_t manuf_id; + if (vals[2].u_obj == mp_const_none) { + /* manuf_id = mp_obj_get_int(vals[2].u_rom_obj); */ + manuf_id = 27; + } else { + manuf_id = mp_obj_get_int(vals[2].u_obj); + } + + CHECK_PARAM_RANGE(card_sn, 1, 16) + CHECK_PARAM_RANGE(capacity_bytes, ONE_MEBIBYTE, + 1024 * ONE_MEBIBYTE) // capacity between 1 MiB and 1 GiB + + printf("mod_trezorio_sdcard_switcher_insert, arg: %ld, %ld, %ld\n", card_sn, + capacity_bytes, manuf_id); + sdcard_mock.inserted = sectrue; + set_sdcard_mock_filename(&sdcard_mock, (int)card_sn); + sdcard_mock.buffer = NULL; + sdcard_mock.serial_number = card_sn; + sdcard_mock.capacity_bytes = capacity_bytes; + sdcard_mock.blocks = capacity_bytes / SDCARD_BLOCK_SIZE; + sdcard_mock.manuf_ID = manuf_id; + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mod_trezorio_sdcard_switcher_insert_obj, 1, + mod_trezorio_sdcard_switcher_insert); + +/// def eject() -> None: +/// """ +/// Ejects SD card from the emulator. +/// """ +STATIC mp_obj_t mod_trezorio_sdcard_switcher_eject() { + sdcard_mock.inserted = secfalse; + sdcard_mock.buffer = NULL; + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_trezorio_sdcard_switcher_eject_obj, + mod_trezorio_sdcard_switcher_eject); + +STATIC const mp_rom_map_elem_t mod_trezorio_sdcard_switcher_globals_table[] = { + {MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_sdcard_switcher)}, + {MP_ROM_QSTR(MP_QSTR_insert), + MP_ROM_PTR(&mod_trezorio_sdcard_switcher_insert_obj)}, + {MP_ROM_QSTR(MP_QSTR_eject), + MP_ROM_PTR(&mod_trezorio_sdcard_switcher_eject_obj)}, +}; +STATIC MP_DEFINE_CONST_DICT(mod_trezorio_sdcard_switcher_globals, + mod_trezorio_sdcard_switcher_globals_table); + +STATIC const mp_obj_module_t mod_trezorio_sdcard_switcher_module = { + .base = {&mp_type_module}, + .globals = (mp_obj_dict_t *)&mod_trezorio_sdcard_switcher_globals, +}; diff --git a/core/embed/extmod/modtrezorio/modtrezorio.c b/core/embed/extmod/modtrezorio/modtrezorio.c index 72fa781f4..983b93931 100644 --- a/core/embed/extmod/modtrezorio/modtrezorio.c +++ b/core/embed/extmod/modtrezorio/modtrezorio.c @@ -54,10 +54,11 @@ bool usb_connected_previously = true; #ifdef USE_SD_CARD #include "modtrezorio-fatfs.h" #include "modtrezorio-sdcard.h" +#include "modtrezorio-sdcard_switcher.h" #endif /// package: trezorio.__init__ -/// from . import fatfs, sdcard +/// from . import fatfs, sdcard, sdcard_switcher /// POLL_READ: int # wait until interface is readable and return read data /// POLL_WRITE: int # wait until interface is writable @@ -87,6 +88,7 @@ STATIC const mp_rom_map_elem_t mp_module_trezorio_globals_table[] = { #ifdef USE_SD_CARD {MP_ROM_QSTR(MP_QSTR_fatfs), MP_ROM_PTR(&mod_trezorio_fatfs_module)}, {MP_ROM_QSTR(MP_QSTR_sdcard), MP_ROM_PTR(&mod_trezorio_sdcard_module)}, + {MP_ROM_QSTR(MP_QSTR_sdcard_switcher), MP_ROM_PTR(&mod_trezorio_sdcard_switcher_module)}, #endif #ifdef USE_TOUCH diff --git a/core/embed/trezorhal/unix/sdcard.c b/core/embed/trezorhal/unix/sdcard.c index 9929bd5ec..b964876e4 100644 --- a/core/embed/trezorhal/unix/sdcard.c +++ b/core/embed/trezorhal/unix/sdcard.c @@ -18,6 +18,7 @@ */ #include +#include #include #include #include @@ -26,27 +27,24 @@ #include #include "common.h" -#include "profile.h" #include "sdcard.h" +#include "sdcard_emu_mock.h" -#ifndef SDCARD_FILE -#define SDCARD_FILE profile_sdcard_path() -#endif - -#define SDCARD_SIZE (64 * 1024 * 1024) +#define SDCARD_FILE sdcard_mock.filename +#define SDCARD_BUFFER sdcard_mock.buffer +#define SDCARD_SIZE sdcard_mock.capacity_bytes #define SDCARD_BLOCKS (SDCARD_SIZE / SDCARD_BLOCK_SIZE) -static uint8_t *sdcard_buffer = NULL; static secbool sdcard_powered = secfalse; static void sdcard_exit(void) { - int r = munmap(sdcard_buffer, SDCARD_SIZE); + int r = munmap(SDCARD_BUFFER, SDCARD_SIZE); ensure(sectrue * (r == 0), "munmap failed"); - sdcard_buffer = NULL; + SDCARD_BUFFER = NULL; } void sdcard_init(void) { - if (sdcard_buffer != NULL) { + if (SDCARD_BUFFER != NULL) { return; } @@ -74,10 +72,10 @@ void sdcard_init(void) { void *map = mmap(0, SDCARD_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); ensure(sectrue * (map != MAP_FAILED), "mmap failed"); - sdcard_buffer = (uint8_t *)map; + SDCARD_BUFFER = (uint8_t *)map; if (should_clear) { - for (int i = 0; i < SDCARD_SIZE; ++i) sdcard_buffer[i] = 0xFF; + for (int i = 0; i < SDCARD_SIZE; ++i) SDCARD_BUFFER[i] = 0xFF; } sdcard_powered = secfalse; @@ -85,9 +83,12 @@ void sdcard_init(void) { atexit(sdcard_exit); } -secbool sdcard_is_present(void) { return sectrue; } +secbool sdcard_is_present(void) { return sdcard_mock.inserted; } secbool sdcard_power_on(void) { + if (sdcard_mock.inserted == secfalse) { + return secfalse; + } sdcard_init(); sdcard_powered = sectrue; return sectrue; @@ -110,7 +111,7 @@ secbool sdcard_read_blocks(uint32_t *dest, uint32_t block_num, if (num_blocks > SDCARD_BLOCKS - block_num) { return secfalse; } - memcpy(dest, sdcard_buffer + block_num * SDCARD_BLOCK_SIZE, + memcpy(dest, SDCARD_BUFFER + block_num * SDCARD_BLOCK_SIZE, num_blocks * SDCARD_BLOCK_SIZE); return sectrue; } @@ -126,12 +127,9 @@ secbool sdcard_write_blocks(const uint32_t *src, uint32_t block_num, if (num_blocks > SDCARD_BLOCKS - block_num) { return secfalse; } - memcpy(sdcard_buffer + block_num * SDCARD_BLOCK_SIZE, src, + memcpy(SDCARD_BUFFER + block_num * SDCARD_BLOCK_SIZE, src, num_blocks * SDCARD_BLOCK_SIZE); return sectrue; } -uint64_t __wur sdcard_get_mid(void) { - // TODO mock - return 0; -} +uint64_t __wur sdcard_get_mid(void) { return (uint64_t)sdcard_mock.manuf_ID; } diff --git a/core/embed/unix/profile.c b/core/embed/unix/profile.c index 6e2e0ac4c..f6ccf5a0f 100644 --- a/core/embed/unix/profile.c +++ b/core/embed/unix/profile.c @@ -61,12 +61,6 @@ const char *profile_flash_path(void) { return _flash_path; } -const char *profile_sdcard_path(void) { - SVAR(_sdcard_path); - FILE_PATH(_sdcard_path, "/trezor.sdcard"); - return _sdcard_path; -} - const char *profile_usb_disconnect_path(void) { SVAR(_disconnect_path); FILE_PATH(_disconnect_path, "/trezor.usb_data_disconnected"); diff --git a/core/embed/unix/profile.h b/core/embed/unix/profile.h index 7df834cc8..44c141c8b 100644 --- a/core/embed/unix/profile.h +++ b/core/embed/unix/profile.h @@ -32,7 +32,6 @@ const char *profile_name(void); const char *profile_dir(void); const char *profile_flash_path(void); -const char *profile_sdcard_path(void); const char *profile_usb_disconnect_path(void); #endif // __TREZOR_PROFILE_H__ diff --git a/core/embed/unix/sdcard_emu_mock.c b/core/embed/unix/sdcard_emu_mock.c new file mode 100644 index 000000000..14b2ab981 --- /dev/null +++ b/core/embed/unix/sdcard_emu_mock.c @@ -0,0 +1,68 @@ +#include "sdcard_emu_mock.h" +#include +#include +#include +#include "profile.h" +#include "sdcard.h" + +// default SD Card filename serves for unit testing logic which requires SD card +// tests with emulator should call debuglink.insert_sdcard(...) +#define SDCARD_FILENAME_DEFAULT PROFILE_DIR_DEFAULT "/trezor.sdcard_def" + +// default SD card data +SDCardMock sdcard_mock = { + .inserted = sectrue, + .filename = SDCARD_FILENAME_DEFAULT, + .buffer = NULL, + .serial_number = 1, + .capacity_bytes = 64 * ONE_MEBIBYTE, + .blocks = (64 * ONE_MEBIBYTE) / SDCARD_BLOCK_SIZE, + .manuf_ID = 1, +}; + +// "not inserted" SD card data +/* SDCardMock sdcard_mock = { */ +/* .inserted = secfalse, */ +/* .filename = NULL, */ +/* .buffer = NULL, */ +/* .serial_number = 0, */ +/* .capacity_bytes = 0, */ +/* .blocks = 0 / SDCARD_BLOCK_SIZE, */ +/* .manuf_ID = 0, */ +/* }; */ + +void set_sdcard_mock_filename(SDCardMock *card, int serial_number) { + if (card == NULL) { + return; + } + + const char *dir_path = profile_dir(); + if (dir_path == NULL) { + return; + } + + // Calculate the length needed for the new full path + // "trezor.sdcardXX" is 15 characters, plus the directory path and null + // terminator + const int full_path_length = + snprintf(NULL, 0, "%s/trezor.sdcard%02d", dir_path, serial_number) + 1; + char *new_filename = (char *)malloc(full_path_length); + + if (new_filename == NULL) { + // memory allocation failure + return; + } + // Construct the full path with leading zero in the filename for numbers less + // than 10 + snprintf(new_filename, full_path_length, "%s/trezor.sdcard%02d", dir_path, + serial_number); + + // free the old filename + if (card->filename != NULL && + strcmp(card->filename, SDCARD_FILENAME_DEFAULT) != 0) { + free(card->filename); + card->filename = NULL; + } + + card->filename = new_filename; +} diff --git a/core/embed/unix/sdcard_emu_mock.h b/core/embed/unix/sdcard_emu_mock.h new file mode 100644 index 000000000..750848f12 --- /dev/null +++ b/core/embed/unix/sdcard_emu_mock.h @@ -0,0 +1,25 @@ +#ifndef __TREZOR_SDCARD_EMULATOR_MOCK_H__ +#define __TREZOR_SDCARD_EMULATOR_MOCK_H__ + +#include +#include "secbool.h" + +#ifndef ONE_MEBIBYTE +#define ONE_MEBIBYTE (1024 * 1024) +#endif + +typedef struct { + secbool inserted; + char *filename; + uint8_t *buffer; + uint32_t serial_number; + uint32_t capacity_bytes; + uint32_t blocks; + uint8_t manuf_ID; +} SDCardMock; + +extern SDCardMock sdcard_mock; + +void set_sdcard_mock_filename(SDCardMock *card, int serial_number); + +#endif // __TREZOR_SDCARD_EMULATOR_MOCK_H__ diff --git a/core/emu.py b/core/emu.py index dd183fe9c..7baa6faeb 100755 --- a/core/emu.py +++ b/core/emu.py @@ -33,7 +33,7 @@ PROFILE_BASE = Path.home() / ".trezoremu" TREZOR_STORAGE_FILES = ( "trezor.flash", - "trezor.sdcard", + *["trezor.sdcard{:02d}".format(i) for i in range(1, 17)], ) diff --git a/core/mocks/generated/trezorio/__init__.pyi b/core/mocks/generated/trezorio/__init__.pyi index e84de507c..d5e6a8882 100644 --- a/core/mocks/generated/trezorio/__init__.pyi +++ b/core/mocks/generated/trezorio/__init__.pyi @@ -190,7 +190,7 @@ class WebUSB: """ Sends message using USB WebUSB (device) or UDP (emulator). """ -from . import fatfs, sdcard +from . import fatfs, sdcard, sdcard_switcher POLL_READ: int # wait until interface is readable and return read data POLL_WRITE: int # wait until interface is writable TOUCH: int # interface id of the touch events diff --git a/core/mocks/generated/trezorio/sdcard_switcher.pyi b/core/mocks/generated/trezorio/sdcard_switcher.pyi new file mode 100644 index 000000000..70de1b289 --- /dev/null +++ b/core/mocks/generated/trezorio/sdcard_switcher.pyi @@ -0,0 +1,19 @@ +from typing import * + + +# extmod/modtrezorio/modtrezorio-sdcard_switcher.h +def insert( + card_sn: int, + capacity_bytes: int | None = 122_945_536, + manuf_id: int | None = 27, +) -> None: + """ + Inserts SD card to the emulator. + """ + + +# extmod/modtrezorio/modtrezorio-sdcard_switcher.h +def eject() -> None: + """ + Ejects SD card from the emulator. + """ diff --git a/core/src/apps/debug/__init__.py b/core/src/apps/debug/__init__.py index e6426045c..8c289acc3 100644 --- a/core/src/apps/debug/__init__.py +++ b/core/src/apps/debug/__init__.py @@ -22,6 +22,7 @@ if __debug__: DebugLinkDecision, DebugLinkEraseSdCard, DebugLinkGetState, + DebugLinkInsertSdCard, DebugLinkRecordScreen, DebugLinkReseedRandom, DebugLinkResetDebugEvents, @@ -255,6 +256,21 @@ if __debug__: sdcard.power_off() return Success() + async def dispatch_DebugLinkInsertSdCard(msg: DebugLinkInsertSdCard) -> Success: + from trezor import io + + sdcard_switcher = io.sdcard_switcher # local_cache_attribute + if msg.serial_number is None: + sdcard_switcher.eject() + else: + sdcard_switcher.insert( + msg.serial_number, + capacity_bytes=msg.capacity_bytes, + manuf_id=msg.manuf_ID, + ) + + return Success() + def boot() -> None: register = workflow_handlers.register # local_cache_attribute @@ -263,6 +279,7 @@ if __debug__: register(MessageType.DebugLinkReseedRandom, dispatch_DebugLinkReseedRandom) register(MessageType.DebugLinkRecordScreen, dispatch_DebugLinkRecordScreen) register(MessageType.DebugLinkEraseSdCard, dispatch_DebugLinkEraseSdCard) + register(MessageType.DebugLinkInsertSdCard, dispatch_DebugLinkInsertSdCard) register(MessageType.DebugLinkWatchLayout, dispatch_DebugLinkWatchLayout) register( MessageType.DebugLinkResetDebugEvents, dispatch_DebugLinkResetDebugEvents diff --git a/core/src/trezor/enums/MessageType.py b/core/src/trezor/enums/MessageType.py index 5c210d0a1..41ae73c3d 100644 --- a/core/src/trezor/enums/MessageType.py +++ b/core/src/trezor/enums/MessageType.py @@ -92,8 +92,9 @@ DebugLinkLayout = 9001 DebugLinkReseedRandom = 9002 DebugLinkRecordScreen = 9003 DebugLinkEraseSdCard = 9005 -DebugLinkWatchLayout = 9006 -DebugLinkResetDebugEvents = 9007 +DebugLinkInsertSdCard = 9006 +DebugLinkWatchLayout = 9007 +DebugLinkResetDebugEvents = 9008 if not utils.BITCOIN_ONLY: SetU2FCounter = 63 GetNextU2FCounter = 80 diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py index 93daa4533..e8136da56 100644 --- a/core/src/trezor/enums/__init__.py +++ b/core/src/trezor/enums/__init__.py @@ -115,8 +115,9 @@ if TYPE_CHECKING: DebugLinkReseedRandom = 9002 DebugLinkRecordScreen = 9003 DebugLinkEraseSdCard = 9005 - DebugLinkWatchLayout = 9006 - DebugLinkResetDebugEvents = 9007 + DebugLinkInsertSdCard = 9006 + DebugLinkWatchLayout = 9007 + DebugLinkResetDebugEvents = 9008 EthereumGetPublicKey = 450 EthereumPublicKey = 451 EthereumGetAddress = 56 diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py index e8aabef61..dc64f83ac 100644 --- a/core/src/trezor/messages.py +++ b/core/src/trezor/messages.py @@ -2923,6 +2923,24 @@ if TYPE_CHECKING: def is_type_of(cls, msg: Any) -> TypeGuard["DebugLinkEraseSdCard"]: return isinstance(msg, cls) + class DebugLinkInsertSdCard(protobuf.MessageType): + serial_number: "int | None" + capacity_bytes: "int | None" + manuf_ID: "int | None" + + def __init__( + self, + *, + serial_number: "int | None" = None, + capacity_bytes: "int | None" = None, + manuf_ID: "int | None" = None, + ) -> None: + pass + + @classmethod + def is_type_of(cls, msg: Any) -> TypeGuard["DebugLinkInsertSdCard"]: + return isinstance(msg, cls) + class DebugLinkWatchLayout(protobuf.MessageType): watch: "bool | None" diff --git a/python/src/trezorlib/_internal/emulator.py b/python/src/trezorlib/_internal/emulator.py index 4f6d56f8e..b4c885182 100644 --- a/python/src/trezorlib/_internal/emulator.py +++ b/python/src/trezorlib/_internal/emulator.py @@ -241,9 +241,10 @@ class CoreEmulator(Emulator): if workdir is not None: self.workdir = Path(workdir).resolve() - self.sdcard = self.profile_dir / "trezor.sdcard" - if sdcard is not None: - self.sdcard.write_bytes(sdcard) + # FIXME does not work with switchable SD cards + # self.sdcard = self.profile_dir / "trezor.sdcard" + # if sdcard is not None: + # self.sdcard.write_bytes(sdcard) if port: self.port = port @@ -274,6 +275,11 @@ class CoreEmulator(Emulator): + self.extra_args ) + def stop(self) -> None: + super().stop() + for i in range(1, 17): + _rm_f(self.profile_dir / "trezor.sdcard{:02d}".format(i)) + class LegacyEmulator(Emulator): STORAGE_FILENAME = "emulator.img" diff --git a/python/src/trezorlib/debuglink.py b/python/src/trezorlib/debuglink.py index 67de27da2..a93ff4e95 100644 --- a/python/src/trezorlib/debuglink.py +++ b/python/src/trezorlib/debuglink.py @@ -370,6 +370,7 @@ class DebugLink: # To be set by TrezorClientDebugLink (is not known during creation time) self.model: Optional[str] = None self.version: Tuple[int, int, int] = (0, 0, 0) + self.is_emulator: bool = False # Where screenshots are being saved self.screenshot_recording_dir: Optional[str] = None @@ -739,6 +740,33 @@ class DebugLink: def erase_sd_card(self, format: bool = True) -> messages.Success: return self._call(messages.DebugLinkEraseSdCard(format=format)) + @expect(messages.Success) + def insert_sd_card( + self, + serial_number: int = 1, + capacity_bytes: Optional[int] = None, + manuf_ID: Optional[int] = None, + ) -> messages.Success: + if not self.model == "T": + raise RuntimeError("SD card not supported by this device.") + if not self.is_emulator: + raise RuntimeError("SD card mocking is only supported on emulator.") + return self._call( + messages.DebugLinkInsertSdCard( + serial_number=serial_number, + capacity_bytes=capacity_bytes, + manuf_ID=manuf_ID, + ) + ) + + @expect(messages.Success) + def eject_sd_card(self) -> messages.Success: + if not self.model == "T": + raise RuntimeError("SD card not supported by this device.") + if not self.is_emulator: + raise RuntimeError("SD card mocking is only supported on emulator.") + return self._call(messages.DebugLinkInsertSdCard(serial_number=None)) + def take_t1_screenshot_if_relevant(self) -> None: """Conditionally take screenshots on T1. @@ -976,6 +1004,7 @@ class TrezorClientDebugLink(TrezorClient): # and know the supported debug capabilities self.debug.model = self.features.model self.debug.version = self.version + self.debug.is_emulator = self.is_emulator() def reset_debug_features(self) -> None: """Prepare the debugging client for a new testcase. @@ -1233,6 +1262,10 @@ class TrezorClientDebugLink(TrezorClient): raise RuntimeError("Unexpected call") + def is_emulator(self) -> bool: + """Check if we are connected to emulator, in contrast to hardware device.""" + return self.features.fw_vendor == "EMULATOR" + @expect(messages.Success, field="message", ret_type=str) def load_device( @@ -1310,7 +1343,7 @@ def record_screen( session_dir.mkdir(parents=True, exist_ok=True) return session_dir - if not _is_emulator(debug_client): + if not debug_client.is_emulator(): raise RuntimeError("Recording is only supported on emulator.") if directory is None: @@ -1329,8 +1362,3 @@ def record_screen( debug_client.debug.start_recording(str(current_session_dir)) if report_func is not None: report_func(f"Recording started into {current_session_dir}.") - - -def _is_emulator(debug_client: "TrezorClientDebugLink") -> bool: - """Check if we are connected to emulator, in contrast to hardware device.""" - return debug_client.features.fw_vendor == "EMULATOR" diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py index 23940e5ff..e8655968a 100644 --- a/python/src/trezorlib/messages.py +++ b/python/src/trezorlib/messages.py @@ -123,8 +123,9 @@ class MessageType(IntEnum): DebugLinkReseedRandom = 9002 DebugLinkRecordScreen = 9003 DebugLinkEraseSdCard = 9005 - DebugLinkWatchLayout = 9006 - DebugLinkResetDebugEvents = 9007 + DebugLinkInsertSdCard = 9006 + DebugLinkWatchLayout = 9007 + DebugLinkResetDebugEvents = 9008 EthereumGetPublicKey = 450 EthereumPublicKey = 451 EthereumGetAddress = 56 @@ -4084,8 +4085,28 @@ class DebugLinkEraseSdCard(protobuf.MessageType): self.format = format -class DebugLinkWatchLayout(protobuf.MessageType): +class DebugLinkInsertSdCard(protobuf.MessageType): MESSAGE_WIRE_TYPE = 9006 + FIELDS = { + 1: protobuf.Field("serial_number", "uint32", repeated=False, required=False, default=None), + 2: protobuf.Field("capacity_bytes", "uint32", repeated=False, required=False, default=None), + 3: protobuf.Field("manuf_ID", "uint32", repeated=False, required=False, default=None), + } + + def __init__( + self, + *, + serial_number: Optional["int"] = None, + capacity_bytes: Optional["int"] = None, + manuf_ID: Optional["int"] = None, + ) -> None: + self.serial_number = serial_number + self.capacity_bytes = capacity_bytes + self.manuf_ID = manuf_ID + + +class DebugLinkWatchLayout(protobuf.MessageType): + MESSAGE_WIRE_TYPE = 9007 FIELDS = { 1: protobuf.Field("watch", "bool", repeated=False, required=False, default=None), } @@ -4099,7 +4120,7 @@ class DebugLinkWatchLayout(protobuf.MessageType): class DebugLinkResetDebugEvents(protobuf.MessageType): - MESSAGE_WIRE_TYPE = 9007 + MESSAGE_WIRE_TYPE = 9008 class EosGetPublicKey(protobuf.MessageType): diff --git a/rust/trezor-client/src/messages/generated.rs b/rust/trezor-client/src/messages/generated.rs index 6fd14de9f..b76cb8150 100644 --- a/rust/trezor-client/src/messages/generated.rs +++ b/rust/trezor-client/src/messages/generated.rs @@ -77,6 +77,7 @@ trezor_message_impl! { DebugLinkReseedRandom => MessageType_DebugLinkReseedRandom, DebugLinkRecordScreen => MessageType_DebugLinkRecordScreen, DebugLinkEraseSdCard => MessageType_DebugLinkEraseSdCard, + DebugLinkInsertSdCard => MessageType_DebugLinkInsertSdCard, DebugLinkWatchLayout => MessageType_DebugLinkWatchLayout, DebugLinkResetDebugEvents => MessageType_DebugLinkResetDebugEvents, } diff --git a/rust/trezor-client/src/protos/generated/messages.rs b/rust/trezor-client/src/protos/generated/messages.rs index 962a88de5..8feb34d24 100644 --- a/rust/trezor-client/src/protos/generated/messages.rs +++ b/rust/trezor-client/src/protos/generated/messages.rs @@ -216,10 +216,12 @@ pub enum MessageType { MessageType_DebugLinkRecordScreen = 9003, // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_DebugLinkEraseSdCard) MessageType_DebugLinkEraseSdCard = 9005, + // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_DebugLinkInsertSdCard) + MessageType_DebugLinkInsertSdCard = 9006, // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_DebugLinkWatchLayout) - MessageType_DebugLinkWatchLayout = 9006, + MessageType_DebugLinkWatchLayout = 9007, // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_DebugLinkResetDebugEvents) - MessageType_DebugLinkResetDebugEvents = 9007, + MessageType_DebugLinkResetDebugEvents = 9008, // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_EthereumGetPublicKey) MessageType_EthereumGetPublicKey = 450, // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_EthereumPublicKey) @@ -613,8 +615,9 @@ impl ::protobuf::Enum for MessageType { 9002 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkReseedRandom), 9003 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkRecordScreen), 9005 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkEraseSdCard), - 9006 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkWatchLayout), - 9007 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkResetDebugEvents), + 9006 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkInsertSdCard), + 9007 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkWatchLayout), + 9008 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkResetDebugEvents), 450 => ::std::option::Option::Some(MessageType::MessageType_EthereumGetPublicKey), 451 => ::std::option::Option::Some(MessageType::MessageType_EthereumPublicKey), 56 => ::std::option::Option::Some(MessageType::MessageType_EthereumGetAddress), @@ -859,6 +862,7 @@ impl ::protobuf::Enum for MessageType { "MessageType_DebugLinkReseedRandom" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkReseedRandom), "MessageType_DebugLinkRecordScreen" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkRecordScreen), "MessageType_DebugLinkEraseSdCard" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkEraseSdCard), + "MessageType_DebugLinkInsertSdCard" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkInsertSdCard), "MessageType_DebugLinkWatchLayout" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkWatchLayout), "MessageType_DebugLinkResetDebugEvents" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkResetDebugEvents), "MessageType_EthereumGetPublicKey" => ::std::option::Option::Some(MessageType::MessageType_EthereumGetPublicKey), @@ -1104,6 +1108,7 @@ impl ::protobuf::Enum for MessageType { MessageType::MessageType_DebugLinkReseedRandom, MessageType::MessageType_DebugLinkRecordScreen, MessageType::MessageType_DebugLinkEraseSdCard, + MessageType::MessageType_DebugLinkInsertSdCard, MessageType::MessageType_DebugLinkWatchLayout, MessageType::MessageType_DebugLinkResetDebugEvents, MessageType::MessageType_EthereumGetPublicKey, @@ -1355,152 +1360,153 @@ impl ::protobuf::EnumFull for MessageType { MessageType::MessageType_DebugLinkReseedRandom => 91, MessageType::MessageType_DebugLinkRecordScreen => 92, MessageType::MessageType_DebugLinkEraseSdCard => 93, - MessageType::MessageType_DebugLinkWatchLayout => 94, - MessageType::MessageType_DebugLinkResetDebugEvents => 95, - MessageType::MessageType_EthereumGetPublicKey => 96, - MessageType::MessageType_EthereumPublicKey => 97, - MessageType::MessageType_EthereumGetAddress => 98, - MessageType::MessageType_EthereumAddress => 99, - MessageType::MessageType_EthereumSignTx => 100, - MessageType::MessageType_EthereumSignTxEIP1559 => 101, - MessageType::MessageType_EthereumTxRequest => 102, - MessageType::MessageType_EthereumTxAck => 103, - MessageType::MessageType_EthereumSignMessage => 104, - MessageType::MessageType_EthereumVerifyMessage => 105, - MessageType::MessageType_EthereumMessageSignature => 106, - MessageType::MessageType_EthereumSignTypedData => 107, - MessageType::MessageType_EthereumTypedDataStructRequest => 108, - MessageType::MessageType_EthereumTypedDataStructAck => 109, - MessageType::MessageType_EthereumTypedDataValueRequest => 110, - MessageType::MessageType_EthereumTypedDataValueAck => 111, - MessageType::MessageType_EthereumTypedDataSignature => 112, - MessageType::MessageType_EthereumSignTypedHash => 113, - MessageType::MessageType_NEMGetAddress => 114, - MessageType::MessageType_NEMAddress => 115, - MessageType::MessageType_NEMSignTx => 116, - MessageType::MessageType_NEMSignedTx => 117, - MessageType::MessageType_NEMDecryptMessage => 118, - MessageType::MessageType_NEMDecryptedMessage => 119, - MessageType::MessageType_TezosGetAddress => 120, - MessageType::MessageType_TezosAddress => 121, - MessageType::MessageType_TezosSignTx => 122, - MessageType::MessageType_TezosSignedTx => 123, - MessageType::MessageType_TezosGetPublicKey => 124, - MessageType::MessageType_TezosPublicKey => 125, - MessageType::MessageType_StellarSignTx => 126, - MessageType::MessageType_StellarTxOpRequest => 127, - MessageType::MessageType_StellarGetAddress => 128, - MessageType::MessageType_StellarAddress => 129, - MessageType::MessageType_StellarCreateAccountOp => 130, - MessageType::MessageType_StellarPaymentOp => 131, - MessageType::MessageType_StellarPathPaymentStrictReceiveOp => 132, - MessageType::MessageType_StellarManageSellOfferOp => 133, - MessageType::MessageType_StellarCreatePassiveSellOfferOp => 134, - MessageType::MessageType_StellarSetOptionsOp => 135, - MessageType::MessageType_StellarChangeTrustOp => 136, - MessageType::MessageType_StellarAllowTrustOp => 137, - MessageType::MessageType_StellarAccountMergeOp => 138, - MessageType::MessageType_StellarManageDataOp => 139, - MessageType::MessageType_StellarBumpSequenceOp => 140, - MessageType::MessageType_StellarManageBuyOfferOp => 141, - MessageType::MessageType_StellarPathPaymentStrictSendOp => 142, - MessageType::MessageType_StellarClaimClaimableBalanceOp => 143, - MessageType::MessageType_StellarSignedTx => 144, - MessageType::MessageType_CardanoGetPublicKey => 145, - MessageType::MessageType_CardanoPublicKey => 146, - MessageType::MessageType_CardanoGetAddress => 147, - MessageType::MessageType_CardanoAddress => 148, - MessageType::MessageType_CardanoTxItemAck => 149, - MessageType::MessageType_CardanoTxAuxiliaryDataSupplement => 150, - MessageType::MessageType_CardanoTxWitnessRequest => 151, - MessageType::MessageType_CardanoTxWitnessResponse => 152, - MessageType::MessageType_CardanoTxHostAck => 153, - MessageType::MessageType_CardanoTxBodyHash => 154, - MessageType::MessageType_CardanoSignTxFinished => 155, - MessageType::MessageType_CardanoSignTxInit => 156, - MessageType::MessageType_CardanoTxInput => 157, - MessageType::MessageType_CardanoTxOutput => 158, - MessageType::MessageType_CardanoAssetGroup => 159, - MessageType::MessageType_CardanoToken => 160, - MessageType::MessageType_CardanoTxCertificate => 161, - MessageType::MessageType_CardanoTxWithdrawal => 162, - MessageType::MessageType_CardanoTxAuxiliaryData => 163, - MessageType::MessageType_CardanoPoolOwner => 164, - MessageType::MessageType_CardanoPoolRelayParameters => 165, - MessageType::MessageType_CardanoGetNativeScriptHash => 166, - MessageType::MessageType_CardanoNativeScriptHash => 167, - MessageType::MessageType_CardanoTxMint => 168, - MessageType::MessageType_CardanoTxCollateralInput => 169, - MessageType::MessageType_CardanoTxRequiredSigner => 170, - MessageType::MessageType_CardanoTxInlineDatumChunk => 171, - MessageType::MessageType_CardanoTxReferenceScriptChunk => 172, - MessageType::MessageType_CardanoTxReferenceInput => 173, - MessageType::MessageType_RippleGetAddress => 174, - MessageType::MessageType_RippleAddress => 175, - MessageType::MessageType_RippleSignTx => 176, - MessageType::MessageType_RippleSignedTx => 177, - MessageType::MessageType_MoneroTransactionInitRequest => 178, - MessageType::MessageType_MoneroTransactionInitAck => 179, - MessageType::MessageType_MoneroTransactionSetInputRequest => 180, - MessageType::MessageType_MoneroTransactionSetInputAck => 181, - MessageType::MessageType_MoneroTransactionInputViniRequest => 182, - MessageType::MessageType_MoneroTransactionInputViniAck => 183, - MessageType::MessageType_MoneroTransactionAllInputsSetRequest => 184, - MessageType::MessageType_MoneroTransactionAllInputsSetAck => 185, - MessageType::MessageType_MoneroTransactionSetOutputRequest => 186, - MessageType::MessageType_MoneroTransactionSetOutputAck => 187, - MessageType::MessageType_MoneroTransactionAllOutSetRequest => 188, - MessageType::MessageType_MoneroTransactionAllOutSetAck => 189, - MessageType::MessageType_MoneroTransactionSignInputRequest => 190, - MessageType::MessageType_MoneroTransactionSignInputAck => 191, - MessageType::MessageType_MoneroTransactionFinalRequest => 192, - MessageType::MessageType_MoneroTransactionFinalAck => 193, - MessageType::MessageType_MoneroKeyImageExportInitRequest => 194, - MessageType::MessageType_MoneroKeyImageExportInitAck => 195, - MessageType::MessageType_MoneroKeyImageSyncStepRequest => 196, - MessageType::MessageType_MoneroKeyImageSyncStepAck => 197, - MessageType::MessageType_MoneroKeyImageSyncFinalRequest => 198, - MessageType::MessageType_MoneroKeyImageSyncFinalAck => 199, - MessageType::MessageType_MoneroGetAddress => 200, - MessageType::MessageType_MoneroAddress => 201, - MessageType::MessageType_MoneroGetWatchKey => 202, - MessageType::MessageType_MoneroWatchKey => 203, - MessageType::MessageType_DebugMoneroDiagRequest => 204, - MessageType::MessageType_DebugMoneroDiagAck => 205, - MessageType::MessageType_MoneroGetTxKeyRequest => 206, - MessageType::MessageType_MoneroGetTxKeyAck => 207, - MessageType::MessageType_MoneroLiveRefreshStartRequest => 208, - MessageType::MessageType_MoneroLiveRefreshStartAck => 209, - MessageType::MessageType_MoneroLiveRefreshStepRequest => 210, - MessageType::MessageType_MoneroLiveRefreshStepAck => 211, - MessageType::MessageType_MoneroLiveRefreshFinalRequest => 212, - MessageType::MessageType_MoneroLiveRefreshFinalAck => 213, - MessageType::MessageType_EosGetPublicKey => 214, - MessageType::MessageType_EosPublicKey => 215, - MessageType::MessageType_EosSignTx => 216, - MessageType::MessageType_EosTxActionRequest => 217, - MessageType::MessageType_EosTxActionAck => 218, - MessageType::MessageType_EosSignedTx => 219, - MessageType::MessageType_BinanceGetAddress => 220, - MessageType::MessageType_BinanceAddress => 221, - MessageType::MessageType_BinanceGetPublicKey => 222, - MessageType::MessageType_BinancePublicKey => 223, - MessageType::MessageType_BinanceSignTx => 224, - MessageType::MessageType_BinanceTxRequest => 225, - MessageType::MessageType_BinanceTransferMsg => 226, - MessageType::MessageType_BinanceOrderMsg => 227, - MessageType::MessageType_BinanceCancelMsg => 228, - MessageType::MessageType_BinanceSignedTx => 229, - MessageType::MessageType_WebAuthnListResidentCredentials => 230, - MessageType::MessageType_WebAuthnCredentials => 231, - MessageType::MessageType_WebAuthnAddResidentCredential => 232, - MessageType::MessageType_WebAuthnRemoveResidentCredential => 233, - MessageType::MessageType_SolanaGetPublicKey => 234, - MessageType::MessageType_SolanaPublicKey => 235, - MessageType::MessageType_SolanaGetAddress => 236, - MessageType::MessageType_SolanaAddress => 237, - MessageType::MessageType_SolanaSignTx => 238, - MessageType::MessageType_SolanaTxSignature => 239, + MessageType::MessageType_DebugLinkInsertSdCard => 94, + MessageType::MessageType_DebugLinkWatchLayout => 95, + MessageType::MessageType_DebugLinkResetDebugEvents => 96, + MessageType::MessageType_EthereumGetPublicKey => 97, + MessageType::MessageType_EthereumPublicKey => 98, + MessageType::MessageType_EthereumGetAddress => 99, + MessageType::MessageType_EthereumAddress => 100, + MessageType::MessageType_EthereumSignTx => 101, + MessageType::MessageType_EthereumSignTxEIP1559 => 102, + MessageType::MessageType_EthereumTxRequest => 103, + MessageType::MessageType_EthereumTxAck => 104, + MessageType::MessageType_EthereumSignMessage => 105, + MessageType::MessageType_EthereumVerifyMessage => 106, + MessageType::MessageType_EthereumMessageSignature => 107, + MessageType::MessageType_EthereumSignTypedData => 108, + MessageType::MessageType_EthereumTypedDataStructRequest => 109, + MessageType::MessageType_EthereumTypedDataStructAck => 110, + MessageType::MessageType_EthereumTypedDataValueRequest => 111, + MessageType::MessageType_EthereumTypedDataValueAck => 112, + MessageType::MessageType_EthereumTypedDataSignature => 113, + MessageType::MessageType_EthereumSignTypedHash => 114, + MessageType::MessageType_NEMGetAddress => 115, + MessageType::MessageType_NEMAddress => 116, + MessageType::MessageType_NEMSignTx => 117, + MessageType::MessageType_NEMSignedTx => 118, + MessageType::MessageType_NEMDecryptMessage => 119, + MessageType::MessageType_NEMDecryptedMessage => 120, + MessageType::MessageType_TezosGetAddress => 121, + MessageType::MessageType_TezosAddress => 122, + MessageType::MessageType_TezosSignTx => 123, + MessageType::MessageType_TezosSignedTx => 124, + MessageType::MessageType_TezosGetPublicKey => 125, + MessageType::MessageType_TezosPublicKey => 126, + MessageType::MessageType_StellarSignTx => 127, + MessageType::MessageType_StellarTxOpRequest => 128, + MessageType::MessageType_StellarGetAddress => 129, + MessageType::MessageType_StellarAddress => 130, + MessageType::MessageType_StellarCreateAccountOp => 131, + MessageType::MessageType_StellarPaymentOp => 132, + MessageType::MessageType_StellarPathPaymentStrictReceiveOp => 133, + MessageType::MessageType_StellarManageSellOfferOp => 134, + MessageType::MessageType_StellarCreatePassiveSellOfferOp => 135, + MessageType::MessageType_StellarSetOptionsOp => 136, + MessageType::MessageType_StellarChangeTrustOp => 137, + MessageType::MessageType_StellarAllowTrustOp => 138, + MessageType::MessageType_StellarAccountMergeOp => 139, + MessageType::MessageType_StellarManageDataOp => 140, + MessageType::MessageType_StellarBumpSequenceOp => 141, + MessageType::MessageType_StellarManageBuyOfferOp => 142, + MessageType::MessageType_StellarPathPaymentStrictSendOp => 143, + MessageType::MessageType_StellarClaimClaimableBalanceOp => 144, + MessageType::MessageType_StellarSignedTx => 145, + MessageType::MessageType_CardanoGetPublicKey => 146, + MessageType::MessageType_CardanoPublicKey => 147, + MessageType::MessageType_CardanoGetAddress => 148, + MessageType::MessageType_CardanoAddress => 149, + MessageType::MessageType_CardanoTxItemAck => 150, + MessageType::MessageType_CardanoTxAuxiliaryDataSupplement => 151, + MessageType::MessageType_CardanoTxWitnessRequest => 152, + MessageType::MessageType_CardanoTxWitnessResponse => 153, + MessageType::MessageType_CardanoTxHostAck => 154, + MessageType::MessageType_CardanoTxBodyHash => 155, + MessageType::MessageType_CardanoSignTxFinished => 156, + MessageType::MessageType_CardanoSignTxInit => 157, + MessageType::MessageType_CardanoTxInput => 158, + MessageType::MessageType_CardanoTxOutput => 159, + MessageType::MessageType_CardanoAssetGroup => 160, + MessageType::MessageType_CardanoToken => 161, + MessageType::MessageType_CardanoTxCertificate => 162, + MessageType::MessageType_CardanoTxWithdrawal => 163, + MessageType::MessageType_CardanoTxAuxiliaryData => 164, + MessageType::MessageType_CardanoPoolOwner => 165, + MessageType::MessageType_CardanoPoolRelayParameters => 166, + MessageType::MessageType_CardanoGetNativeScriptHash => 167, + MessageType::MessageType_CardanoNativeScriptHash => 168, + MessageType::MessageType_CardanoTxMint => 169, + MessageType::MessageType_CardanoTxCollateralInput => 170, + MessageType::MessageType_CardanoTxRequiredSigner => 171, + MessageType::MessageType_CardanoTxInlineDatumChunk => 172, + MessageType::MessageType_CardanoTxReferenceScriptChunk => 173, + MessageType::MessageType_CardanoTxReferenceInput => 174, + MessageType::MessageType_RippleGetAddress => 175, + MessageType::MessageType_RippleAddress => 176, + MessageType::MessageType_RippleSignTx => 177, + MessageType::MessageType_RippleSignedTx => 178, + MessageType::MessageType_MoneroTransactionInitRequest => 179, + MessageType::MessageType_MoneroTransactionInitAck => 180, + MessageType::MessageType_MoneroTransactionSetInputRequest => 181, + MessageType::MessageType_MoneroTransactionSetInputAck => 182, + MessageType::MessageType_MoneroTransactionInputViniRequest => 183, + MessageType::MessageType_MoneroTransactionInputViniAck => 184, + MessageType::MessageType_MoneroTransactionAllInputsSetRequest => 185, + MessageType::MessageType_MoneroTransactionAllInputsSetAck => 186, + MessageType::MessageType_MoneroTransactionSetOutputRequest => 187, + MessageType::MessageType_MoneroTransactionSetOutputAck => 188, + MessageType::MessageType_MoneroTransactionAllOutSetRequest => 189, + MessageType::MessageType_MoneroTransactionAllOutSetAck => 190, + MessageType::MessageType_MoneroTransactionSignInputRequest => 191, + MessageType::MessageType_MoneroTransactionSignInputAck => 192, + MessageType::MessageType_MoneroTransactionFinalRequest => 193, + MessageType::MessageType_MoneroTransactionFinalAck => 194, + MessageType::MessageType_MoneroKeyImageExportInitRequest => 195, + MessageType::MessageType_MoneroKeyImageExportInitAck => 196, + MessageType::MessageType_MoneroKeyImageSyncStepRequest => 197, + MessageType::MessageType_MoneroKeyImageSyncStepAck => 198, + MessageType::MessageType_MoneroKeyImageSyncFinalRequest => 199, + MessageType::MessageType_MoneroKeyImageSyncFinalAck => 200, + MessageType::MessageType_MoneroGetAddress => 201, + MessageType::MessageType_MoneroAddress => 202, + MessageType::MessageType_MoneroGetWatchKey => 203, + MessageType::MessageType_MoneroWatchKey => 204, + MessageType::MessageType_DebugMoneroDiagRequest => 205, + MessageType::MessageType_DebugMoneroDiagAck => 206, + MessageType::MessageType_MoneroGetTxKeyRequest => 207, + MessageType::MessageType_MoneroGetTxKeyAck => 208, + MessageType::MessageType_MoneroLiveRefreshStartRequest => 209, + MessageType::MessageType_MoneroLiveRefreshStartAck => 210, + MessageType::MessageType_MoneroLiveRefreshStepRequest => 211, + MessageType::MessageType_MoneroLiveRefreshStepAck => 212, + MessageType::MessageType_MoneroLiveRefreshFinalRequest => 213, + MessageType::MessageType_MoneroLiveRefreshFinalAck => 214, + MessageType::MessageType_EosGetPublicKey => 215, + MessageType::MessageType_EosPublicKey => 216, + MessageType::MessageType_EosSignTx => 217, + MessageType::MessageType_EosTxActionRequest => 218, + MessageType::MessageType_EosTxActionAck => 219, + MessageType::MessageType_EosSignedTx => 220, + MessageType::MessageType_BinanceGetAddress => 221, + MessageType::MessageType_BinanceAddress => 222, + MessageType::MessageType_BinanceGetPublicKey => 223, + MessageType::MessageType_BinancePublicKey => 224, + MessageType::MessageType_BinanceSignTx => 225, + MessageType::MessageType_BinanceTxRequest => 226, + MessageType::MessageType_BinanceTransferMsg => 227, + MessageType::MessageType_BinanceOrderMsg => 228, + MessageType::MessageType_BinanceCancelMsg => 229, + MessageType::MessageType_BinanceSignedTx => 230, + MessageType::MessageType_WebAuthnListResidentCredentials => 231, + MessageType::MessageType_WebAuthnCredentials => 232, + MessageType::MessageType_WebAuthnAddResidentCredential => 233, + MessageType::MessageType_WebAuthnRemoveResidentCredential => 234, + MessageType::MessageType_SolanaGetPublicKey => 235, + MessageType::MessageType_SolanaPublicKey => 236, + MessageType::MessageType_SolanaGetAddress => 237, + MessageType::MessageType_SolanaAddress => 238, + MessageType::MessageType_SolanaSignTx => 239, + MessageType::MessageType_SolanaTxSignature => 240, }; Self::enum_descriptor().value_by_index(index) } @@ -1550,7 +1556,7 @@ pub mod exts { static file_descriptor_proto_data: &'static [u8] = b"\ \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\x20google/protobuf/de\ - scriptor.proto*\x8bS\n\x0bMessageType\x12(\n\x16MessageType_Initialize\ + scriptor.proto*\xbdS\n\x0bMessageType\x12(\n\x16MessageType_Initialize\ \x10\0\x1a\x0c\x80\xa6\x1d\x01\xb0\xb5\x18\x01\x90\xb5\x18\x01\x12\x1e\n\ \x10MessageType_Ping\x10\x01\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12\ %\n\x13MessageType_Success\x10\x02\x1a\x0c\x80\xa6\x1d\x01\xa8\xb5\x18\ @@ -1661,84 +1667,85 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x120\n!MessageType_DebugLinkReseedRandom\x10\xaaF\x1a\x08\x80\xa6\x1d\ \x01\xa0\xb5\x18\x01\x120\n!MessageType_DebugLinkRecordScreen\x10\xabF\ \x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12/\n\x20MessageType_DebugLink\ - EraseSdCard\x10\xadF\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12/\n\x20M\ - essageType_DebugLinkWatchLayout\x10\xaeF\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\ - \x18\x01\x124\n%MessageType_DebugLinkResetDebugEvents\x10\xafF\x1a\x08\ - \x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12+\n\x20MessageType_EthereumGetPublic\ - Key\x10\xc2\x03\x1a\x04\x90\xb5\x18\x01\x12(\n\x1dMessageType_EthereumPu\ - blicKey\x10\xc3\x03\x1a\x04\x98\xb5\x18\x01\x12(\n\x1eMessageType_Ethere\ - umGetAddress\x108\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_Ethereum\ - Address\x109\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EthereumSignT\ - x\x10:\x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType_EthereumSignTxEIP1559\ - \x10\xc4\x03\x1a\x04\x90\xb5\x18\x01\x12'\n\x1dMessageType_EthereumTxReq\ - uest\x10;\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_EthereumTxAck\ - \x10<\x1a\x04\x90\xb5\x18\x01\x12)\n\x1fMessageType_EthereumSignMessage\ - \x10@\x1a\x04\x90\xb5\x18\x01\x12+\n!MessageType_EthereumVerifyMessage\ - \x10A\x1a\x04\x90\xb5\x18\x01\x12.\n$MessageType_EthereumMessageSignatur\ - e\x10B\x1a\x04\x98\xb5\x18\x01\x12,\n!MessageType_EthereumSignTypedData\ - \x10\xd0\x03\x1a\x04\x90\xb5\x18\x01\x125\n*MessageType_EthereumTypedDat\ - aStructRequest\x10\xd1\x03\x1a\x04\x98\xb5\x18\x01\x121\n&MessageType_Et\ - hereumTypedDataStructAck\x10\xd2\x03\x1a\x04\x90\xb5\x18\x01\x124\n)Mess\ - ageType_EthereumTypedDataValueRequest\x10\xd3\x03\x1a\x04\x98\xb5\x18\ - \x01\x120\n%MessageType_EthereumTypedDataValueAck\x10\xd4\x03\x1a\x04\ - \x90\xb5\x18\x01\x121\n&MessageType_EthereumTypedDataSignature\x10\xd5\ - \x03\x1a\x04\x98\xb5\x18\x01\x12,\n!MessageType_EthereumSignTypedHash\ - \x10\xd6\x03\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_NEMGetAddress\ - \x10C\x1a\x04\x90\xb5\x18\x01\x12\x20\n\x16MessageType_NEMAddress\x10D\ - \x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_NEMSignTx\x10E\x1a\x04\ - \x90\xb5\x18\x01\x12!\n\x17MessageType_NEMSignedTx\x10F\x1a\x04\x98\xb5\ - \x18\x01\x12'\n\x1dMessageType_NEMDecryptMessage\x10K\x1a\x04\x90\xb5\ - \x18\x01\x12)\n\x1fMessageType_NEMDecryptedMessage\x10L\x1a\x04\x98\xb5\ - \x18\x01\x12&\n\x1bMessageType_TezosGetAddress\x10\x96\x01\x1a\x04\x90\ - \xb5\x18\x01\x12#\n\x18MessageType_TezosAddress\x10\x97\x01\x1a\x04\x98\ - \xb5\x18\x01\x12\"\n\x17MessageType_TezosSignTx\x10\x98\x01\x1a\x04\x90\ - \xb5\x18\x01\x12$\n\x19MessageType_TezosSignedTx\x10\x99\x01\x1a\x04\x98\ - \xb5\x18\x01\x12(\n\x1dMessageType_TezosGetPublicKey\x10\x9a\x01\x1a\x04\ - \x90\xb5\x18\x01\x12%\n\x1aMessageType_TezosPublicKey\x10\x9b\x01\x1a\ - \x04\x98\xb5\x18\x01\x12$\n\x19MessageType_StellarSignTx\x10\xca\x01\x1a\ - \x04\x90\xb5\x18\x01\x12)\n\x1eMessageType_StellarTxOpRequest\x10\xcb\ - \x01\x1a\x04\x98\xb5\x18\x01\x12(\n\x1dMessageType_StellarGetAddress\x10\ - \xcf\x01\x1a\x04\x90\xb5\x18\x01\x12%\n\x1aMessageType_StellarAddress\ - \x10\xd0\x01\x1a\x04\x98\xb5\x18\x01\x12-\n\"MessageType_StellarCreateAc\ - countOp\x10\xd2\x01\x1a\x04\x90\xb5\x18\x01\x12'\n\x1cMessageType_Stella\ - rPaymentOp\x10\xd3\x01\x1a\x04\x90\xb5\x18\x01\x128\n-MessageType_Stella\ - rPathPaymentStrictReceiveOp\x10\xd4\x01\x1a\x04\x90\xb5\x18\x01\x12/\n$M\ - essageType_StellarManageSellOfferOp\x10\xd5\x01\x1a\x04\x90\xb5\x18\x01\ - \x126\n+MessageType_StellarCreatePassiveSellOfferOp\x10\xd6\x01\x1a\x04\ - \x90\xb5\x18\x01\x12*\n\x1fMessageType_StellarSetOptionsOp\x10\xd7\x01\ - \x1a\x04\x90\xb5\x18\x01\x12+\n\x20MessageType_StellarChangeTrustOp\x10\ - \xd8\x01\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_StellarAllowTrust\ - Op\x10\xd9\x01\x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType_StellarAccount\ - MergeOp\x10\xda\x01\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_Stella\ - rManageDataOp\x10\xdc\x01\x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType_Ste\ - llarBumpSequenceOp\x10\xdd\x01\x1a\x04\x90\xb5\x18\x01\x12.\n#MessageTyp\ - e_StellarManageBuyOfferOp\x10\xde\x01\x1a\x04\x90\xb5\x18\x01\x125\n*Mes\ - sageType_StellarPathPaymentStrictSendOp\x10\xdf\x01\x1a\x04\x90\xb5\x18\ - \x01\x125\n*MessageType_StellarClaimClaimableBalanceOp\x10\xe1\x01\x1a\ - \x04\x90\xb5\x18\x01\x12&\n\x1bMessageType_StellarSignedTx\x10\xe6\x01\ - \x1a\x04\x98\xb5\x18\x01\x12*\n\x1fMessageType_CardanoGetPublicKey\x10\ - \xb1\x02\x1a\x04\x90\xb5\x18\x01\x12'\n\x1cMessageType_CardanoPublicKey\ - \x10\xb2\x02\x1a\x04\x98\xb5\x18\x01\x12(\n\x1dMessageType_CardanoGetAdd\ - ress\x10\xb3\x02\x1a\x04\x90\xb5\x18\x01\x12%\n\x1aMessageType_CardanoAd\ - dress\x10\xb4\x02\x1a\x04\x98\xb5\x18\x01\x12'\n\x1cMessageType_CardanoT\ - xItemAck\x10\xb9\x02\x1a\x04\x98\xb5\x18\x01\x127\n,MessageType_CardanoT\ - xAuxiliaryDataSupplement\x10\xba\x02\x1a\x04\x98\xb5\x18\x01\x12.\n#Mess\ - ageType_CardanoTxWitnessRequest\x10\xbb\x02\x1a\x04\x90\xb5\x18\x01\x12/\ - \n$MessageType_CardanoTxWitnessResponse\x10\xbc\x02\x1a\x04\x98\xb5\x18\ - \x01\x12'\n\x1cMessageType_CardanoTxHostAck\x10\xbd\x02\x1a\x04\x90\xb5\ - \x18\x01\x12(\n\x1dMessageType_CardanoTxBodyHash\x10\xbe\x02\x1a\x04\x98\ - \xb5\x18\x01\x12,\n!MessageType_CardanoSignTxFinished\x10\xbf\x02\x1a\ - \x04\x98\xb5\x18\x01\x12(\n\x1dMessageType_CardanoSignTxInit\x10\xc0\x02\ - \x1a\x04\x90\xb5\x18\x01\x12%\n\x1aMessageType_CardanoTxInput\x10\xc1\ - \x02\x1a\x04\x90\xb5\x18\x01\x12&\n\x1bMessageType_CardanoTxOutput\x10\ - \xc2\x02\x1a\x04\x90\xb5\x18\x01\x12(\n\x1dMessageType_CardanoAssetGroup\ - \x10\xc3\x02\x1a\x04\x90\xb5\x18\x01\x12#\n\x18MessageType_CardanoToken\ - \x10\xc4\x02\x1a\x04\x90\xb5\x18\x01\x12+\n\x20MessageType_CardanoTxCert\ - ificate\x10\xc5\x02\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_Cardan\ - oTxWithdrawal\x10\xc6\x02\x1a\x04\x90\xb5\x18\x01\x12-\n\"MessageType_Ca\ - rdanoTxAuxiliaryData\x10\xc7\x02\x1a\x04\x90\xb5\x18\x01\x12'\n\x1cMessa\ - geType_CardanoPoolOwner\x10\xc8\x02\x1a\x04\x90\xb5\x18\x01\x121\n&Messa\ - geType_CardanoPoolRelayParameters\x10\xc9\x02\x1a\x04\x90\xb5\x18\x01\ + EraseSdCard\x10\xadF\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x120\n!Mess\ + ageType_DebugLinkInsertSdCard\x10\xaeF\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\ + \x18\x01\x12/\n\x20MessageType_DebugLinkWatchLayout\x10\xafF\x1a\x08\x80\ + \xa6\x1d\x01\xa0\xb5\x18\x01\x124\n%MessageType_DebugLinkResetDebugEvent\ + s\x10\xb0F\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12+\n\x20MessageType\ + _EthereumGetPublicKey\x10\xc2\x03\x1a\x04\x90\xb5\x18\x01\x12(\n\x1dMess\ + ageType_EthereumPublicKey\x10\xc3\x03\x1a\x04\x98\xb5\x18\x01\x12(\n\x1e\ + MessageType_EthereumGetAddress\x108\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMe\ + ssageType_EthereumAddress\x109\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessage\ + Type_EthereumSignTx\x10:\x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType_Ethe\ + reumSignTxEIP1559\x10\xc4\x03\x1a\x04\x90\xb5\x18\x01\x12'\n\x1dMessageT\ + ype_EthereumTxRequest\x10;\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType\ + _EthereumTxAck\x10<\x1a\x04\x90\xb5\x18\x01\x12)\n\x1fMessageType_Ethere\ + umSignMessage\x10@\x1a\x04\x90\xb5\x18\x01\x12+\n!MessageType_EthereumVe\ + rifyMessage\x10A\x1a\x04\x90\xb5\x18\x01\x12.\n$MessageType_EthereumMess\ + ageSignature\x10B\x1a\x04\x98\xb5\x18\x01\x12,\n!MessageType_EthereumSig\ + nTypedData\x10\xd0\x03\x1a\x04\x90\xb5\x18\x01\x125\n*MessageType_Ethere\ + umTypedDataStructRequest\x10\xd1\x03\x1a\x04\x98\xb5\x18\x01\x121\n&Mess\ + ageType_EthereumTypedDataStructAck\x10\xd2\x03\x1a\x04\x90\xb5\x18\x01\ + \x124\n)MessageType_EthereumTypedDataValueRequest\x10\xd3\x03\x1a\x04\ + \x98\xb5\x18\x01\x120\n%MessageType_EthereumTypedDataValueAck\x10\xd4\ + \x03\x1a\x04\x90\xb5\x18\x01\x121\n&MessageType_EthereumTypedDataSignatu\ + re\x10\xd5\x03\x1a\x04\x98\xb5\x18\x01\x12,\n!MessageType_EthereumSignTy\ + pedHash\x10\xd6\x03\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_NEMGet\ + Address\x10C\x1a\x04\x90\xb5\x18\x01\x12\x20\n\x16MessageType_NEMAddress\ + \x10D\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_NEMSignTx\x10E\ + \x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_NEMSignedTx\x10F\x1a\x04\ + \x98\xb5\x18\x01\x12'\n\x1dMessageType_NEMDecryptMessage\x10K\x1a\x04\ + \x90\xb5\x18\x01\x12)\n\x1fMessageType_NEMDecryptedMessage\x10L\x1a\x04\ + \x98\xb5\x18\x01\x12&\n\x1bMessageType_TezosGetAddress\x10\x96\x01\x1a\ + \x04\x90\xb5\x18\x01\x12#\n\x18MessageType_TezosAddress\x10\x97\x01\x1a\ + \x04\x98\xb5\x18\x01\x12\"\n\x17MessageType_TezosSignTx\x10\x98\x01\x1a\ + \x04\x90\xb5\x18\x01\x12$\n\x19MessageType_TezosSignedTx\x10\x99\x01\x1a\ + \x04\x98\xb5\x18\x01\x12(\n\x1dMessageType_TezosGetPublicKey\x10\x9a\x01\ + \x1a\x04\x90\xb5\x18\x01\x12%\n\x1aMessageType_TezosPublicKey\x10\x9b\ + \x01\x1a\x04\x98\xb5\x18\x01\x12$\n\x19MessageType_StellarSignTx\x10\xca\ + \x01\x1a\x04\x90\xb5\x18\x01\x12)\n\x1eMessageType_StellarTxOpRequest\ + \x10\xcb\x01\x1a\x04\x98\xb5\x18\x01\x12(\n\x1dMessageType_StellarGetAdd\ + ress\x10\xcf\x01\x1a\x04\x90\xb5\x18\x01\x12%\n\x1aMessageType_StellarAd\ + dress\x10\xd0\x01\x1a\x04\x98\xb5\x18\x01\x12-\n\"MessageType_StellarCre\ + ateAccountOp\x10\xd2\x01\x1a\x04\x90\xb5\x18\x01\x12'\n\x1cMessageType_S\ + tellarPaymentOp\x10\xd3\x01\x1a\x04\x90\xb5\x18\x01\x128\n-MessageType_S\ + tellarPathPaymentStrictReceiveOp\x10\xd4\x01\x1a\x04\x90\xb5\x18\x01\x12\ + /\n$MessageType_StellarManageSellOfferOp\x10\xd5\x01\x1a\x04\x90\xb5\x18\ + \x01\x126\n+MessageType_StellarCreatePassiveSellOfferOp\x10\xd6\x01\x1a\ + \x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_StellarSetOptionsOp\x10\xd7\ + \x01\x1a\x04\x90\xb5\x18\x01\x12+\n\x20MessageType_StellarChangeTrustOp\ + \x10\xd8\x01\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_StellarAllowT\ + rustOp\x10\xd9\x01\x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType_StellarAcc\ + ountMergeOp\x10\xda\x01\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_St\ + ellarManageDataOp\x10\xdc\x01\x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType\ + _StellarBumpSequenceOp\x10\xdd\x01\x1a\x04\x90\xb5\x18\x01\x12.\n#Messag\ + eType_StellarManageBuyOfferOp\x10\xde\x01\x1a\x04\x90\xb5\x18\x01\x125\n\ + *MessageType_StellarPathPaymentStrictSendOp\x10\xdf\x01\x1a\x04\x90\xb5\ + \x18\x01\x125\n*MessageType_StellarClaimClaimableBalanceOp\x10\xe1\x01\ + \x1a\x04\x90\xb5\x18\x01\x12&\n\x1bMessageType_StellarSignedTx\x10\xe6\ + \x01\x1a\x04\x98\xb5\x18\x01\x12*\n\x1fMessageType_CardanoGetPublicKey\ + \x10\xb1\x02\x1a\x04\x90\xb5\x18\x01\x12'\n\x1cMessageType_CardanoPublic\ + Key\x10\xb2\x02\x1a\x04\x98\xb5\x18\x01\x12(\n\x1dMessageType_CardanoGet\ + Address\x10\xb3\x02\x1a\x04\x90\xb5\x18\x01\x12%\n\x1aMessageType_Cardan\ + oAddress\x10\xb4\x02\x1a\x04\x98\xb5\x18\x01\x12'\n\x1cMessageType_Carda\ + noTxItemAck\x10\xb9\x02\x1a\x04\x98\xb5\x18\x01\x127\n,MessageType_Carda\ + noTxAuxiliaryDataSupplement\x10\xba\x02\x1a\x04\x98\xb5\x18\x01\x12.\n#M\ + essageType_CardanoTxWitnessRequest\x10\xbb\x02\x1a\x04\x90\xb5\x18\x01\ + \x12/\n$MessageType_CardanoTxWitnessResponse\x10\xbc\x02\x1a\x04\x98\xb5\ + \x18\x01\x12'\n\x1cMessageType_CardanoTxHostAck\x10\xbd\x02\x1a\x04\x90\ + \xb5\x18\x01\x12(\n\x1dMessageType_CardanoTxBodyHash\x10\xbe\x02\x1a\x04\ + \x98\xb5\x18\x01\x12,\n!MessageType_CardanoSignTxFinished\x10\xbf\x02\ + \x1a\x04\x98\xb5\x18\x01\x12(\n\x1dMessageType_CardanoSignTxInit\x10\xc0\ + \x02\x1a\x04\x90\xb5\x18\x01\x12%\n\x1aMessageType_CardanoTxInput\x10\ + \xc1\x02\x1a\x04\x90\xb5\x18\x01\x12&\n\x1bMessageType_CardanoTxOutput\ + \x10\xc2\x02\x1a\x04\x90\xb5\x18\x01\x12(\n\x1dMessageType_CardanoAssetG\ + roup\x10\xc3\x02\x1a\x04\x90\xb5\x18\x01\x12#\n\x18MessageType_CardanoTo\ + ken\x10\xc4\x02\x1a\x04\x90\xb5\x18\x01\x12+\n\x20MessageType_CardanoTxC\ + ertificate\x10\xc5\x02\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_Car\ + danoTxWithdrawal\x10\xc6\x02\x1a\x04\x90\xb5\x18\x01\x12-\n\"MessageType\ + _CardanoTxAuxiliaryData\x10\xc7\x02\x1a\x04\x90\xb5\x18\x01\x12'\n\x1cMe\ + ssageType_CardanoPoolOwner\x10\xc8\x02\x1a\x04\x90\xb5\x18\x01\x121\n&Me\ + ssageType_CardanoPoolRelayParameters\x10\xc9\x02\x1a\x04\x90\xb5\x18\x01\ \x121\n&MessageType_CardanoGetNativeScriptHash\x10\xca\x02\x1a\x04\x90\ \xb5\x18\x01\x12.\n#MessageType_CardanoNativeScriptHash\x10\xcb\x02\x1a\ \x04\x98\xb5\x18\x01\x12$\n\x19MessageType_CardanoTxMint\x10\xcc\x02\x1a\ diff --git a/rust/trezor-client/src/protos/generated/messages_debug.rs b/rust/trezor-client/src/protos/generated/messages_debug.rs index b787aeb03..7dc9af08d 100644 --- a/rust/trezor-client/src/protos/generated/messages_debug.rs +++ b/rust/trezor-client/src/protos/generated/messages_debug.rs @@ -3210,6 +3210,221 @@ impl ::protobuf::reflect::ProtobufValue for DebugLinkEraseSdCard { type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; } +// @@protoc_insertion_point(message:hw.trezor.messages.debug.DebugLinkInsertSdCard) +#[derive(PartialEq,Clone,Default,Debug)] +pub struct DebugLinkInsertSdCard { + // message fields + // @@protoc_insertion_point(field:hw.trezor.messages.debug.DebugLinkInsertSdCard.serial_number) + pub serial_number: ::std::option::Option, + // @@protoc_insertion_point(field:hw.trezor.messages.debug.DebugLinkInsertSdCard.capacity_bytes) + pub capacity_bytes: ::std::option::Option, + // @@protoc_insertion_point(field:hw.trezor.messages.debug.DebugLinkInsertSdCard.manuf_ID) + pub manuf_ID: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:hw.trezor.messages.debug.DebugLinkInsertSdCard.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a DebugLinkInsertSdCard { + fn default() -> &'a DebugLinkInsertSdCard { + ::default_instance() + } +} + +impl DebugLinkInsertSdCard { + pub fn new() -> DebugLinkInsertSdCard { + ::std::default::Default::default() + } + + // optional uint32 serial_number = 1; + + pub fn serial_number(&self) -> u32 { + self.serial_number.unwrap_or(0) + } + + pub fn clear_serial_number(&mut self) { + self.serial_number = ::std::option::Option::None; + } + + pub fn has_serial_number(&self) -> bool { + self.serial_number.is_some() + } + + // Param is passed by value, moved + pub fn set_serial_number(&mut self, v: u32) { + self.serial_number = ::std::option::Option::Some(v); + } + + // optional uint32 capacity_bytes = 2; + + pub fn capacity_bytes(&self) -> u32 { + self.capacity_bytes.unwrap_or(0) + } + + pub fn clear_capacity_bytes(&mut self) { + self.capacity_bytes = ::std::option::Option::None; + } + + pub fn has_capacity_bytes(&self) -> bool { + self.capacity_bytes.is_some() + } + + // Param is passed by value, moved + pub fn set_capacity_bytes(&mut self, v: u32) { + self.capacity_bytes = ::std::option::Option::Some(v); + } + + // optional uint32 manuf_ID = 3; + + pub fn manuf_ID(&self) -> u32 { + self.manuf_ID.unwrap_or(0) + } + + pub fn clear_manuf_ID(&mut self) { + self.manuf_ID = ::std::option::Option::None; + } + + pub fn has_manuf_ID(&self) -> bool { + self.manuf_ID.is_some() + } + + // Param is passed by value, moved + pub fn set_manuf_ID(&mut self, v: u32) { + self.manuf_ID = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(3); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "serial_number", + |m: &DebugLinkInsertSdCard| { &m.serial_number }, + |m: &mut DebugLinkInsertSdCard| { &mut m.serial_number }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "capacity_bytes", + |m: &DebugLinkInsertSdCard| { &m.capacity_bytes }, + |m: &mut DebugLinkInsertSdCard| { &mut m.capacity_bytes }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "manuf_ID", + |m: &DebugLinkInsertSdCard| { &m.manuf_ID }, + |m: &mut DebugLinkInsertSdCard| { &mut m.manuf_ID }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "DebugLinkInsertSdCard", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for DebugLinkInsertSdCard { + const NAME: &'static str = "DebugLinkInsertSdCard"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 8 => { + self.serial_number = ::std::option::Option::Some(is.read_uint32()?); + }, + 16 => { + self.capacity_bytes = ::std::option::Option::Some(is.read_uint32()?); + }, + 24 => { + self.manuf_ID = ::std::option::Option::Some(is.read_uint32()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.serial_number { + my_size += ::protobuf::rt::uint32_size(1, v); + } + if let Some(v) = self.capacity_bytes { + my_size += ::protobuf::rt::uint32_size(2, v); + } + if let Some(v) = self.manuf_ID { + my_size += ::protobuf::rt::uint32_size(3, v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.serial_number { + os.write_uint32(1, v)?; + } + if let Some(v) = self.capacity_bytes { + os.write_uint32(2, v)?; + } + if let Some(v) = self.manuf_ID { + os.write_uint32(3, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> DebugLinkInsertSdCard { + DebugLinkInsertSdCard::new() + } + + fn clear(&mut self) { + self.serial_number = ::std::option::Option::None; + self.capacity_bytes = ::std::option::Option::None; + self.manuf_ID = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static DebugLinkInsertSdCard { + static instance: DebugLinkInsertSdCard = DebugLinkInsertSdCard { + serial_number: ::std::option::Option::None, + capacity_bytes: ::std::option::Option::None, + manuf_ID: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for DebugLinkInsertSdCard { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("DebugLinkInsertSdCard").unwrap()).clone() + } +} + +impl ::std::fmt::Display for DebugLinkInsertSdCard { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for DebugLinkInsertSdCard { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + // @@protoc_insertion_point(message:hw.trezor.messages.debug.DebugLinkWatchLayout) #[derive(PartialEq,Clone,Default,Debug)] pub struct DebugLinkWatchLayout { @@ -3499,10 +3714,13 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x01(\rR\x07address\x12\x16\n\x06memory\x18\x02\x20\x01(\x0cR\x06memory\ \x12\x14\n\x05flash\x18\x03\x20\x01(\x08R\x05flash\"-\n\x13DebugLinkFlas\ hErase\x12\x16\n\x06sector\x18\x01\x20\x01(\rR\x06sector\".\n\x14DebugLi\ - nkEraseSdCard\x12\x16\n\x06format\x18\x01\x20\x01(\x08R\x06format\",\n\ - \x14DebugLinkWatchLayout\x12\x14\n\x05watch\x18\x01\x20\x01(\x08R\x05wat\ - ch\"\x1b\n\x19DebugLinkResetDebugEventsB=\n#com.satoshilabs.trezor.lib.p\ - rotobufB\x12TrezorMessageDebug\x80\xa6\x1d\x01\ + nkEraseSdCard\x12\x16\n\x06format\x18\x01\x20\x01(\x08R\x06format\"~\n\ + \x15DebugLinkInsertSdCard\x12#\n\rserial_number\x18\x01\x20\x01(\rR\x0cs\ + erialNumber\x12%\n\x0ecapacity_bytes\x18\x02\x20\x01(\rR\rcapacityBytes\ + \x12\x19\n\x08manuf_ID\x18\x03\x20\x01(\rR\x07manufID\",\n\x14DebugLinkW\ + atchLayout\x12\x14\n\x05watch\x18\x01\x20\x01(\x08R\x05watch\"\x1b\n\x19\ + DebugLinkResetDebugEventsB=\n#com.satoshilabs.trezor.lib.protobufB\x12Tr\ + ezorMessageDebug\x80\xa6\x1d\x01\ "; /// `FileDescriptorProto` object which was a source for this generated file @@ -3523,7 +3741,7 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor { deps.push(super::messages::file_descriptor().clone()); deps.push(super::messages_common::file_descriptor().clone()); deps.push(super::messages_management::file_descriptor().clone()); - let mut messages = ::std::vec::Vec::with_capacity(15); + let mut messages = ::std::vec::Vec::with_capacity(16); messages.push(DebugLinkDecision::generated_message_descriptor_data()); messages.push(DebugLinkLayout::generated_message_descriptor_data()); messages.push(DebugLinkReseedRandom::generated_message_descriptor_data()); @@ -3537,6 +3755,7 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor { messages.push(DebugLinkMemoryWrite::generated_message_descriptor_data()); messages.push(DebugLinkFlashErase::generated_message_descriptor_data()); messages.push(DebugLinkEraseSdCard::generated_message_descriptor_data()); + messages.push(DebugLinkInsertSdCard::generated_message_descriptor_data()); messages.push(DebugLinkWatchLayout::generated_message_descriptor_data()); messages.push(DebugLinkResetDebugEvents::generated_message_descriptor_data()); let mut enums = ::std::vec::Vec::with_capacity(3); diff --git a/tests/conftest.py b/tests/conftest.py index 432cd22fe..dae9f903a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -198,14 +198,6 @@ def client( ): pytest.skip("Test excluded on Trezor R") - sd_marker = request.node.get_closest_marker("sd_card") - if sd_marker and not _raw_client.features.sd_card_present: - raise RuntimeError( - "This test requires SD card.\n" - "To skip all such tests, run:\n" - " pytest -m 'not sd_card' " - ) - test_ui = request.config.getoption("ui") _raw_client.reset_debug_features() @@ -223,7 +215,9 @@ def client( # we need to reseed before the wipe _raw_client.debug.reseed(0) + sd_marker = request.node.get_closest_marker("sd_card") if sd_marker: + _raw_client.debug.insert_sd_card(1) should_format = sd_marker.kwargs.get("formatted", True) _raw_client.debug.erase_sd_card(format=should_format) diff --git a/tests/device_tests/test_debug_sdcard_insert.py b/tests/device_tests/test_debug_sdcard_insert.py new file mode 100644 index 000000000..e1d19342c --- /dev/null +++ b/tests/device_tests/test_debug_sdcard_insert.py @@ -0,0 +1,34 @@ +import pytest + +from trezorlib.debuglink import TrezorClientDebugLink as Client + +pytestmark = [pytest.mark.skip_t1, pytest.mark.skip_tr] + + +@pytest.mark.sd_card(formatted=True) +def test_sd_eject(client: Client): + print(client.features) + assert client.features.sd_card_present is True + + client.debug.eject_sd_card() + client.refresh_features() + print(client.features) + assert client.features.sd_card_present is False + + client.debug.insert_sd_card(2) + client.debug.erase_sd_card(format=True) + client.refresh_features() + assert client.features.sd_card_present is True + + client.debug.eject_sd_card() + client.refresh_features() + assert client.features.sd_card_present is False + + client.debug.insert_sd_card(3) + client.debug.erase_sd_card(format=False) + client.refresh_features() + assert client.features.sd_card_present is True + + client.debug.eject_sd_card() + client.refresh_features() + assert client.features.sd_card_present is False