feat(core/bootloader): signal firmware corrupted in features
What changed, and why it matters
This commit adds a new flag called firmware_corrupted to the device's Features message, which is sent to the host computer when the Trezor is in bootloader mode. Previously, the existing firmware_present flag only told the host whether any firmware was loaded, but its comment said 'valid firmware loaded.' The change makes the bootloader explicitly report whether the loaded firmware is corrupted, and it updates the comment on firmware_present to clarify it just means firmware is loaded. This is an informational/UX improvement, not a fix for a vulnerability in the device itself.
No immediate security action required. Treat as a normal feature/telemetry update. Host software using trezorlib may now inspect Features.firmware_corrupted to warn users about corrupted firmware, but the bootloader's security behavior is unchanged.
Security signals we found
New protobuf field exposes firmware integrity state to host
Bootloader now distinguishes 'firmware present' from 'firmware corrupted'
No change to firmware verification, signature checks, or boot policy
Informational/telemetry change only
Evidence from the diff
The change introduces a new optional bool field firmware_corrupted (protobuf tag 56) in the Features message across the common proto definition, the bootloader’s reduced proto, and generated bindings (Python, Rust, nanopb C). In core/embed/projects/bootloader/protob/protob.c, send_msg_features now sets firmware_corrupted = (firmware_present != sectrue) when a header is present, otherwise false. The firmware_present comment is narrowed from ‘is valid firmware loaded?’ to ‘is firmware loaded?’. The firmware_present/firmware_corrupted value is threaded through bootloader workflow functions. The nanopb generated files are also regenerated from 0.4.5 to 0.4.9.1, causing incidental struct reordering and enum size changes. No cryptographic, verification, or access-control logic is changed.
Changed components
Trezor Core bootloader Features message generationcommon/protob/messages-management.protocore/embed/projects/bootloader/protob/protob.ccore/embed/projects/bootloader/workflow/*trezorlib Python messages bindingrust/trezor-client messages_management generated codeInspect captured patch +316 / −215
diff --git a/common/protob/messages-management.proto b/common/protob/messages-management.proto
index 88acecca..d161bcac 100644
--- a/common/protob/messages-management.proto
+++ b/common/protob/messages-management.proto
@@ -89,7 +89,7 @@ message Features {
optional bool imported = 15; // was storage imported from an external source?
optional bool unlocked = 16; // is the device unlocked? called "pin_cached" previously
optional bool _passphrase_cached = 17 [deprecated=true]; // is passphrase already cached in session?
- optional bool firmware_present = 18; // is valid firmware loaded?
+ optional bool firmware_present = 18; // is firmware loaded?
optional BackupAvailability backup_availability = 19; // does storage need backup? is repeated backup unlocked?
optional uint32 flags = 20; // device flags (equals to Storage.flags)
optional string model = 21; // device hardware model
@@ -127,6 +127,7 @@ message Features {
optional RecoveryType recovery_type = 53; // what type of recovery we are in. NB: this works in conjunction with recovery_status
optional uint32 optiga_sec = 54; // Optiga's security event counter.
optional uint32 soc = 55; // Battery state of charge (0 - 100%)
+ optional bool firmware_corrupted = 56; // true if the firmware is corrupted
enum BackupAvailability {
/// Device is already backed up, or a previous backup has failed.
diff --git a/core/embed/projects/bootloader/.changelog.d/5857.added b/core/embed/projects/bootloader/.changelog.d/5857.added
new file mode 100644
index 00000000..8dbec6f7
--- /dev/null
+++ b/core/embed/projects/bootloader/.changelog.d/5857.added
@@ -0,0 +1 @@
+Signal FW corrupted to host via features message.
diff --git a/core/embed/projects/bootloader/main.c b/core/embed/projects/bootloader/main.c
index e258027e..24448d1a 100644
--- a/core/embed/projects/bootloader/main.c
+++ b/core/embed/projects/bootloader/main.c
@@ -711,7 +711,7 @@ int bootloader_main(void) {
if (header_present == sectrue) {
if (auto_upgrade == sectrue && firmware_present == sectrue) {
- result = workflow_auto_update(&vhdr, hdr);
+ result = workflow_auto_update(&vhdr, hdr, firmware_present);
} else {
result = workflow_bootloader(&vhdr, hdr, firmware_present);
}
diff --git a/core/embed/projects/bootloader/protob/pb/messages.pb.c b/core/embed/projects/bootloader/protob/pb/messages.pb.c
index 35bd16f9..28f7a34f 100644
--- a/core/embed/projects/bootloader/protob/pb/messages.pb.c
+++ b/core/embed/projects/bootloader/protob/pb/messages.pb.c
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.5 */
+/* Generated by nanopb-0.4.9.1 */
#include "messages.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -49,3 +49,6 @@ PB_BIND(UnlockBootloader, UnlockBootloader, AUTO)
+
+
+
diff --git a/core/embed/projects/bootloader/protob/pb/messages.pb.h b/core/embed/projects/bootloader/protob/pb/messages.pb.h
index f1e74a1a..c1a43013 100644
--- a/core/embed/projects/bootloader/protob/pb/messages.pb.h
+++ b/core/embed/projects/bootloader/protob/pb/messages.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.5 */
+/* Generated by nanopb-0.4.9.1 */
#ifndef PB_MESSAGES_PB_H_INCLUDED
#define PB_MESSAGES_PB_H_INCLUDED
@@ -39,38 +39,18 @@ typedef enum _ButtonRequestType {
} ButtonRequestType;
/* Struct definitions */
-typedef struct _ButtonAck {
- char dummy_field;
-} ButtonAck;
-
-typedef struct _GetFeatures {
- char dummy_field;
-} GetFeatures;
-
typedef struct _Initialize {
char dummy_field;
} Initialize;
-typedef struct _UnlockBootloader {
+typedef struct _GetFeatures {
char dummy_field;
-} UnlockBootloader;
+} GetFeatures;
typedef struct _WipeDevice {
char dummy_field;
} WipeDevice;
-typedef struct _ButtonRequest {
- bool has_code;
- ButtonRequestType code;
-} ButtonRequest;
-
-typedef struct _Failure {
- bool has_code;
- FailureType code;
- bool has_message;
- char message[256];
-} Failure;
-
typedef PB_BYTES_ARRAY_T(20) Features_revision_t;
typedef struct _Features {
bool has_vendor;
@@ -114,8 +94,36 @@ typedef struct _Features {
uint32_t unit_packaging;
bool has_soc;
uint32_t soc;
+ bool has_firmware_corrupted;
+ bool firmware_corrupted;
} Features;
+typedef struct _Ping {
+ bool has_message;
+ char message[256];
+} Ping;
+
+typedef struct _Success {
+ bool has_message;
+ char message[256];
+} Success;
+
+typedef struct _Failure {
+ bool has_code;
+ FailureType code;
+ bool has_message;
+ char message[256];
+} Failure;
+
+typedef struct _ButtonRequest {
+ bool has_code;
+ ButtonRequestType code;
+} ButtonRequest;
+
+typedef struct _ButtonAck {
+ char dummy_field;
+} ButtonAck;
+
typedef struct _FirmwareErase {
bool has_length;
uint32_t length;
@@ -133,16 +141,14 @@ typedef struct _FirmwareUpload {
FirmwareUpload_hash_t hash;
} FirmwareUpload;
-typedef struct _Ping {
- bool has_message;
- char message[256];
-} Ping;
+typedef struct _UnlockBootloader {
+ char dummy_field;
+} UnlockBootloader;
-typedef struct _Success {
- bool has_message;
- char message[256];
-} Success;
+#ifdef __cplusplus
+extern "C" {
+#endif
/* Helper constants for enums */
#define _MessageType_MIN MessageType_MessageType_Initialize
@@ -150,23 +156,34 @@ typedef struct _Success {
#define _MessageType_ARRAYSIZE ((MessageType)(MessageType_MessageType_UnlockBootloader+1))
#define _FailureType_MIN FailureType_Failure_UnexpectedMessage
-#define _FailureType_MAX FailureType_Failure_ProcessError
-#define _FailureType_ARRAYSIZE ((FailureType)(FailureType_Failure_ProcessError+1))
+#define _FailureType_MAX FailureType_Failure_Busy
+#define _FailureType_ARRAYSIZE ((FailureType)(FailureType_Failure_Busy+1))
#define _ButtonRequestType_MIN ButtonRequestType_ButtonRequest_Other
#define _ButtonRequestType_MAX ButtonRequestType_ButtonRequest_Other
#define _ButtonRequestType_ARRAYSIZE ((ButtonRequestType)(ButtonRequestType_ButtonRequest_Other+1))
-#ifdef __cplusplus
-extern "C" {
-#endif
+
+
+
+
+
+#define Failure_code_ENUMTYPE FailureType
+
+#define ButtonRequest_code_ENUMTYPE ButtonRequestType
+
+
+
+
+
+
/* Initializer values for message structs */
#define Initialize_init_default {0}
#define GetFeatures_init_default {0}
#define WipeDevice_init_default {0}
-#define Features_init_default {false, "", 0, 0, 0, false, 0, false, "", false, "", false, "", false, 0, false, {0, {0}}, false, 0, false, "", false, 0, false, 0, false, 0, false, "", false, "", false, 0, false, 0, false, 0, false, 0}
+#define Features_init_default {false, "", 0, 0, 0, false, 0, false, "", false, "", false, "", false, 0, false, {0, {0}}, false, 0, false, "", false, 0, false, 0, false, 0, false, "", false, "", false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
#define Ping_init_default {false, ""}
#define Success_init_default {false, ""}
#define Failure_init_default {false, _FailureType_MIN, false, ""}
@@ -179,7 +196,7 @@ extern "C" {
#define Initialize_init_zero {0}
#define GetFeatures_init_zero {0}
#define WipeDevice_init_zero {0}
-#define Features_init_zero {false, "", 0, 0, 0, false, 0, false, "", false, "", false, "", false, 0, false, {0, {0}}, false, 0, false, "", false, 0, false, 0, false, 0, false, "", false, "", false, 0, false, 0, false, 0, false, 0, false, 0}
+#define Features_init_zero {false, "", 0, 0, 0, false, 0, false, "", false, "", false, "", false, 0, false, {0, {0}}, false, 0, false, "", false, 0, false, 0, false, 0, false, "", false, "", false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
#define Ping_init_zero {false, ""}
#define Success_init_zero {false, ""}
#define Failure_init_zero {false, _FailureType_MIN, false, ""}
@@ -191,9 +208,6 @@ extern "C" {
#define UnlockBootloader_init_zero {0}
/* Field tags (for use in manual encoding/decoding) */
-#define ButtonRequest_code_tag 1
-#define Failure_code_tag 1
-#define Failure_message_tag 2
#define Features_vendor_tag 1
#define Features_major_version_tag 2
#define Features_minor_version_tag 3
@@ -216,13 +230,17 @@ extern "C" {
#define Features_bootloader_locked_tag 49
#define Features_unit_packaging_tag 51
#define Features_soc_tag 55
+#define Features_firmware_corrupted_tag 56
+#define Ping_message_tag 1
+#define Success_message_tag 1
+#define Failure_code_tag 1
+#define Failure_message_tag 2
+#define ButtonRequest_code_tag 1
#define FirmwareErase_length_tag 1
#define FirmwareRequest_offset_tag 1
#define FirmwareRequest_length_tag 2
#define FirmwareUpload_payload_tag 1
#define FirmwareUpload_hash_tag 2
-#define Ping_message_tag 1
-#define Success_message_tag 1
/* Struct field encoding specification for nanopb */
#define Initialize_FIELDLIST(X, a) \
@@ -262,7 +280,8 @@ X(a, STATIC, OPTIONAL, UINT32, unit_color, 45) \
X(a, STATIC, OPTIONAL, BOOL, unit_btconly, 46) \
X(a, STATIC, OPTIONAL, BOOL, bootloader_locked, 49) \
X(a, STATIC, OPTIONAL, UINT32, unit_packaging, 51) \
-X(a, STATIC, OPTIONAL, UINT32, soc, 55)
+X(a, STATIC, OPTIONAL, UINT32, soc, 55) \
+X(a, STATIC, OPTIONAL, BOOL, firmware_corrupted, 56)
#define Features_CALLBACK NULL
#define Features_DEFAULT NULL
@@ -348,16 +367,27 @@ extern const pb_msgdesc_t UnlockBootloader_msg;
#define ButtonAck_size 0
#define ButtonRequest_size 2
#define Failure_size 260
-#define Features_size 504
+#define Features_size 507
#define FirmwareErase_size 6
#define FirmwareRequest_size 12
#define GetFeatures_size 0
#define Initialize_size 0
+#define MESSAGES_PB_H_MAX_SIZE Features_size
#define Ping_size 258
#define Success_size 258
#define UnlockBootloader_size 0
#define WipeDevice_size 0
+/* Mapping from canonical names (mangle_names or overridden package name) */
+#define Failure_FailureType FailureType
+#define ButtonRequest_ButtonRequestType ButtonRequestType
+#define _Failure_FailureType_MIN _FailureType_MIN
+#define _Failure_FailureType_MAX _FailureType_MAX
+#define _Failure_FailureType_ARRAYSIZE _FailureType_ARRAYSIZE
+#define _ButtonRequest_ButtonRequestType_MIN _ButtonRequestType_MIN
+#define _ButtonRequest_ButtonRequestType_MAX _ButtonRequestType_MAX
+#define _ButtonRequest_ButtonRequestType_ARRAYSIZE _ButtonRequestType_ARRAYSIZE
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/core/embed/projects/bootloader/protob/pb/messages.proto b/core/embed/projects/bootloader/protob/pb/messages.proto
index 085f84ba..e68dc8bb 100644
--- a/core/embed/projects/bootloader/protob/pb/messages.proto
+++ b/core/embed/projects/bootloader/protob/pb/messages.proto
@@ -60,7 +60,7 @@ message Features {
optional string label = 10; // device description label
optional bool initialized = 12; // does device contain seed?
optional bytes revision = 13; // SCM revision of firmware
- optional bool firmware_present = 18; // is valid firmware loaded?
+ optional bool firmware_present = 18; // is firmware loaded?
optional string model = 21; // device hardware model
optional uint32 fw_major = 22; // reported firmware version if in bootloader mode
optional uint32 fw_minor = 23; // reported firmware version if in bootloader mode
@@ -73,6 +73,7 @@ message Features {
optional bool bootloader_locked = 49; // bootloader is locked
optional uint32 unit_packaging = 51; // unit/device packaging version
optional uint32 soc = 55; // Battery state of charge (0 - 100%)
+ optional bool firmware_corrupted = 56; // is firmware corrupted?
}
/**
diff --git a/core/embed/projects/bootloader/protob/protob.c b/core/embed/projects/bootloader/protob/protob.c
index eb336740..86865821 100644
--- a/core/embed/projects/bootloader/protob/protob.c
+++ b/core/embed/projects/bootloader/protob/protob.c
@@ -106,7 +106,8 @@ secbool send_msg_success(protob_io_t *iface, const char *msg) {
}
secbool send_msg_features(protob_io_t *iface, const vendor_header *const vhdr,
- const image_header *const hdr) {
+ const image_header *const hdr,
+ secbool firmware_present) {
MSG_SEND_INIT(Features);
MSG_SEND_ASSIGN_STRING(vendor, "trezor.io");
MSG_SEND_ASSIGN_REQUIRED_VALUE(major_version, VERSION_MAJOR);
@@ -121,8 +122,10 @@ secbool send_msg_features(protob_io_t *iface, const vendor_header *const vhdr,
MSG_SEND_ASSIGN_VALUE(fw_minor, ((hdr->version >> 8) & 0xFF));
MSG_SEND_ASSIGN_VALUE(fw_patch, ((hdr->version >> 16) & 0xFF));
MSG_SEND_ASSIGN_STRING_LEN(fw_vendor, vhdr->vstr, vhdr->vstr_len);
+ MSG_SEND_ASSIGN_VALUE(firmware_corrupted, sectrue != firmware_present);
} else {
MSG_SEND_ASSIGN_VALUE(firmware_present, false);
+ MSG_SEND_ASSIGN_VALUE(firmware_corrupted, false);
}
if (unit_properties()->color_is_valid) {
MSG_SEND_ASSIGN_VALUE(unit_color, unit_properties()->color);
diff --git a/core/embed/projects/bootloader/protob/protob.h b/core/embed/projects/bootloader/protob/protob.h
index ac1b7c8e..18663ccb 100644
--- a/core/embed/projects/bootloader/protob/protob.h
+++ b/core/embed/projects/bootloader/protob/protob.h
@@ -42,7 +42,8 @@ typedef struct {
secbool send_user_abort(protob_io_t *iface, const char *msg);
secbool send_msg_features(protob_io_t *iface, const vendor_header *const vhdr,
- const image_header *const hdr);
+ const image_header *const hdr,
+ secbool firmware_present);
secbool send_msg_failure(protob_io_t *iface, FailureType type, const char *msg);
diff --git a/core/embed/projects/bootloader/workflow/wf_auto_update.c b/core/embed/projects/bootloader/workflow/wf_auto_update.c
index 328f68ed..d5565448 100644
--- a/core/embed/projects/bootloader/workflow/wf_auto_update.c
+++ b/core/embed/projects/bootloader/workflow/wf_auto_update.c
@@ -30,7 +30,8 @@
#include "workflow.h"
workflow_result_t workflow_auto_update(const vendor_header *const vhdr,
- const image_header *const hdr) {
+ const image_header *const hdr,
+ secbool firmware_present) {
ui_set_initial_setup(true);
workflow_result_t res = WF_CANCELLED;
@@ -44,7 +45,8 @@ workflow_result_t workflow_auto_update(const vendor_header *const vhdr,
c_layout_t layout;
memset(&layout, 0, sizeof(layout));
screen_connect(true, false, &layout);
- res = workflow_host_control(vhdr, hdr, &layout, &ui_result, &ios);
+ res = workflow_host_control(vhdr, hdr, firmware_present, &layout, &ui_result,
+ &ios);
if (res == WF_OK_UI_ACTION && ui_result == CONNECT_CANCEL) {
bootargs_set(BOOT_COMMAND_NONE, NULL, 0);
diff --git a/core/embed/projects/bootloader/workflow/wf_ble_pairing_request.c b/core/embed/projects/bootloader/workflow/wf_ble_pairing_request.c
index fb4548cc..aee81c0a 100644
--- a/core/embed/projects/bootloader/workflow/wf_ble_pairing_request.c
+++ b/core/embed/projects/bootloader/workflow/wf_ble_pairing_request.c
@@ -45,7 +45,8 @@ static bool encode_pairing_code(uint32_t code, uint8_t *outbuf) {
}
workflow_result_t workflow_ble_pairing_request(const vendor_header *const vhdr,
- const image_header *const hdr) {
+ const image_header *const hdr,
+ secbool firmware_present) {
if (!ble_iface_start_pairing()) {
return WF_OK_PAIRING_FAILED;
}
@@ -63,7 +64,7 @@ workflow_result_t workflow_ble_pairing_request(const vendor_header *const vhdr,
uint32_t code = 0;
workflow_result_t res =
- workflow_host_control(vhdr, hdr, &layout, &code, NULL);
+ workflow_host_control(vhdr, hdr, firmware_present, &layout, &code, NULL);
#ifdef USE_RGB_LED
rgb_led_effect_stop();
@@ -133,6 +134,7 @@ workflow_result_t workflow_ble_pairing_request(const vendor_header *const vhdr,
workflow_result_t workflow_wireless_setup(const vendor_header *const vhdr,
const image_header *const hdr,
+ secbool firmware_present,
protob_ios_t *ios) {
if (!ble_iface_start_pairing()) {
return WF_OK_PAIRING_FAILED;
@@ -150,7 +152,8 @@ workflow_result_t workflow_wireless_setup(const vendor_header *const vhdr,
screen_wireless_setup(name, strlen(name), &layout);
uint32_t code = 0;
- workflow_result_t res = workflow_host_control(vhdr, hdr, &layout, &code, ios);
+ workflow_result_t res =
+ workflow_host_control(vhdr, hdr, firmware_present, &layout, &code, ios);
#ifdef USE_RGB_LED
rgb_led_effect_stop();
diff --git a/core/embed/projects/bootloader/workflow/wf_bootloader.c b/core/embed/projects/bootloader/workflow/wf_bootloader.c
index ced2a683..fb232c51 100644
--- a/core/embed/projects/bootloader/workflow/wf_bootloader.c
+++ b/core/embed/projects/bootloader/workflow/wf_bootloader.c
@@ -41,14 +41,14 @@
workflow_result_t workflow_menu(const vendor_header* const vhdr,
const image_header* const hdr,
- protob_ios_t* ios) {
+ secbool firmware_present, protob_ios_t* ios) {
while (true) {
c_layout_t layout;
memset(&layout, 0, sizeof(layout));
screen_menu(ui_get_initial_setup(), &layout);
uint32_t ui_result = 0;
- workflow_result_t result =
- workflow_host_control(vhdr, hdr, &layout, &ui_result, ios);
+ workflow_result_t result = workflow_host_control(
+ vhdr, hdr, firmware_present, &layout, &ui_result, ios);
if (result != WF_OK_UI_ACTION) {
return result;
@@ -62,7 +62,7 @@ workflow_result_t workflow_menu(const vendor_header* const vhdr,
#ifdef USE_BLE
if (menu_result == MENU_BLUETOOTH) {
workflow_ifaces_pause(ios);
- workflow_ble_pairing_request(vhdr, hdr);
+ workflow_ble_pairing_request(vhdr, hdr, firmware_present);
workflow_ifaces_resume(ios);
if (ios == NULL) {
// in case we were not in connected-mode, stop advertising
@@ -119,8 +119,9 @@ static screen_t handle_intro(const vendor_header* vhdr, const image_header* hdr,
}
static screen_t handle_menu(const vendor_header* vhdr, const image_header* hdr,
+ secbool firmware_present,
workflow_result_t* out_result) {
- workflow_result_t res = workflow_menu(vhdr, hdr, NULL);
+ workflow_result_t res = workflow_menu(vhdr, hdr, firmware_present, NULL);
switch (res) {
case WF_OK:
return SCREEN_INTRO; // back to intro
@@ -134,6 +135,7 @@ static screen_t handle_menu(const vendor_header* vhdr, const image_header* hdr,
static screen_t handle_wait_for_host(const vendor_header* vhdr,
const image_header* hdr,
+ secbool firmware_present,
workflow_result_t* out_result) {
c_layout_t layout;
memset(&layout, 0, sizeof(layout));
@@ -148,8 +150,8 @@ static screen_t handle_wait_for_host(const vendor_header* vhdr,
while (next_screen == SCREEN_WAIT_FOR_HOST) {
screen_connect(false, true, &layout);
- workflow_result_t res =
- workflow_host_control(vhdr, hdr, &layout, &ui_res, &ios);
+ workflow_result_t res = workflow_host_control(vhdr, hdr, firmware_present,
+ &layout, &ui_res, &ios);
switch (res) {
case WF_OK_UI_ACTION: {
@@ -160,7 +162,8 @@ static screen_t handle_wait_for_host(const vendor_header* vhdr,
#ifdef USE_BLE
case CONNECT_PAIRING_MODE: {
workflow_ifaces_pause(&ios);
- workflow_result_t ble = workflow_ble_pairing_request(vhdr, hdr);
+ workflow_result_t ble =
+ workflow_ble_pairing_request(vhdr, hdr, firmware_present);
workflow_ifaces_resume(&ios);
if (ble == WF_OK_PAIRING_COMPLETED || ble == WF_OK_PAIRING_FAILED) {
next_screen = SCREEN_WAIT_FOR_HOST;
@@ -176,7 +179,7 @@ static screen_t handle_wait_for_host(const vendor_header* vhdr,
case CONNECT_MENU: {
workflow_result_t menu_result = WF_CANCELLED;
while (menu_result == WF_CANCELLED) {
- menu_result = workflow_menu(vhdr, hdr, &ios);
+ menu_result = workflow_menu(vhdr, hdr, firmware_present, &ios);
switch (menu_result) {
case WF_OK:
next_screen = SCREEN_WAIT_FOR_HOST;
@@ -227,10 +230,10 @@ workflow_result_t workflow_bootloader(const vendor_header* vhdr,
screen = handle_intro(vhdr, hdr, firmware_present, &final_res);
break;
case SCREEN_MENU:
- screen = handle_menu(vhdr, hdr, &final_res);
+ screen = handle_menu(vhdr, hdr, firmware_present, &final_res);
break;
case SCREEN_WAIT_FOR_HOST:
- screen = handle_wait_for_host(vhdr, hdr, &final_res);
+ screen = handle_wait_for_host(vhdr, hdr, firmware_present, &final_res);
break;
default:
// shouldn’t happen
diff --git a/core/embed/projects/bootloader/workflow/wf_empty_device.c b/core/embed/projects/bootloader/workflow/wf_empty_device.c
index 345ab03a..09761a0f 100644
--- a/core/embed/projects/bootloader/workflow/wf_empty_device.c
+++ b/core/embed/projects/bootloader/workflow/wf_empty_device.c
@@ -76,10 +76,11 @@ workflow_result_t workflow_empty_device(void) {
c_layout_t layout;
memset(&layout, 0, sizeof(layout));
screen_welcome(&layout);
- res = workflow_host_control(NULL, NULL, &layout, &ui_result, &ios);
+ res =
+ workflow_host_control(NULL, NULL, secfalse, &layout, &ui_result, &ios);
#ifdef USE_BLE
if (res == WF_OK_UI_ACTION && ui_result == WELCOME_PAIRING_MODE) {
- res = workflow_wireless_setup(NULL, NULL, &ios);
+ res = workflow_wireless_setup(NULL, NULL, secfalse, &ios);
if (res == WF_OK_PAIRING_COMPLETED || res == WF_OK_PAIRING_FAILED) {
res = WF_CANCELLED;
ui_result = WELCOME_CANCEL;
@@ -90,7 +91,7 @@ workflow_result_t workflow_empty_device(void) {
#endif
if (res == WF_OK_UI_ACTION && ui_result == WELCOME_MENU) {
do {
- res = workflow_menu(NULL, NULL, &ios);
+ res = workflow_menu(NULL, NULL, secfalse, &ios);
} while (res == WF_CANCELLED);
if (res == WF_OK) {
diff --git a/core/embed/projects/bootloader/workflow/wf_get_features.c b/core/embed/projects/bootloader/workflow/wf_get_features.c
index 5f65eed4..f25ec5db 100644
--- a/core/embed/projects/bootloader/workflow/wf_get_features.c
+++ b/core/embed/projects/bootloader/workflow/wf_get_features.c
@@ -25,9 +25,10 @@
workflow_result_t workflow_get_features(protob_io_t *iface,
const vendor_header *const vhdr,
- const image_header *const hdr) {
+ const image_header *const hdr,
+ secbool firmware_present) {
GetFeatures msg_recv;
recv_msg_get_features(iface, &msg_recv);
- send_msg_features(iface, vhdr, hdr);
+ send_msg_features(iface, vhdr, hdr, firmware_present);
return WF_OK;
}
diff --git a/core/embed/projects/bootloader/workflow/wf_host_control.c b/core/embed/projects/bootloader/workflow/wf_host_control.c
index 563e96ea..66098cf9 100644
--- a/core/embed/projects/bootloader/workflow/wf_host_control.c
+++ b/core/embed/projects/bootloader/workflow/wf_host_control.c
@@ -55,6 +55,7 @@
workflow_result_t workflow_host_control(const vendor_header *const vhdr,
const image_header *const hdr,
+ secbool firmware_present,
c_layout_t *wait_layout,
uint32_t *ui_action_result,
protob_ios_t *ios) {
@@ -228,7 +229,7 @@ workflow_result_t workflow_host_control(const vendor_header *const vhdr,
switch (msg_id) {
case MessageType_MessageType_Initialize:
- workflow_initialize(active_iface, vhdr, hdr);
+ workflow_initialize(active_iface, vhdr, hdr, firmware_present);
// whatever the result, we stay here and continue
break;
case MessageType_MessageType_Ping:
@@ -236,7 +237,7 @@ workflow_result_t workflow_host_control(const vendor_header *const vhdr,
// whatever the result, we stay here and continue
break;
case MessageType_MessageType_GetFeatures:
- workflow_get_features(active_iface, vhdr, hdr);
+ workflow_get_features(active_iface, vhdr, hdr, firmware_present);
// whatever the result, we stay here and continue
break;
case MessageType_MessageType_WipeDevice:
diff --git a/core/embed/projects/bootloader/workflow/wf_initialize.c b/core/embed/projects/bootloader/workflow/wf_initialize.c
index c378cf1f..45a3bfe4 100644
--- a/core/embed/projects/bootloader/workflow/wf_initialize.c
+++ b/core/embed/projects/bootloader/workflow/wf_initialize.c
@@ -25,9 +25,10 @@
workflow_result_t workflow_initialize(protob_io_t *iface,
const vendor_header *const vhdr,
- const image_header *const hdr) {
+ const image_header *const hdr,
+ secbool firmware_present) {
Initialize msg_recv;
recv_msg_initialize(iface, &msg_recv);
- send_msg_features(iface, vhdr, hdr);
+ send_msg_features(iface, vhdr, hdr, firmware_present);
return WF_OK;
}
diff --git a/core/embed/projects/bootloader/workflow/workflow.h b/core/embed/projects/bootloader/workflow/workflow.h
index defe9d2d..65d28f38 100644
--- a/core/embed/projects/bootloader/workflow/workflow.h
+++ b/core/embed/projects/bootloader/workflow/workflow.h
@@ -53,15 +53,17 @@ workflow_result_t workflow_ping(protob_io_t *iface);
workflow_result_t workflow_initialize(protob_io_t *iface,
const vendor_header *const vhdr,
- const image_header *const hdr);
+ const image_header *const hdr,
+ secbool firmware_present);
workflow_result_t workflow_get_features(protob_io_t *iface,
const vendor_header *const vhdr,
- const image_header *const hdr);
+ const image_header *const hdr,
+ secbool firmware_present);
workflow_result_t workflow_menu(const vendor_header *const vhdr,
const image_header *const hdr,
- protob_ios_t *ios);
+ secbool firmware_present, protob_ios_t *ios);
workflow_result_t workflow_bootloader(const vendor_header *const vhdr,
const image_header *const hdr,
@@ -71,19 +73,23 @@ workflow_result_t workflow_empty_device(void);
workflow_result_t workflow_host_control(const vendor_header *const vhdr,
const image_header *const hdr,
+ secbool firmware_present,
c_layout_t *wait_layout,
uint32_t *ui_action_result,
protob_ios_t *ios);
workflow_result_t workflow_auto_update(const vendor_header *const vhdr,
- const image_header *const hdr);
+ const image_header *const hdr,
+ secbool firmware_present);
#ifdef USE_BLE
workflow_result_t workflow_ble_pairing_request(const vendor_header *const vhdr,
- const image_header *const hdr);
+ const image_header *const hdr,
+ secbool firmware_present);
workflow_result_t workflow_wireless_setup(const vendor_header *const vhdr,
const image_header *const hdr,
+ secbool firmware_present,
protob_ios_t *ios);
#endif
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index 070562cf..56a5aabd 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -2086,6 +2086,7 @@ if TYPE_CHECKING:
recovery_type: "RecoveryType | None"
optiga_sec: "int | None"
soc: "int | None"
+ firmware_corrupted: "bool | None"
def __init__(
self,
@@ -2142,6 +2143,7 @@ if TYPE_CHECKING:
recovery_type: "RecoveryType | None" = None,
optiga_sec: "int | None" = None,
soc: "int | None" = None,
+ firmware_corrupted: "bool | None" = None,
) -> None:
pass
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index 9dd387e5..0ca6b2b8 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -3239,6 +3239,7 @@ class Features(protobuf.MessageType):
53: protobuf.Field("recovery_type", "RecoveryType", repeated=False, required=False, default=None),
54: protobuf.Field("optiga_sec", "uint32", repeated=False, required=False, default=None),
55: protobuf.Field("soc", "uint32", repeated=False, required=False, default=None),
+ 56: protobuf.Field("firmware_corrupted", "bool", repeated=False, required=False, default=None),
}
def __init__(
@@ -3297,6 +3298,7 @@ class Features(protobuf.MessageType):
recovery_type: Optional["RecoveryType"] = None,
optiga_sec: Optional["int"] = None,
soc: Optional["int"] = None,
+ firmware_corrupted: Optional["bool"] = None,
) -> None:
self.capabilities: Sequence["Capability"] = capabilities if capabilities is not None else []
self.major_version = major_version
@@ -3351,6 +3353,7 @@ class Features(protobuf.MessageType):
self.recovery_type = recovery_type
self.optiga_sec = optiga_sec
self.soc = soc
+ self.firmware_corrupted = firmware_corrupted
class LockDevice(protobuf.MessageType):
diff --git a/rust/trezor-client/src/protos/generated/messages_management.rs b/rust/trezor-client/src/protos/generated/messages_management.rs
index 7ba465b6..3216c610 100644
--- a/rust/trezor-client/src/protos/generated/messages_management.rs
+++ b/rust/trezor-client/src/protos/generated/messages_management.rs
@@ -469,6 +469,8 @@ pub struct Features {
pub optiga_sec: ::std::option::Option<u32>,
// @@protoc_insertion_point(field:hw.trezor.messages.management.Features.soc)
pub soc: ::std::option::Option<u32>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.management.Features.firmware_corrupted)
+ pub firmware_corrupted: ::std::option::Option<bool>,
// special fields
// @@protoc_insertion_point(special_field:hw.trezor.messages.management.Features.special_fields)
pub special_fields: ::protobuf::SpecialFields,
@@ -1664,8 +1666,27 @@ impl Features {
self.soc = ::std::option::Option::Some(v);
}
+ // optional bool firmware_corrupted = 56;
+
+ pub fn firmware_corrupted(&self) -> bool {
+ self.firmware_corrupted.unwrap_or(false)
+ }
+
+ pub fn clear_firmware_corrupted(&mut self) {
+ self.firmware_corrupted = ::std::option::Option::None;
+ }
+
+ pub fn has_firmware_corrupted(&self) -> bool {
+ self.firmware_corrupted.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_firmware_corrupted(&mut self, v: bool) {
+ self.firmware_corrupted = ::std::option::Option::Some(v);
+ }
+
fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
- let mut fields = ::std::vec::Vec::with_capacity(53);
+ let mut fields = ::std::vec::Vec::with_capacity(54);
let mut oneofs = ::std::vec::Vec::with_capacity(0);
fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
"vendor",
@@ -1932,6 +1953,11 @@ impl Features {
|m: &Features| { &m.soc },
|m: &mut Features| { &mut m.soc },
));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "firmware_corrupted",
+ |m: &Features| { &m.firmware_corrupted },
+ |m: &mut Features| { &mut m.firmware_corrupted },
+ ));
::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Features>(
"Features",
fields,
@@ -2121,6 +2147,9 @@ impl ::protobuf::Message for Features {
440 => {
self.soc = ::std::option::Option::Some(is.read_uint32()?);
},
+ 448 => {
+ self.firmware_corrupted = ::std::option::Option::Some(is.read_bool()?);
+ },
tag => {
::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
},
@@ -2292,6 +2321,9 @@ impl ::protobuf::Message for Features {
if let Some(v) = self.soc {
my_size += ::protobuf::rt::uint32_size(55, v);
}
+ if let Some(v) = self.firmware_corrupted {
+ my_size += 2 + 1;
+ }
my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
self.special_fields.cached_size().set(my_size as u32);
my_size
@@ -2457,6 +2489,9 @@ impl ::protobuf::Message for Features {
if let Some(v) = self.soc {
os.write_uint32(55, v)?;
}
+ if let Some(v) = self.firmware_corrupted {
+ os.write_bool(56, v)?;
+ }
os.write_unknown_fields(self.special_fields.unknown_fields())?;
::std::result::Result::Ok(())
}
@@ -2527,6 +2562,7 @@ impl ::protobuf::Message for Features {
self.recovery_type = ::std::option::Option::None;
self.optiga_sec = ::std::option::Option::None;
self.soc = ::std::option::Option::None;
+ self.firmware_corrupted = ::std::option::Option::None;
self.special_fields.clear();
}
@@ -2585,6 +2621,7 @@ impl ::protobuf::Message for Features {
recovery_type: ::std::option::Option::None,
optiga_sec: ::std::option::Option::None,
soc: ::std::option::Option::None,
+ firmware_corrupted: ::std::option::Option::None,
special_fields: ::protobuf::SpecialFields::new(),
};
&instance
@@ -11759,7 +11796,7 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\roptions.proto\"\x80\x01\n\nInitialize\x12\x1d\n\nsession_id\x18\x01\
\x20\x01(\x0cR\tsessionId\x12,\n\x10_skip_passphrase\x18\x02\x20\x01(\
\x08R\x0eSkipPassphraseB\x02\x18\x01\x12%\n\x0ederive_cardano\x18\x03\
- \x20\x01(\x08R\rderiveCardano\"\r\n\x0bGetFeatures\"\xcc\x18\n\x08Featur\
+ \x20\x01(\x08R\rderiveCardano\"\r\n\x0bGetFeatures\"\xfb\x18\n\x08Featur\
es\x12\x16\n\x06vendor\x18\x01\x20\x01(\tR\x06vendor\x12#\n\rmajor_versi\
on\x18\x02\x20\x02(\rR\x0cmajorVersion\x12#\n\rminor_version\x18\x03\x20\
\x02(\rR\x0cminorVersion\x12#\n\rpatch_version\x18\x04\x20\x02(\rR\x0cpa\
@@ -11810,138 +11847,139 @@ static file_descriptor_proto_data: &'static [u8] = b"\
itPackaging\x12'\n\x0fhaptic_feedback\x184\x20\x01(\x08R\x0ehapticFeedba\
ck\x12P\n\rrecovery_type\x185\x20\x01(\x0e2+.hw.trezor.messages.manageme\
nt.RecoveryTypeR\x0crecoveryType\x12\x1d\n\noptiga_sec\x186\x20\x01(\rR\
- \toptigaSec\x12\x10\n\x03soc\x187\x20\x01(\rR\x03soc\"C\n\x12BackupAvail\
- ability\x12\x10\n\x0cNotAvailable\x10\0\x12\x0c\n\x08Required\x10\x01\
- \x12\r\n\tAvailable\x10\x02\"7\n\x0eRecoveryStatus\x12\x0b\n\x07Nothing\
- \x10\0\x12\x0c\n\x08Recovery\x10\x01\x12\n\n\x06Backup\x10\x02\"\xf6\x04\
- \n\nCapability\x12\x1c\n\x12Capability_Bitcoin\x10\x01\x1a\x04\x80\xa6\
- \x1d\x01\x12\x1b\n\x17Capability_Bitcoin_like\x10\x02\x12\x16\n\x12Capab\
- ility_Binance\x10\x03\x12\x16\n\x12Capability_Cardano\x10\x04\x12\x1b\n\
- \x11Capability_Crypto\x10\x05\x1a\x04\x80\xa6\x1d\x01\x12\x12\n\x0eCapab\
- ility_EOS\x10\x06\x12\x17\n\x13Capability_Ethereum\x10\x07\x12\x17\n\x0f\
- Capability_Lisk\x10\x08\x1a\x02\x08\x01\x12\x15\n\x11Capability_Monero\
- \x10\t\x12\x12\n\x0eCapability_NEM\x10\n\x12\x15\n\x11Capability_Ripple\
- \x10\x0b\x12\x16\n\x12Capability_Stellar\x10\x0c\x12\x14\n\x10Capability\
- _Tezos\x10\r\x12\x12\n\x0eCapability_U2F\x10\x0e\x12\x1b\n\x11Capability\
- _Shamir\x10\x0f\x1a\x04\x80\xa6\x1d\x01\x12!\n\x17Capability_ShamirGroup\
- s\x10\x10\x1a\x04\x80\xa6\x1d\x01\x12$\n\x1aCapability_PassphraseEntry\
- \x10\x11\x1a\x04\x80\xa6\x1d\x01\x12\x15\n\x11Capability_Solana\x10\x12\
- \x12!\n\x17Capability_Translations\x10\x13\x1a\x04\x80\xa6\x1d\x01\x12\
- \x1f\n\x15Capability_Brightness\x10\x14\x1a\x04\x80\xa6\x1d\x01\x12\x1b\
- \n\x11Capability_Haptic\x10\x15\x1a\x04\x80\xa6\x1d\x01\x12\x18\n\x0eCap\
- ability_BLE\x10\x16\x1a\x04\x80\xa6\x1d\x01\x12\x18\n\x0eCapability_NFC\
- \x10\x17\x1a\x04\x80\xa6\x1d\x01\x1a\x04\xc8\xf3\x18\x01\"\x0c\n\nLockDe\
- vice\"&\n\x07SetBusy\x12\x1b\n\texpiry_ms\x18\x01\x20\x01(\rR\x08expiryM\
- s\"\x0c\n\nEndSession\"\xdd\x05\n\rApplySettings\x12\x1e\n\x08language\
- \x18\x01\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x02\
- \x20\x01(\tR\x05label\x12%\n\x0euse_passphrase\x18\x03\x20\x01(\x08R\rus\
- ePassphrase\x12\x1e\n\nhomescreen\x18\x04\x20\x01(\x0cR\nhomescreen\x120\
- \n\x12_passphrase_source\x18\x05\x20\x01(\rR\x10PassphraseSourceB\x02\
- \x18\x01\x12+\n\x12auto_lock_delay_ms\x18\x06\x20\x01(\rR\x0fautoLockDel\
- ayMs\x12Y\n\x10display_rotation\x18\x07\x20\x01(\x0e2..hw.trezor.message\
- s.management.DisplayRotationR\x0fdisplayRotation\x12=\n\x1bpassphrase_al\
- ways_on_device\x18\x08\x20\x01(\x08R\x18passphraseAlwaysOnDevice\x12T\n\
- \rsafety_checks\x18\t\x20\x01(\x0e2/.hw.trezor.messages.management.Safet\
- yCheckLevelR\x0csafetyChecks\x123\n\x15experimental_features\x18\n\x20\
- \x01(\x08R\x14experimentalFeatures\x129\n\x19hide_passphrase_from_host\
- \x18\x0b\x20\x01(\x08R\x16hidePassphraseFromHost\x12'\n\x0fhaptic_feedba\
- ck\x18\r\x20\x01(\x08R\x0ehapticFeedback\x12+\n\x11homescreen_length\x18\
- \x0e\x20\x01(\rR\x10homescreenLength\x12:\n\x1aauto_lock_delay_battery_m\
- s\x18\x0f\x20\x01(\rR\x16autoLockDelayBatteryMs\"T\n\x0eChangeLanguage\
- \x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\x12!\n\x0cshow\
- _display\x18\x02\x20\x01(\x08R\x0bshowDisplay\"T\n\x10DataChunkRequest\
- \x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\x12\x1f\n\x0bd\
- ata_offset\x18\x02\x20\x02(\rR\ndataOffset\"-\n\x0cDataChunkAck\x12\x1d\
- \n\ndata_chunk\x18\x01\x20\x02(\x0cR\tdataChunk\"\"\n\nApplyFlags\x12\
- \x14\n\x05flags\x18\x01\x20\x02(\rR\x05flags\"#\n\tChangePin\x12\x16\n\
- \x06remove\x18\x01\x20\x01(\x08R\x06remove\"(\n\x0eChangeWipeCode\x12\
- \x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\"\xaa\x01\n\tSdProtect\
- \x12]\n\toperation\x18\x01\x20\x02(\x0e2?.hw.trezor.messages.management.\
- SdProtect.SdProtectOperationTypeR\toperation\">\n\x16SdProtectOperationT\
- ype\x12\x0b\n\x07DISABLE\x10\0\x12\n\n\x06ENABLE\x10\x01\x12\x0b\n\x07RE\
- FRESH\x10\x02\"O\n\x04Ping\x12\x1a\n\x07message\x18\x01\x20\x01(\t:\0R\
- \x07message\x12+\n\x11button_protection\x18\x02\x20\x01(\x08R\x10buttonP\
- rotection\"\x08\n\x06Cancel\"\x20\n\nGetEntropy\x12\x12\n\x04size\x18\
- \x01\x20\x02(\rR\x04size\"#\n\x07Entropy\x12\x18\n\x07entropy\x18\x01\
- \x20\x02(\x0cR\x07entropy\"/\n\x0fGetFirmwareHash\x12\x1c\n\tchallenge\
- \x18\x01\x20\x01(\x0cR\tchallenge\"\"\n\x0cFirmwareHash\x12\x12\n\x04has\
- h\x18\x01\x20\x02(\x0cR\x04hash\"2\n\x12AuthenticateDevice\x12\x1c\n\tch\
- allenge\x18\x01\x20\x02(\x0cR\tchallenge\"\xcb\x01\n\x11AuthenticityProo\
- f\x12/\n\x13optiga_certificates\x18\x01\x20\x03(\x0cR\x12optigaCertifica\
- tes\x12)\n\x10optiga_signature\x18\x02\x20\x02(\x0cR\x0foptigaSignature\
- \x12/\n\x13tropic_certificates\x18\x03\x20\x03(\x0cR\x12tropicCertificat\
- es\x12)\n\x10tropic_signature\x18\x04\x20\x01(\x0cR\x0ftropicSignature\"\
- \x0c\n\nWipeDevice\"\xad\x02\n\nLoadDevice\x12\x1c\n\tmnemonics\x18\x01\
- \x20\x03(\tR\tmnemonics\x12\x10\n\x03pin\x18\x03\x20\x01(\tR\x03pin\x123\
- \n\x15passphrase_protection\x18\x04\x20\x01(\x08R\x14passphraseProtectio\
- n\x12\x1e\n\x08language\x18\x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\
- \x14\n\x05label\x18\x06\x20\x01(\tR\x05label\x12#\n\rskip_checksum\x18\
- \x07\x20\x01(\x08R\x0cskipChecksum\x12\x1f\n\x0bu2f_counter\x18\x08\x20\
- \x01(\rR\nu2fCounter\x12!\n\x0cneeds_backup\x18\t\x20\x01(\x08R\x0bneeds\
- Backup\x12\x1b\n\tno_backup\x18\n\x20\x01(\x08R\x08noBackup\"\x9d\x03\n\
- \x0bResetDevice\x12\x1f\n\x08strength\x18\x02\x20\x01(\r:\x03256R\x08str\
- ength\x123\n\x15passphrase_protection\x18\x03\x20\x01(\x08R\x14passphras\
- eProtection\x12%\n\x0epin_protection\x18\x04\x20\x01(\x08R\rpinProtectio\
- n\x12\x1e\n\x08language\x18\x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\
- \x14\n\x05label\x18\x06\x20\x01(\tR\x05label\x12\x1f\n\x0bu2f_counter\
- \x18\x07\x20\x01(\rR\nu2fCounter\x12\x1f\n\x0bskip_backup\x18\x08\x20\
- \x01(\x08R\nskipBackup\x12\x1b\n\tno_backup\x18\t\x20\x01(\x08R\x08noBac\
- kup\x12Q\n\x0bbackup_type\x18\n\x20\x01(\x0e2).hw.trezor.messages.manage\
- ment.BackupType:\x05Bip39R\nbackupType\x12#\n\rentropy_check\x18\x0b\x20\
- \x01(\x08R\x0centropyCheckJ\x04\x08\x01\x10\x02\"\xe5\x01\n\x0cBackupDev\
- ice\x12'\n\x0fgroup_threshold\x18\x01\x20\x01(\rR\x0egroupThreshold\x12O\
- \n\x06groups\x18\x02\x20\x03(\x0b27.hw.trezor.messages.management.Backup\
- Device.Slip39GroupR\x06groups\x1a[\n\x0bSlip39Group\x12)\n\x10member_thr\
- eshold\x18\x01\x20\x02(\rR\x0fmemberThreshold\x12!\n\x0cmember_count\x18\
- \x02\x20\x02(\rR\x0bmemberCount\"b\n\x0eEntropyRequest\x12-\n\x12entropy\
- _commitment\x18\x01\x20\x01(\x0cR\x11entropyCommitment\x12!\n\x0cprev_en\
- tropy\x18\x02\x20\x01(\x0cR\x0bprevEntropy\"&\n\nEntropyAck\x12\x18\n\
- \x07entropy\x18\x01\x20\x02(\x0cR\x07entropy\"\x13\n\x11EntropyCheckRead\
- y\"5\n\x14EntropyCheckContinue\x12\x1d\n\x06finish\x18\x01\x20\x01(\x08:\
- \x05falseR\x06finish\"\x8d\x04\n\x0eRecoveryDevice\x12\x1d\n\nword_count\
- \x18\x01\x20\x01(\rR\twordCount\x123\n\x15passphrase_protection\x18\x02\
- \x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin_protection\x18\x03\
- \x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\x18\x04\x20\x01(\tR\
- \x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x05\x20\x01(\tR\x05labe\
- l\x12)\n\x10enforce_wordlist\x18\x06\x20\x01(\x08R\x0fenforceWordlist\
- \x12j\n\x0cinput_method\x18\x08\x20\x01(\x0e2G.hw.trezor.messages.manage\
- ment.RecoveryDevice.RecoveryDeviceInputMethodR\x0binputMethod\x12\x1f\n\
- \x0bu2f_counter\x18\t\x20\x01(\rR\nu2fCounter\x12O\n\x04type\x18\n\x20\
- \x01(\x0e2+.hw.trezor.messages.management.RecoveryType:\x0eNormalRecover\
- yR\x04type\";\n\x19RecoveryDeviceInputMethod\x12\x12\n\x0eScrambledWords\
- \x10\0\x12\n\n\x06Matrix\x10\x01J\x04\x08\x07\x10\x08\"\xc5\x01\n\x0bWor\
- dRequest\x12N\n\x04type\x18\x01\x20\x02(\x0e2:.hw.trezor.messages.manage\
- ment.WordRequest.WordRequestTypeR\x04type\"f\n\x0fWordRequestType\x12\
- \x19\n\x15WordRequestType_Plain\x10\0\x12\x1b\n\x17WordRequestType_Matri\
- x9\x10\x01\x12\x1b\n\x17WordRequestType_Matrix6\x10\x02\"\x1d\n\x07WordA\
- ck\x12\x12\n\x04word\x18\x01\x20\x02(\tR\x04word\"0\n\rSetU2FCounter\x12\
- \x1f\n\x0bu2f_counter\x18\x01\x20\x02(\rR\nu2fCounter\"\x13\n\x11GetNext\
- U2FCounter\"1\n\x0eNextU2FCounter\x12\x1f\n\x0bu2f_counter\x18\x01\x20\
- \x02(\rR\nu2fCounter\"\x11\n\x0fDoPreauthorized\"\x16\n\x14Preauthorized\
- Request\"\x15\n\x13CancelAuthorization\"\x9a\x02\n\x12RebootToBootloader\
- \x12o\n\x0cboot_command\x18\x01\x20\x01(\x0e2=.hw.trezor.messages.manage\
- ment.RebootToBootloader.BootCommand:\rSTOP_AND_WAITR\x0bbootCommand\x12'\
- \n\x0ffirmware_header\x18\x02\x20\x01(\x0cR\x0efirmwareHeader\x123\n\x14\
- language_data_length\x18\x03\x20\x01(\r:\x010R\x12languageDataLength\"5\
- \n\x0bBootCommand\x12\x11\n\rSTOP_AND_WAIT\x10\0\x12\x13\n\x0fINSTALL_UP\
- GRADE\x10\x01\"\x10\n\x08GetNonce:\x04\x88\xb2\x19\x01\"#\n\x05Nonce\x12\
- \x14\n\x05nonce\x18\x01\x20\x02(\x0cR\x05nonce:\x04\x88\xb2\x19\x01\";\n\
- \nUnlockPath\x12\x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12\
- \x10\n\x03mac\x18\x02\x20\x01(\x0cR\x03mac\"'\n\x13UnlockedPathRequest\
- \x12\x10\n\x03mac\x18\x01\x20\x02(\x0cR\x03mac\"\x14\n\x12ShowDeviceTuto\
- rial\"\x12\n\x10UnlockBootloader\"%\n\rSetBrightness\x12\x14\n\x05value\
- \x18\x01\x20\x01(\rR\x05value*\x99\x01\n\nBackupType\x12\t\n\x05Bip39\
- \x10\0\x12\x10\n\x0cSlip39_Basic\x10\x01\x12\x13\n\x0fSlip39_Advanced\
- \x10\x02\x12\x1c\n\x18Slip39_Single_Extendable\x10\x03\x12\x1b\n\x17Slip\
- 39_Basic_Extendable\x10\x04\x12\x1e\n\x1aSlip39_Advanced_Extendable\x10\
- \x05*G\n\x10SafetyCheckLevel\x12\n\n\x06Strict\x10\0\x12\x10\n\x0cPrompt\
- Always\x10\x01\x12\x15\n\x11PromptTemporarily\x10\x02*=\n\x0fDisplayRota\
- tion\x12\t\n\x05North\x10\0\x12\x08\n\x04East\x10Z\x12\n\n\x05South\x10\
- \xb4\x01\x12\t\n\x04West\x10\x8e\x02*0\n\x10HomescreenFormat\x12\x08\n\
- \x04Toif\x10\x01\x12\x08\n\x04Jpeg\x10\x02\x12\x08\n\x04ToiG\x10\x03*H\n\
- \x0cRecoveryType\x12\x12\n\x0eNormalRecovery\x10\0\x12\n\n\x06DryRun\x10\
- \x01\x12\x18\n\x14UnlockRepeatedBackup\x10\x02BB\n#com.satoshilabs.trezo\
- r.lib.protobufB\x17TrezorMessageManagement\x80\xa6\x1d\x01\
+ \toptigaSec\x12\x10\n\x03soc\x187\x20\x01(\rR\x03soc\x12-\n\x12firmware_\
+ corrupted\x188\x20\x01(\x08R\x11firmwareCorrupted\"C\n\x12BackupAvailabi\
+ lity\x12\x10\n\x0cNotAvailable\x10\0\x12\x0c\n\x08Required\x10\x01\x12\r\
+ \n\tAvailable\x10\x02\"7\n\x0eRecoveryStatus\x12\x0b\n\x07Nothing\x10\0\
+ \x12\x0c\n\x08Recovery\x10\x01\x12\n\n\x06Backup\x10\x02\"\xf6\x04\n\nCa\
+ pability\x12\x1c\n\x12Capability_Bitcoin\x10\x01\x1a\x04\x80\xa6\x1d\x01\
+ \x12\x1b\n\x17Capability_Bitcoin_like\x10\x02\x12\x16\n\x12Capability_Bi\
+ nance\x10\x03\x12\x16\n\x12Capability_Cardano\x10\x04\x12\x1b\n\x11Capab\
+ ility_Crypto\x10\x05\x1a\x04\x80\xa6\x1d\x01\x12\x12\n\x0eCapability_EOS\
+ \x10\x06\x12\x17\n\x13Capability_Ethereum\x10\x07\x12\x17\n\x0fCapabilit\
+ y_Lisk\x10\x08\x1a\x02\x08\x01\x12\x15\n\x11Capability_Monero\x10\t\x12\
+ \x12\n\x0eCapability_NEM\x10\n\x12\x15\n\x11Capability_Ripple\x10\x0b\
+ \x12\x16\n\x12Capability_Stellar\x10\x0c\x12\x14\n\x10Capability_Tezos\
+ \x10\r\x12\x12\n\x0eCapability_U2F\x10\x0e\x12\x1b\n\x11Capability_Shami\
+ r\x10\x0f\x1a\x04\x80\xa6\x1d\x01\x12!\n\x17Capability_ShamirGroups\x10\
+ \x10\x1a\x04\x80\xa6\x1d\x01\x12$\n\x1aCapability_PassphraseEntry\x10\
+ \x11\x1a\x04\x80\xa6\x1d\x01\x12\x15\n\x11Capability_Solana\x10\x12\x12!\
+ \n\x17Capability_Translations\x10\x13\x1a\x04\x80\xa6\x1d\x01\x12\x1f\n\
+ \x15Capability_Brightness\x10\x14\x1a\x04\x80\xa6\x1d\x01\x12\x1b\n\x11C\
+ apability_Haptic\x10\x15\x1a\x04\x80\xa6\x1d\x01\x12\x18\n\x0eCapability\
+ _BLE\x10\x16\x1a\x04\x80\xa6\x1d\x01\x12\x18\n\x0eCapability_NFC\x10\x17\
+ \x1a\x04\x80\xa6\x1d\x01\x1a\x04\xc8\xf3\x18\x01\"\x0c\n\nLockDevice\"&\
+ \n\x07SetBusy\x12\x1b\n\texpiry_ms\x18\x01\x20\x01(\rR\x08expiryMs\"\x0c\
+ \n\nEndSession\"\xdd\x05\n\rApplySettings\x12\x1e\n\x08language\x18\x01\
+ \x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x02\x20\x01\
+ (\tR\x05label\x12%\n\x0euse_passphrase\x18\x03\x20\x01(\x08R\rusePassphr\
+ ase\x12\x1e\n\nhomescreen\x18\x04\x20\x01(\x0cR\nhomescreen\x120\n\x12_p\
+ assphrase_source\x18\x05\x20\x01(\rR\x10PassphraseSourceB\x02\x18\x01\
+ \x12+\n\x12auto_lock_delay_ms\x18\x06\x20\x01(\rR\x0fautoLockDelayMs\x12\
+ Y\n\x10display_rotation\x18\x07\x20\x01(\x0e2..hw.trezor.messages.manage\
+ ment.DisplayRotationR\x0fdisplayRotation\x12=\n\x1bpassphrase_always_on_\
+ device\x18\x08\x20\x01(\x08R\x18passphraseAlwaysOnDevice\x12T\n\rsafety_\
+ checks\x18\t\x20\x01(\x0e2/.hw.trezor.messages.management.SafetyCheckLev\
+ elR\x0csafetyChecks\x123\n\x15experimental_features\x18\n\x20\x01(\x08R\
+ \x14experimentalFeatures\x129\n\x19hide_passphrase_from_host\x18\x0b\x20\
+ \x01(\x08R\x16hidePassphraseFromHost\x12'\n\x0fhaptic_feedback\x18\r\x20\
+ \x01(\x08R\x0ehapticFeedback\x12+\n\x11homescreen_length\x18\x0e\x20\x01\
+ (\rR\x10homescreenLength\x12:\n\x1aauto_lock_delay_battery_ms\x18\x0f\
+ \x20\x01(\rR\x16autoLockDelayBatteryMs\"T\n\x0eChangeLanguage\x12\x1f\n\
+ \x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\x12!\n\x0cshow_display\
+ \x18\x02\x20\x01(\x08R\x0bshowDisplay\"T\n\x10DataChunkRequest\x12\x1f\n\
+ \x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\x12\x1f\n\x0bdata_offset\
+ \x18\x02\x20\x02(\rR\ndataOffset\"-\n\x0cDataChunkAck\x12\x1d\n\ndata_ch\
+ unk\x18\x01\x20\x02(\x0cR\tdataChunk\"\"\n\nApplyFlags\x12\x14\n\x05flag\
+ s\x18\x01\x20\x02(\rR\x05flags\"#\n\tChangePin\x12\x16\n\x06remove\x18\
+ \x01\x20\x01(\x08R\x06remove\"(\n\x0eChangeWipeCode\x12\x16\n\x06remove\
+ \x18\x01\x20\x01(\x08R\x06remove\"\xaa\x01\n\tSdProtect\x12]\n\toperatio\
+ n\x18\x01\x20\x02(\x0e2?.hw.trezor.messages.management.SdProtect.SdProte\
+ ctOperationTypeR\toperation\">\n\x16SdProtectOperationType\x12\x0b\n\x07\
+ DISABLE\x10\0\x12\n\n\x06ENABLE\x10\x01\x12\x0b\n\x07REFRESH\x10\x02\"O\
+ \n\x04Ping\x12\x1a\n\x07message\x18\x01\x20\x01(\t:\0R\x07message\x12+\n\
+ \x11button_protection\x18\x02\x20\x01(\x08R\x10buttonProtection\"\x08\n\
+ \x06Cancel\"\x20\n\nGetEntropy\x12\x12\n\x04size\x18\x01\x20\x02(\rR\x04\
+ size\"#\n\x07Entropy\x12\x18\n\x07entropy\x18\x01\x20\x02(\x0cR\x07entro\
+ py\"/\n\x0fGetFirmwareHash\x12\x1c\n\tchallenge\x18\x01\x20\x01(\x0cR\tc\
+ hallenge\"\"\n\x0cFirmwareHash\x12\x12\n\x04hash\x18\x01\x20\x02(\x0cR\
+ \x04hash\"2\n\x12AuthenticateDevice\x12\x1c\n\tchallenge\x18\x01\x20\x02\
+ (\x0cR\tchallenge\"\xcb\x01\n\x11AuthenticityProof\x12/\n\x13optiga_cert\
+ ificates\x18\x01\x20\x03(\x0cR\x12optigaCertificates\x12)\n\x10optiga_si\
+ gnature\x18\x02\x20\x02(\x0cR\x0foptigaSignature\x12/\n\x13tropic_certif\
+ icates\x18\x03\x20\x03(\x0cR\x12tropicCertificates\x12)\n\x10tropic_sign\
+ ature\x18\x04\x20\x01(\x0cR\x0ftropicSignature\"\x0c\n\nWipeDevice\"\xad\
+ \x02\n\nLoadDevice\x12\x1c\n\tmnemonics\x18\x01\x20\x03(\tR\tmnemonics\
+ \x12\x10\n\x03pin\x18\x03\x20\x01(\tR\x03pin\x123\n\x15passphrase_protec\
+ tion\x18\x04\x20\x01(\x08R\x14passphraseProtection\x12\x1e\n\x08language\
+ \x18\x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x06\
+ \x20\x01(\tR\x05label\x12#\n\rskip_checksum\x18\x07\x20\x01(\x08R\x0cski\
+ pChecksum\x12\x1f\n\x0bu2f_counter\x18\x08\x20\x01(\rR\nu2fCounter\x12!\
+ \n\x0cneeds_backup\x18\t\x20\x01(\x08R\x0bneedsBackup\x12\x1b\n\tno_back\
+ up\x18\n\x20\x01(\x08R\x08noBackup\"\x9d\x03\n\x0bResetDevice\x12\x1f\n\
+ \x08strength\x18\x02\x20\x01(\r:\x03256R\x08strength\x123\n\x15passphras\
+ e_protection\x18\x03\x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin\
+ _protection\x18\x04\x20\x01(\x08R\rpinProtection\x12\x1e\n\x08language\
+ \x18\x05\x20\x01(\tR\x08languageB\x02\x18\x01\x12\x14\n\x05label\x18\x06\
+ \x20\x01(\tR\x05label\x12\x1f\n\x0bu2f_counter\x18\x07\x20\x01(\rR\nu2fC\
+ ounter\x12\x1f\n\x0bskip_backup\x18\x08\x20\x01(\x08R\nskipBackup\x12\
+ \x1b\n\tno_backup\x18\t\x20\x01(\x08R\x08noBackup\x12Q\n\x0bbackup_type\
+ \x18\n\x20\x01(\x0e2).hw.trezor.messages.management.BackupType:\x05Bip39\
+ R\nbackupType\x12#\n\rentropy_check\x18\x0b\x20\x01(\x08R\x0centropyChec\
+ kJ\x04\x08\x01\x10\x02\"\xe5\x01\n\x0cBackupDevice\x12'\n\x0fgroup_thres\
+ hold\x18\x01\x20\x01(\rR\x0egroupThreshold\x12O\n\x06groups\x18\x02\x20\
+ \x03(\x0b27.hw.trezor.messages.management.BackupDevice.Slip39GroupR\x06g\
+ roups\x1a[\n\x0bSlip39Group\x12)\n\x10member_threshold\x18\x01\x20\x02(\
+ \rR\x0fmemberThreshold\x12!\n\x0cmember_count\x18\x02\x20\x02(\rR\x0bmem\
+ berCount\"b\n\x0eEntropyRequest\x12-\n\x12entropy_commitment\x18\x01\x20\
+ \x01(\x0cR\x11entropyCommitment\x12!\n\x0cprev_entropy\x18\x02\x20\x01(\
+ \x0cR\x0bprevEntropy\"&\n\nEntropyAck\x12\x18\n\x07entropy\x18\x01\x20\
+ \x02(\x0cR\x07entropy\"\x13\n\x11EntropyCheckReady\"5\n\x14EntropyCheckC\
+ ontinue\x12\x1d\n\x06finish\x18\x01\x20\x01(\x08:\x05falseR\x06finish\"\
+ \x8d\x04\n\x0eRecoveryDevice\x12\x1d\n\nword_count\x18\x01\x20\x01(\rR\t\
+ wordCount\x123\n\x15passphrase_protection\x18\x02\x20\x01(\x08R\x14passp\
+ hraseProtection\x12%\n\x0epin_protection\x18\x03\x20\x01(\x08R\rpinProte\
+ ction\x12\x1e\n\x08language\x18\x04\x20\x01(\tR\x08languageB\x02\x18\x01\
+ \x12\x14\n\x05label\x18\x05\x20\x01(\tR\x05label\x12)\n\x10enforce_wordl\
+ ist\x18\x06\x20\x01(\x08R\x0fenforceWordlist\x12j\n\x0cinput_method\x18\
+ \x08\x20\x01(\x0e2G.hw.trezor.messages.management.RecoveryDevice.Recover\
+ yDeviceInputMethodR\x0binputMethod\x12\x1f\n\x0bu2f_counter\x18\t\x20\
+ \x01(\rR\nu2fCounter\x12O\n\x04type\x18\n\x20\x01(\x0e2+.hw.trezor.messa\
+ ges.management.RecoveryType:\x0eNormalRecoveryR\x04type\";\n\x19Recovery\
+ DeviceInputMethod\x12\x12\n\x0eScrambledWords\x10\0\x12\n\n\x06Matrix\
+ \x10\x01J\x04\x08\x07\x10\x08\"\xc5\x01\n\x0bWordRequest\x12N\n\x04type\
+ \x18\x01\x20\x02(\x0e2:.hw.trezor.messages.management.WordRequest.WordRe\
+ questTypeR\x04type\"f\n\x0fWordRequestType\x12\x19\n\x15WordRequestType_\
+ Plain\x10\0\x12\x1b\n\x17WordRequestType_Matrix9\x10\x01\x12\x1b\n\x17Wo\
+ rdRequestType_Matrix6\x10\x02\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\
+ \x01\x20\x02(\tR\x04word\"0\n\rSetU2FCounter\x12\x1f\n\x0bu2f_counter\
+ \x18\x01\x20\x02(\rR\nu2fCounter\"\x13\n\x11GetNextU2FCounter\"1\n\x0eNe\
+ xtU2FCounter\x12\x1f\n\x0bu2f_counter\x18\x01\x20\x02(\rR\nu2fCounter\"\
+ \x11\n\x0fDoPreauthorized\"\x16\n\x14PreauthorizedRequest\"\x15\n\x13Can\
+ celAuthorization\"\x9a\x02\n\x12RebootToBootloader\x12o\n\x0cboot_comman\
+ d\x18\x01\x20\x01(\x0e2=.hw.trezor.messages.management.RebootToBootloade\
+ r.BootCommand:\rSTOP_AND_WAITR\x0bbootCommand\x12'\n\x0ffirmware_header\
+ \x18\x02\x20\x01(\x0cR\x0efirmwareHeader\x123\n\x14language_data_length\
+ \x18\x03\x20\x01(\r:\x010R\x12languageDataLength\"5\n\x0bBootCommand\x12\
+ \x11\n\rSTOP_AND_WAIT\x10\0\x12\x13\n\x0fINSTALL_UPGRADE\x10\x01\"\x10\n\
+ \x08GetNonce:\x04\x88\xb2\x19\x01\"#\n\x05Nonce\x12\x14\n\x05nonce\x18\
+ \x01\x20\x02(\x0cR\x05nonce:\x04\x88\xb2\x19\x01\";\n\nUnlockPath\x12\
+ \x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12\x10\n\x03mac\x18\
+ \x02\x20\x01(\x0cR\x03mac\"'\n\x13UnlockedPathRequest\x12\x10\n\x03mac\
+ \x18\x01\x20\x02(\x0cR\x03mac\"\x14\n\x12ShowDeviceTutorial\"\x12\n\x10U\
+ nlockBootloader\"%\n\rSetBrightness\x12\x14\n\x05value\x18\x01\x20\x01(\
+ \rR\x05value*\x99\x01\n\nBackupType\x12\t\n\x05Bip39\x10\0\x12\x10\n\x0c\
+ Slip39_Basic\x10\x01\x12\x13\n\x0fSlip39_Advanced\x10\x02\x12\x1c\n\x18S\
+ lip39_Single_Extendable\x10\x03\x12\x1b\n\x17Slip39_Basic_Extendable\x10\
+ \x04\x12\x1e\n\x1aSlip39_Advanced_Extendable\x10\x05*G\n\x10SafetyCheckL\
+ evel\x12\n\n\x06Strict\x10\0\x12\x10\n\x0cPromptAlways\x10\x01\x12\x15\n\
+ \x11PromptTemporarily\x10\x02*=\n\x0fDisplayRotation\x12\t\n\x05North\
+ \x10\0\x12\x08\n\x04East\x10Z\x12\n\n\x05South\x10\xb4\x01\x12\t\n\x04We\
+ st\x10\x8e\x02*0\n\x10HomescreenFormat\x12\x08\n\x04Toif\x10\x01\x12\x08\
+ \n\x04Jpeg\x10\x02\x12\x08\n\x04ToiG\x10\x03*H\n\x0cRecoveryType\x12\x12\
+ \n\x0eNormalRecovery\x10\0\x12\n\n\x06DryRun\x10\x01\x12\x18\n\x14Unlock\
+ RepeatedBackup\x10\x02BB\n#com.satoshilabs.trezor.lib.protobufB\x17Trezo\
+ rMessageManagement\x80\xa6\x1d\x01\
";
/// `FileDescriptorProto` object which was a source for this generated file
Why this scored 19/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.