chore(common): deprecate uploading language blob during firmware update
What changed, and why it matters
This commit removes an unused data field called language_data_length from the RebootToBootloader command used during Trezor firmware updates. It is a cleanup change that marks the old field as reserved in the protocol definition and regenerates the corresponding code in Python, Rust, and the device firmware. There is no security-relevant change here.
No security action required. Treat as routine maintenance/cleanup.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The protobuf message RebootToBootloader previously had an optional uint32 field language_data_length (field number 3). The commit deprecates it by marking field 3 as reserved in common/protob/messages-management.proto and removes the generated accessors from core/src/trezor/messages.py, python/src/trezorlib/messages.py, and rust/trezor-client/src/protos/generated/messages_management.rs. The field was unused and had no functional logic attached to it. The descriptor bytes are updated accordingly. This is a backward-compatible wire-format change because reserved fields are ignored by parsers.
Changed components
common/protob/messages-management.protocore/src/trezor/messages.pypython/src/trezorlib/messages.pyrust/trezor-client/src/protos/generated/messages_management.rsInspect captured patch +25 / −67
diff --git a/common/protob/messages-management.proto b/common/protob/messages-management.proto
index 30cfb8fb..5f35d2f8 100644
--- a/common/protob/messages-management.proto
+++ b/common/protob/messages-management.proto
@@ -619,8 +619,8 @@ message RebootToBootloader {
optional BootCommand boot_command = 1 [default=STOP_AND_WAIT];
// Firmware header to be flashed after rebooting to bootloader
optional bytes firmware_header = 2;
- // Length of language blob to be installed before upgrading firmware
- optional uint32 language_data_length = 3 [default=0];
+ // Deprecated (length of language blob to be installed before upgrading firmware)
+ reserved 3;
enum BootCommand {
// Go to bootloader menu
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index 96b1ef6c..05874380 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -2681,14 +2681,12 @@ if TYPE_CHECKING:
class RebootToBootloader(protobuf.MessageType):
boot_command: "BootCommand"
firmware_header: "AnyBytes | None"
- language_data_length: "int"
def __init__(
self,
*,
boot_command: "BootCommand | None" = None,
firmware_header: "AnyBytes | None" = None,
- language_data_length: "int | None" = None,
) -> None:
pass
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index 36496037..87c79ffe 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -3949,7 +3949,6 @@ class RebootToBootloader(protobuf.MessageType):
FIELDS = {
1: protobuf.Field("boot_command", "BootCommand", repeated=False, required=False, default=BootCommand.STOP_AND_WAIT),
2: protobuf.Field("firmware_header", "bytes", repeated=False, required=False, default=None),
- 3: protobuf.Field("language_data_length", "uint32", repeated=False, required=False, default=0),
}
def __init__(
@@ -3957,11 +3956,9 @@ class RebootToBootloader(protobuf.MessageType):
*,
boot_command: Optional["BootCommand"] = BootCommand.STOP_AND_WAIT,
firmware_header: Optional["bytes"] = None,
- language_data_length: Optional["int"] = 0,
) -> None:
self.boot_command = boot_command
self.firmware_header = firmware_header
- self.language_data_length = language_data_length
class GetNonce(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 7112aa2c..0ca2cd54 100644
--- a/rust/trezor-client/src/protos/generated/messages_management.rs
+++ b/rust/trezor-client/src/protos/generated/messages_management.rs
@@ -10411,8 +10411,6 @@ pub struct RebootToBootloader {
pub boot_command: ::std::option::Option<::protobuf::EnumOrUnknown<reboot_to_bootloader::BootCommand>>,
// @@protoc_insertion_point(field:hw.trezor.messages.management.RebootToBootloader.firmware_header)
pub firmware_header: ::std::option::Option<::std::vec::Vec<u8>>,
- // @@protoc_insertion_point(field:hw.trezor.messages.management.RebootToBootloader.language_data_length)
- pub language_data_length: ::std::option::Option<u32>,
// special fields
// @@protoc_insertion_point(special_field:hw.trezor.messages.management.RebootToBootloader.special_fields)
pub special_fields: ::protobuf::SpecialFields,
@@ -10487,27 +10485,8 @@ impl RebootToBootloader {
self.firmware_header.take().unwrap_or_else(|| ::std::vec::Vec::new())
}
- // optional uint32 language_data_length = 3;
-
- pub fn language_data_length(&self) -> u32 {
- self.language_data_length.unwrap_or(0u32)
- }
-
- pub fn clear_language_data_length(&mut self) {
- self.language_data_length = ::std::option::Option::None;
- }
-
- pub fn has_language_data_length(&self) -> bool {
- self.language_data_length.is_some()
- }
-
- // Param is passed by value, moved
- pub fn set_language_data_length(&mut self, v: u32) {
- self.language_data_length = ::std::option::Option::Some(v);
- }
-
fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
- let mut fields = ::std::vec::Vec::with_capacity(3);
+ let mut fields = ::std::vec::Vec::with_capacity(2);
let mut oneofs = ::std::vec::Vec::with_capacity(0);
fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
"boot_command",
@@ -10519,11 +10498,6 @@ impl RebootToBootloader {
|m: &RebootToBootloader| { &m.firmware_header },
|m: &mut RebootToBootloader| { &mut m.firmware_header },
));
- fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
- "language_data_length",
- |m: &RebootToBootloader| { &m.language_data_length },
- |m: &mut RebootToBootloader| { &mut m.language_data_length },
- ));
::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<RebootToBootloader>(
"RebootToBootloader",
fields,
@@ -10548,9 +10522,6 @@ impl ::protobuf::Message for RebootToBootloader {
18 => {
self.firmware_header = ::std::option::Option::Some(is.read_bytes()?);
},
- 24 => {
- self.language_data_length = ::std::option::Option::Some(is.read_uint32()?);
- },
tag => {
::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
},
@@ -10569,9 +10540,6 @@ impl ::protobuf::Message for RebootToBootloader {
if let Some(v) = self.firmware_header.as_ref() {
my_size += ::protobuf::rt::bytes_size(2, &v);
}
- if let Some(v) = self.language_data_length {
- 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
@@ -10584,9 +10552,6 @@ impl ::protobuf::Message for RebootToBootloader {
if let Some(v) = self.firmware_header.as_ref() {
os.write_bytes(2, v)?;
}
- if let Some(v) = self.language_data_length {
- os.write_uint32(3, v)?;
- }
os.write_unknown_fields(self.special_fields.unknown_fields())?;
::std::result::Result::Ok(())
}
@@ -10606,7 +10571,6 @@ impl ::protobuf::Message for RebootToBootloader {
fn clear(&mut self) {
self.boot_command = ::std::option::Option::None;
self.firmware_header = ::std::option::Option::None;
- self.language_data_length = ::std::option::Option::None;
self.special_fields.clear();
}
@@ -10614,7 +10578,6 @@ impl ::protobuf::Message for RebootToBootloader {
static instance: RebootToBootloader = RebootToBootloader {
boot_command: ::std::option::Option::None,
firmware_header: ::std::option::Option::None,
- language_data_length: ::std::option::Option::None,
special_fields: ::protobuf::SpecialFields::new(),
};
&instance
@@ -12453,31 +12416,31 @@ static file_descriptor_proto_data: &'static [u8] = b"\
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\
+ \x14PreauthorizedRequest\"\x15\n\x13CancelAuthorization\"\xeb\x01\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\"\n\n\x08GetNonce\"\x1d\n\x05Nonce\x12\
- \x14\n\x05nonce\x18\x01\x20\x02(\x0cR\x05nonce\";\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\x10Unloc\
- kBootloader\"%\n\rSetBrightness\x12\x14\n\x05value\x18\x01\x20\x01(\rR\
- \x05value\"\x11\n\x0fGetSerialNumber\"3\n\x0cSerialNumber\x12#\n\rserial\
- _number\x18\x01\x20\x02(\tR\x0cserialNumber*\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\
- \x17Slip39_Basic_Extendable\x10\x04\x12\x1e\n\x1aSlip39_Advanced_Extenda\
- ble\x10\x05*G\n\x10SafetyCheckLevel\x12\n\n\x06Strict\x10\0\x12\x10\n\
- \x0cPromptAlways\x10\x01\x12\x15\n\x11PromptTemporarily\x10\x02*=\n\x0fD\
- isplayRotation\x12\t\n\x05North\x10\0\x12\x08\n\x04East\x10Z\x12\n\n\x05\
- South\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.sat\
- oshilabs.trezor.lib.protobufB\x17TrezorMessageManagement\x80\xa6\x1d\x01\
+ areHeader\"5\n\x0bBootCommand\x12\x11\n\rSTOP_AND_WAIT\x10\0\x12\x13\n\
+ \x0fINSTALL_UPGRADE\x10\x01J\x04\x08\x03\x10\x04\"\n\n\x08GetNonce\"\x1d\
+ \n\x05Nonce\x12\x14\n\x05nonce\x18\x01\x20\x02(\x0cR\x05nonce\";\n\nUnlo\
+ ckPath\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\rSetBrightness\x12\x14\n\x05value\x18\
+ \x01\x20\x01(\rR\x05value\"\x11\n\x0fGetSerialNumber\"3\n\x0cSerialNumbe\
+ r\x12#\n\rserial_number\x18\x01\x20\x02(\tR\x0cserialNumber*\x99\x01\n\n\
+ BackupType\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\x1aSlip3\
+ 9_Advanced_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\
+ \x10Z\x12\n\n\x05South\x10\xb4\x01\x12\t\n\x04West\x10\x8e\x02*0\n\x10Ho\
+ mescreenFormat\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 15/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.