feat(core/bootloader): add battery SoC to features messages
What changed, and why it matters
This commit adds a new 'battery state of charge' (SoC) field to the device's Features message, which is the information a Trezor reports about itself when asked. It is a straightforward feature addition: the bootloader now reads the battery level from the power manager and includes it in the device description sent to connected computers and phones. There is no indication this change fixes or introduces a security vulnerability.
No security action required. Treat as a normal feature commit. If reviewing for completeness, verify that pm_get_state() returns a sanitized 0-100 value and that host clients handle the optional field gracefully.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change extends the protobuf Features message with an optional uint32 soc field (tag 55) across the common proto definition, bootloader-specific proto, Python bindings, and Rust generated code. In core/embed/projects/bootloader/protob/protob.c, send_msg_features() conditionally calls pm_get_state() under USE_POWER_MANAGER and assigns state.soc to the new field. The field is optional, defaults to absent, and is only populated when the power manager returns PM_OK. No bounds checking beyond protobuf uint32 serialization is present, but the value is treated as informational only.
Changed components
common/protob/messages-management.protocore/embed/projects/bootloader/protob/pb/messages.pb.hcore/embed/projects/bootloader/protob/pb/messages.protocore/embed/projects/bootloader/protob/protob.ccore/src/trezor/messages.pypython/src/trezorlib/messages.pyrust/trezor-client/src/protos/generated/messages_management.rsInspect captured patch +194 / −133
diff --git a/common/protob/messages-management.proto b/common/protob/messages-management.proto
index 62959d0b..cea95111 100644
--- a/common/protob/messages-management.proto
+++ b/common/protob/messages-management.proto
@@ -126,6 +126,7 @@ message Features {
optional bool haptic_feedback = 52; // haptic feedback is enabled
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%)
enum BackupAvailability {
/// Device is already backed up, or a previous backup has failed.
diff --git a/core/embed/projects/bootloader/protob/pb/messages.pb.h b/core/embed/projects/bootloader/protob/pb/messages.pb.h
index 204c3f57..f1e74a1a 100644
--- a/core/embed/projects/bootloader/protob/pb/messages.pb.h
+++ b/core/embed/projects/bootloader/protob/pb/messages.pb.h
@@ -112,6 +112,8 @@ typedef struct _Features {
bool bootloader_locked;
bool has_unit_packaging;
uint32_t unit_packaging;
+ bool has_soc;
+ uint32_t soc;
} Features;
typedef struct _FirmwareErase {
@@ -177,7 +179,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}
+#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 Ping_init_zero {false, ""}
#define Success_init_zero {false, ""}
#define Failure_init_zero {false, _FailureType_MIN, false, ""}
@@ -213,6 +215,7 @@ extern "C" {
#define Features_unit_btconly_tag 46
#define Features_bootloader_locked_tag 49
#define Features_unit_packaging_tag 51
+#define Features_soc_tag 55
#define FirmwareErase_length_tag 1
#define FirmwareRequest_offset_tag 1
#define FirmwareRequest_length_tag 2
@@ -258,7 +261,8 @@ X(a, STATIC, OPTIONAL, STRING, internal_model, 44) \
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, unit_packaging, 51) \
+X(a, STATIC, OPTIONAL, UINT32, soc, 55)
#define Features_CALLBACK NULL
#define Features_DEFAULT NULL
@@ -344,7 +348,7 @@ extern const pb_msgdesc_t UnlockBootloader_msg;
#define ButtonAck_size 0
#define ButtonRequest_size 2
#define Failure_size 260
-#define Features_size 497
+#define Features_size 504
#define FirmwareErase_size 6
#define FirmwareRequest_size 12
#define GetFeatures_size 0
diff --git a/core/embed/projects/bootloader/protob/pb/messages.proto b/core/embed/projects/bootloader/protob/pb/messages.proto
index 159bc6dd..085f84ba 100644
--- a/core/embed/projects/bootloader/protob/pb/messages.proto
+++ b/core/embed/projects/bootloader/protob/pb/messages.proto
@@ -72,6 +72,7 @@ message Features {
optional bool unit_btconly = 46; // unit/device is intended as bitcoin only
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%)
}
/**
diff --git a/core/embed/projects/bootloader/protob/protob.c b/core/embed/projects/bootloader/protob/protob.c
index 82bee82a..eb336740 100644
--- a/core/embed/projects/bootloader/protob/protob.c
+++ b/core/embed/projects/bootloader/protob/protob.c
@@ -30,6 +30,10 @@
#include <sec/secret.h>
#endif
+#ifdef USE_POWER_MANAGER
+#include <sys/power_manager.h>
+#endif
+
#include "memzero.h"
#include "pb/messages.pb.h"
#include "protob.h"
@@ -134,6 +138,14 @@ secbool send_msg_features(protob_io_t *iface, const vendor_header *const vhdr,
MSG_SEND_ASSIGN_VALUE(bootloader_locked,
(secret_bootloader_locked() == sectrue));
#endif
+
+#ifdef USE_POWER_MANAGER
+ pm_state_t state = {0};
+ if (PM_OK == pm_get_state(&state)) {
+ MSG_SEND_ASSIGN_VALUE(soc, state.soc);
+ }
+#endif
+
return MSG_SEND(Features);
}
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index f5dbc194..efda21c4 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -2082,6 +2082,7 @@ if TYPE_CHECKING:
haptic_feedback: "bool | None"
recovery_type: "RecoveryType | None"
optiga_sec: "int | None"
+ soc: "int | None"
def __init__(
self,
@@ -2137,6 +2138,7 @@ if TYPE_CHECKING:
haptic_feedback: "bool | None" = None,
recovery_type: "RecoveryType | None" = None,
optiga_sec: "int | None" = None,
+ soc: "int | None" = None,
) -> None:
pass
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index 15c6503b..a5953d0b 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -3235,6 +3235,7 @@ class Features(protobuf.MessageType):
52: protobuf.Field("haptic_feedback", "bool", repeated=False, required=False, default=None),
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),
}
def __init__(
@@ -3292,6 +3293,7 @@ class Features(protobuf.MessageType):
haptic_feedback: Optional["bool"] = None,
recovery_type: Optional["RecoveryType"] = None,
optiga_sec: Optional["int"] = None,
+ soc: Optional["int"] = None,
) -> None:
self.capabilities: Sequence["Capability"] = capabilities if capabilities is not None else []
self.major_version = major_version
@@ -3345,6 +3347,7 @@ class Features(protobuf.MessageType):
self.haptic_feedback = haptic_feedback
self.recovery_type = recovery_type
self.optiga_sec = optiga_sec
+ self.soc = soc
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 2fe919c6..1243c14e 100644
--- a/rust/trezor-client/src/protos/generated/messages_management.rs
+++ b/rust/trezor-client/src/protos/generated/messages_management.rs
@@ -467,6 +467,8 @@ pub struct Features {
pub recovery_type: ::std::option::Option<::protobuf::EnumOrUnknown<RecoveryType>>,
// @@protoc_insertion_point(field:hw.trezor.messages.management.Features.optiga_sec)
pub optiga_sec: ::std::option::Option<u32>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.management.Features.soc)
+ pub soc: ::std::option::Option<u32>,
// special fields
// @@protoc_insertion_point(special_field:hw.trezor.messages.management.Features.special_fields)
pub special_fields: ::protobuf::SpecialFields,
@@ -1643,8 +1645,27 @@ impl Features {
self.optiga_sec = ::std::option::Option::Some(v);
}
+ // optional uint32 soc = 55;
+
+ pub fn soc(&self) -> u32 {
+ self.soc.unwrap_or(0)
+ }
+
+ pub fn clear_soc(&mut self) {
+ self.soc = ::std::option::Option::None;
+ }
+
+ pub fn has_soc(&self) -> bool {
+ self.soc.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_soc(&mut self, v: u32) {
+ self.soc = ::std::option::Option::Some(v);
+ }
+
fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
- let mut fields = ::std::vec::Vec::with_capacity(52);
+ let mut fields = ::std::vec::Vec::with_capacity(53);
let mut oneofs = ::std::vec::Vec::with_capacity(0);
fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
"vendor",
@@ -1906,6 +1927,11 @@ impl Features {
|m: &Features| { &m.optiga_sec },
|m: &mut Features| { &mut m.optiga_sec },
));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "soc",
+ |m: &Features| { &m.soc },
+ |m: &mut Features| { &mut m.soc },
+ ));
::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Features>(
"Features",
fields,
@@ -2092,6 +2118,9 @@ impl ::protobuf::Message for Features {
432 => {
self.optiga_sec = ::std::option::Option::Some(is.read_uint32()?);
},
+ 440 => {
+ self.soc = ::std::option::Option::Some(is.read_uint32()?);
+ },
tag => {
::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
},
@@ -2260,6 +2289,9 @@ impl ::protobuf::Message for Features {
if let Some(v) = self.optiga_sec {
my_size += ::protobuf::rt::uint32_size(54, v);
}
+ if let Some(v) = self.soc {
+ my_size += ::protobuf::rt::uint32_size(55, 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
@@ -2422,6 +2454,9 @@ impl ::protobuf::Message for Features {
if let Some(v) = self.optiga_sec {
os.write_uint32(54, v)?;
}
+ if let Some(v) = self.soc {
+ os.write_uint32(55, v)?;
+ }
os.write_unknown_fields(self.special_fields.unknown_fields())?;
::std::result::Result::Ok(())
}
@@ -2491,6 +2526,7 @@ impl ::protobuf::Message for Features {
self.haptic_feedback = ::std::option::Option::None;
self.recovery_type = ::std::option::Option::None;
self.optiga_sec = ::std::option::Option::None;
+ self.soc = ::std::option::Option::None;
self.special_fields.clear();
}
@@ -2548,6 +2584,7 @@ impl ::protobuf::Message for Features {
haptic_feedback: ::std::option::Option::None,
recovery_type: ::std::option::Option::None,
optiga_sec: ::std::option::Option::None,
+ soc: ::std::option::Option::None,
special_fields: ::protobuf::SpecialFields::new(),
};
&instance
@@ -11613,7 +11650,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\"\xba\x18\n\x08Featur\
+ \x20\x01(\x08R\rderiveCardano\"\r\n\x0bGetFeatures\"\xcc\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\
@@ -11664,134 +11701,135 @@ 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\"C\n\x12BackupAvailability\x12\x10\n\x0cNotAvailable\x10\0\
- \x12\x0c\n\x08Required\x10\x01\x12\r\n\tAvailable\x10\x02\"7\n\x0eRecove\
- ryStatus\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_Bit\
- coin\x10\x01\x1a\x04\x80\xa6\x1d\x01\x12\x1b\n\x17Capability_Bitcoin_lik\
- e\x10\x02\x12\x16\n\x12Capability_Binance\x10\x03\x12\x16\n\x12Capabilit\
- y_Cardano\x10\x04\x12\x1b\n\x11Capability_Crypto\x10\x05\x1a\x04\x80\xa6\
- \x1d\x01\x12\x12\n\x0eCapability_EOS\x10\x06\x12\x17\n\x13Capability_Eth\
- ereum\x10\x07\x12\x17\n\x0fCapability_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_ShamirGroups\x10\x10\x1a\x04\x80\xa6\x1d\x01\x12$\n\x1a\
- Capability_PassphraseEntry\x10\x11\x1a\x04\x80\xa6\x1d\x01\x12\x15\n\x11\
- Capability_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\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\"\xa1\x05\n\rApplySetti\
- ngs\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_passphras\
- e\x18\x03\x20\x01(\x08R\rusePassphrase\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\x0fautoLockDelayMs\x12Y\n\x10display_rotation\x18\x07\x20\
- \x01(\x0e2..hw.trezor.messages.management.DisplayRotationR\x0fdisplayRot\
- ation\x12=\n\x1bpassphrase_always_on_device\x18\x08\x20\x01(\x08R\x18pas\
- sphraseAlwaysOnDevice\x12T\n\rsafety_checks\x18\t\x20\x01(\x0e2/.hw.trez\
- or.messages.management.SafetyCheckLevelR\x0csafetyChecks\x123\n\x15exper\
- imental_features\x18\n\x20\x01(\x08R\x14experimentalFeatures\x129\n\x19h\
- ide_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\"T\n\x0eCh\
- angeLanguage\x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\
- \x12!\n\x0cshow_display\x18\x02\x20\x01(\x08R\x0bshowDisplay\"T\n\x10Dat\
- aChunkRequest\x12\x1f\n\x0bdata_length\x18\x01\x20\x02(\rR\ndataLength\
- \x12\x1f\n\x0bdata_offset\x18\x02\x20\x02(\rR\ndataOffset\"-\n\x0cDataCh\
- unkAck\x12\x1d\n\ndata_chunk\x18\x01\x20\x02(\x0cR\tdataChunk\"\"\n\nApp\
- lyFlags\x12\x14\n\x05flags\x18\x01\x20\x02(\rR\x05flags\"#\n\tChangePin\
- \x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\"(\n\x0eChangeWipeC\
- ode\x12\x16\n\x06remove\x18\x01\x20\x01(\x08R\x06remove\"\xaa\x01\n\tSdP\
- rotect\x12]\n\toperation\x18\x01\x20\x02(\x0e2?.hw.trezor.messages.manag\
- ement.SdProtect.SdProtectOperationTypeR\toperation\">\n\x16SdProtectOper\
- ationType\x12\x0b\n\x07DISABLE\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\x10but\
- tonProtection\"\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\tchallen\
- ge\x18\x01\x20\x01(\x0cR\tchallenge\"\"\n\x0cFirmwareHash\x12\x12\n\x04h\
- ash\x18\x01\x20\x02(\x0cR\x04hash\"2\n\x12AuthenticateDevice\x12\x1c\n\t\
- challenge\x18\x01\x20\x02(\x0cR\tchallenge\"U\n\x11AuthenticityProof\x12\
- \"\n\x0ccertificates\x18\x01\x20\x03(\x0cR\x0ccertificates\x12\x1c\n\tsi\
- gnature\x18\x02\x20\x02(\x0cR\tsignature\"\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\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\x0cskipChecksu\
- m\x12\x1f\n\x0bu2f_counter\x18\x08\x20\x01(\rR\nu2fCounter\x12!\n\x0cnee\
- ds_backup\x18\t\x20\x01(\x08R\x0bneedsBackup\x12\x1b\n\tno_backup\x18\n\
- \x20\x01(\x08R\x08noBackup\"\x9d\x03\n\x0bResetDevice\x12\x1f\n\x08stren\
- gth\x18\x02\x20\x01(\r:\x03256R\x08strength\x123\n\x15passphrase_protect\
- ion\x18\x03\x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epin_protecti\
- on\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\nu2fCounter\
- \x12\x1f\n\x0bskip_backup\x18\x08\x20\x01(\x08R\nskipBackup\x12\x1b\n\tn\
- o_backup\x18\t\x20\x01(\x08R\x08noBackup\x12Q\n\x0bbackup_type\x18\n\x20\
- \x01(\x0e2).hw.trezor.messages.management.BackupType:\x05Bip39R\nbackupT\
- ype\x12#\n\rentropy_check\x18\x0b\x20\x01(\x08R\x0centropyCheckJ\x04\x08\
- \x01\x10\x02\"\xe5\x01\n\x0cBackupDevice\x12'\n\x0fgroup_threshold\x18\
- \x01\x20\x01(\rR\x0egroupThreshold\x12O\n\x06groups\x18\x02\x20\x03(\x0b\
- 27.hw.trezor.messages.management.BackupDevice.Slip39GroupR\x06groups\x1a\
- [\n\x0bSlip39Group\x12)\n\x10member_threshold\x18\x01\x20\x02(\rR\x0fmem\
- berThreshold\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_entropy\x18\x02\x20\x01(\x0cR\x0bpr\
- evEntropy\"&\n\nEntropyAck\x12\x18\n\x07entropy\x18\x01\x20\x02(\x0cR\
- \x07entropy\"\x13\n\x11EntropyCheckReady\"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\twordCoun\
- t\x123\n\x15passphrase_protection\x18\x02\x20\x01(\x08R\x14passphrasePro\
- tection\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\x05label\x12)\n\x10enforce_wordlist\
- \x18\x06\x20\x01(\x08R\x0fenforceWordlist\x12j\n\x0cinput_method\x18\x08\
- \x20\x01(\x0e2G.hw.trezor.messages.management.RecoveryDevice.RecoveryDev\
- iceInputMethodR\x0binputMethod\x12\x1f\n\x0bu2f_counter\x18\t\x20\x01(\r\
- R\nu2fCounter\x12O\n\x04type\x18\n\x20\x01(\x0e2+.hw.trezor.messages.man\
- agement.RecoveryType:\x0eNormalRecoveryR\x04type\";\n\x19RecoveryDeviceI\
- nputMethod\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.WordRequestTyp\
- eR\x04type\"f\n\x0fWordRequestType\x12\x19\n\x15WordRequestType_Plain\
- \x10\0\x12\x1b\n\x17WordRequestType_Matrix9\x10\x01\x12\x1b\n\x17WordReq\
- uestType_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\x0eNextU2\
- FCounter\x12\x1f\n\x0bu2f_counter\x18\x01\x20\x02(\rR\nu2fCounter\"\x11\
- \n\x0fDoPreauthorized\"\x16\n\x14PreauthorizedRequest\"\x15\n\x13CancelA\
- uthorization\"\x9a\x02\n\x12RebootToBootloader\x12o\n\x0cboot_command\
- \x18\x01\x20\x01(\x0e2=.hw.trezor.messages.management.RebootToBootloader\
- .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\
+ \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\"\xa1\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\"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\"U\n\x11AuthenticityProof\x12\"\n\x0ccertificates\x18\
+ \x01\x20\x03(\x0cR\x0ccertificates\x12\x1c\n\tsignature\x18\x02\x20\x02(\
+ \x0cR\tsignature\"\x0c\n\nWipeDevice\"\xad\x02\n\nLoadDevice\x12\x1c\n\t\
+ mnemonics\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\
+ \x14passphraseProtection\x12\x1e\n\x08language\x18\x05\x20\x01(\tR\x08la\
+ nguageB\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\x0bneedsBackup\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\x08strength\x123\n\x15passphrase_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\x05labe\
+ l\x12\x1f\n\x0bu2f_counter\x18\x07\x20\x01(\rR\nu2fCounter\x12\x1f\n\x0b\
+ skip_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:\x05Bip39R\nbackupType\x12#\n\ren\
+ tropy_check\x18\x0b\x20\x01(\x08R\x0centropyCheckJ\x04\x08\x01\x10\x02\"\
+ \xe5\x01\n\x0cBackupDevice\x12'\n\x0fgroup_threshold\x18\x01\x20\x01(\rR\
+ \x0egroupThreshold\x12O\n\x06groups\x18\x02\x20\x03(\x0b27.hw.trezor.mes\
+ sages.management.BackupDevice.Slip39GroupR\x06groups\x1a[\n\x0bSlip39Gro\
+ up\x12)\n\x10member_threshold\x18\x01\x20\x02(\rR\x0fmemberThreshold\x12\
+ !\n\x0cmember_count\x18\x02\x20\x02(\rR\x0bmemberCount\"b\n\x0eEntropyRe\
+ quest\x12-\n\x12entropy_commitment\x18\x01\x20\x01(\x0cR\x11entropyCommi\
+ tment\x12!\n\x0cprev_entropy\x18\x02\x20\x01(\x0cR\x0bprevEntropy\"&\n\n\
+ EntropyAck\x12\x18\n\x07entropy\x18\x01\x20\x02(\x0cR\x07entropy\"\x13\n\
+ \x11EntropyCheckReady\"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\x15passphra\
+ se_protection\x18\x02\x20\x01(\x08R\x14passphraseProtection\x12%\n\x0epi\
+ n_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\x05label\x12)\n\x10enforce_wordlist\x18\x06\x20\x01(\x08R\
+ \x0fenforceWordlist\x12j\n\x0cinput_method\x18\x08\x20\x01(\x0e2G.hw.tre\
+ zor.messages.management.RecoveryDevice.RecoveryDeviceInputMethodR\x0binp\
+ utMethod\x12\x1f\n\x0bu2f_counter\x18\t\x20\x01(\rR\nu2fCounter\x12O\n\
+ \x04type\x18\n\x20\x01(\x0e2+.hw.trezor.messages.management.RecoveryType\
+ :\x0eNormalRecoveryR\x04type\";\n\x19RecoveryDeviceInputMethod\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.tre\
+ zor.messages.management.WordRequest.WordRequestTypeR\x04type\"f\n\x0fWor\
+ dRequestType\x12\x19\n\x15WordRequestType_Plain\x10\0\x12\x1b\n\x17WordR\
+ equestType_Matrix9\x10\x01\x12\x1b\n\x17WordRequestType_Matrix6\x10\x02\
+ \"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01\x20\x02(\tR\x04word\"0\n\r\
+ SetU2FCounter\x12\x1f\n\x0bu2f_counter\x18\x01\x20\x02(\rR\nu2fCounter\"\
+ \x13\n\x11GetNextU2FCounter\"1\n\x0eNextU2FCounter\x12\x1f\n\x0bu2f_coun\
+ ter\x18\x01\x20\x02(\rR\nu2fCounter\"\x11\n\x0fDoPreauthorized\"\x16\n\
+ \x14PreauthorizedRequest\"\x15\n\x13CancelAuthorization\"\x9a\x02\n\x12R\
+ ebootToBootloader\x12o\n\x0cboot_command\x18\x01\x20\x01(\x0e2=.hw.trezo\
+ r.messages.management.RebootToBootloader.BootCommand:\rSTOP_AND_WAITR\
+ \x0bbootCommand\x12'\n\x0ffirmware_header\x18\x02\x20\x01(\x0cR\x0efirmw\
+ areHeader\x123\n\x14language_data_length\x18\x03\x20\x01(\r:\x010R\x12la\
+ nguageDataLength\"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\x10UnlockBootloader\"%\n\rSetBright\
+ ness\x12\x14\n\x05value\x18\x01\x20\x01(\rR\x05value*\x99\x01\n\nBackupT\
+ ype\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\x17Slip39_Basic_Extendable\x10\x04\x12\x1e\n\x1aSlip39_Ad\
+ vanced_Extendable\x10\x05*G\n\x10SafetyCheckLevel\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\x10\
+ Z\x12\n\n\x05South\x10\xb4\x01\x12\t\n\x04West\x10\x8e\x02*0\n\x10Homesc\
+ reenFormat\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.trezor.lib.protobufB\x17TrezorMessageManagement\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.