1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-07-30 18:38:27 +00:00

fix(core/protobuf): broken wire_id separation by enum

[no changelog]
This commit is contained in:
Martin Milata 2025-07-18 15:39:12 +02:00
parent 4336ecf1ad
commit d38ed8a6c5
3 changed files with 25 additions and 3 deletions

View File

@ -349,6 +349,7 @@ class Descriptor:
]
logging.debug(f"found {len(self.files)} bitcoin-only files")
# message_types is a nested dict: message_name -> wire_enum -> wire_id
self.message_types, self.wire_enum_extensions = self.get_wire_enums()
# find messages and enums
@ -458,6 +459,9 @@ class Descriptor:
else:
return None
def wire_enum_has_message(self, enum_name: str, message_name: str) -> bool:
return enum_name in self.message_types.get(message_name, {})
class PythonRenderer:
def __init__(self, descriptor: Descriptor, out_dir="", python_extension="py"):
@ -718,9 +722,12 @@ class RustBlobRenderer:
for en in wire_enum_names:
name_qstr = self.qstr_map[en]
for m in wire_messages:
result.append(
WIRETYPE_ENTRY.build((name_qstr, m.wire_type, self.msg_map[m.name]))
)
if self.descriptor.wire_enum_has_message(en, m.name):
result.append(
WIRETYPE_ENTRY.build(
(name_qstr, m.wire_type, self.msg_map[m.name])
)
)
return b"".join(result)

View File

@ -38,6 +38,7 @@ static void _librust_qstrs(void) {
MP_QSTR_MAX;
MP_QSTR_MESSAGE_NAME;
MP_QSTR_MESSAGE_WIRE_TYPE;
MP_QSTR_MessageType;
MP_QSTR_Msg;
MP_QSTR_MsgDef;
MP_QSTR_NONE;

View File

@ -234,3 +234,17 @@ unsafe fn get_enum(enum_offset: u16) -> EnumDef {
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::micropython::qstr::Qstr;
#[test]
fn wire_type_basic_lookup() {
// SignTx: 15
assert!(find_msg_offset_by_wire(Qstr::MP_QSTR_MessageType.to_u16(), 15).is_some());
// Guaranteed empty.
assert!(find_msg_offset_by_wire(Qstr::MP_QSTR_CONFIRMED.to_u16(), 15).is_none());
}
}