feat(core/sdbackup): insert/eject emulator SD card

- access through DebugLink
- card can be initialized with
    - serial_number (used for filename and later for shamir backup
      functionality)
    - capacity in bytes
    - manufacturer ID (used for recognition of Trezor card together with
      capacity)
- one debug protobuf message added serial_number set to None means
  ejecting the card from emulator
- TODO: initialize the card with preexisting data
pull/3441/head
obrusvit 6 months ago
parent b82e80fbf6
commit f35ffa0c18

@ -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

@ -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;

@ -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];

@ -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',

@ -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 <http://www.gnu.org/licenses/>.
*/
#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,
};

@ -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

@ -18,6 +18,7 @@
*/
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
@ -26,27 +27,24 @@
#include <unistd.h>
#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; }

@ -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");

@ -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__

@ -0,0 +1,68 @@
#include "sdcard_emu_mock.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}

@ -0,0 +1,25 @@
#ifndef __TREZOR_SDCARD_EMULATOR_MOCK_H__
#define __TREZOR_SDCARD_EMULATOR_MOCK_H__
#include <stdint.h>
#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__

@ -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)],
)

@ -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

@ -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.
"""

@ -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

@ -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

@ -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

@ -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"

@ -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"

@ -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"

@ -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):

@ -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,
}

@ -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\

@ -3210,6 +3210,221 @@ impl ::protobuf::reflect::ProtobufValue for DebugLinkEraseSdCard {
type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
}
// @@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<u32>,
// @@protoc_insertion_point(field:hw.trezor.messages.debug.DebugLinkInsertSdCard.capacity_bytes)
pub capacity_bytes: ::std::option::Option<u32>,
// @@protoc_insertion_point(field:hw.trezor.messages.debug.DebugLinkInsertSdCard.manuf_ID)
pub manuf_ID: ::std::option::Option<u32>,
// 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 {
<DebugLinkInsertSdCard as ::protobuf::Message>::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>(
"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<Self>;
}
// @@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);

@ -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 path>"
)
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)

@ -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
Loading…
Cancel
Save