What changed, and why it matters
This commit loosens a data-format rule for a Trezor feature called Evolu. It changes the `rotation_index` field in an 'EvoluRegistrationRequest' message from 'must be provided' to 'may be omitted'. The stated reason is to fix a compatibility issue so older or differently configured callers can still use the feature. There is no direct evidence in the commit that this fixes an exploitable vulnerability; it appears to be a backward-compatibility fix.
Treat as a routine compatibility patch. Review the Evolu registration handler to confirm it behaves safely when `rotation_index` is absent (e.g., uses a sensible default or rejects the request at the application layer if the value is actually needed). No urgent security action is indicated by the commit alone.
Security signals we found
Relaxation of a required field to optional in a registration protocol message
Removal of a presence check in generated Rust message validation
No mention of security impact, CVE, or vulnerability in commit message or diff
No changelog entry recorded ([no changelog])
Evidence from the diff
The protobuf definition for EvoluRegistrationRequest changes rotation_index from required uint32 to optional uint32. Generated bindings in Python, Rust, and the core Trezor message stubs are updated accordingly: the field now defaults to None and is no longer enforced as present during message validation. The Rust is_initialized() check no longer rejects messages missing rotation_index. The commit message frames this as a compatibility fix, not a security fix.
Changed components
common/protob/messages-evolu.protocore/src/trezor/messages.pypython/src/trezorlib/messages.pyrust/trezor-client/src/protos/generated/messages_evolu.rsInspect captured patch +7 / −10
diff --git a/common/protob/messages-evolu.proto b/common/protob/messages-evolu.proto
index 56152894..1d16f4f3 100644
--- a/common/protob/messages-evolu.proto
+++ b/common/protob/messages-evolu.proto
@@ -49,7 +49,7 @@ message EvoluSignRegistrationRequest {
message EvoluRegistrationRequest {
repeated bytes certificate_chain = 1;
required bytes signature = 2;
- required uint32 rotation_index = 3; // the rotation index of the delegated identity key
+ optional uint32 rotation_index = 3; // the rotation index of the delegated identity key
}
/**
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index 38b17e98..3feeacf0 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -4471,14 +4471,14 @@ if TYPE_CHECKING:
class EvoluRegistrationRequest(protobuf.MessageType):
certificate_chain: "list[AnyBytes]"
signature: "AnyBytes"
- rotation_index: "int"
+ rotation_index: "int | None"
def __init__(
self,
*,
signature: "AnyBytes",
- rotation_index: "int",
certificate_chain: "list[AnyBytes] | None" = None,
+ rotation_index: "int | None" = None,
) -> None:
pass
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index b3470b77..8fd087c6 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -6035,15 +6035,15 @@ class EvoluRegistrationRequest(protobuf.MessageType):
FIELDS = {
1: protobuf.Field("certificate_chain", "bytes", repeated=True, required=False, default=None),
2: protobuf.Field("signature", "bytes", repeated=False, required=True),
- 3: protobuf.Field("rotation_index", "uint32", repeated=False, required=True),
+ 3: protobuf.Field("rotation_index", "uint32", repeated=False, required=False, default=None),
}
def __init__(
self,
*,
signature: "bytes",
- rotation_index: "int",
certificate_chain: Optional[Sequence["bytes"]] = None,
+ rotation_index: Optional["int"] = None,
) -> None:
self.certificate_chain: Sequence["bytes"] = certificate_chain if certificate_chain is not None else []
self.signature = signature
diff --git a/rust/trezor-client/src/protos/generated/messages_evolu.rs b/rust/trezor-client/src/protos/generated/messages_evolu.rs
index 82a92267..ea357216 100644
--- a/rust/trezor-client/src/protos/generated/messages_evolu.rs
+++ b/rust/trezor-client/src/protos/generated/messages_evolu.rs
@@ -703,7 +703,7 @@ impl EvoluRegistrationRequest {
self.signature.take().unwrap_or_else(|| ::std::vec::Vec::new())
}
- // required uint32 rotation_index = 3;
+ // optional uint32 rotation_index = 3;
pub fn rotation_index(&self) -> u32 {
self.rotation_index.unwrap_or(0)
@@ -755,9 +755,6 @@ impl ::protobuf::Message for EvoluRegistrationRequest {
if self.signature.is_none() {
return false;
}
- if self.rotation_index.is_none() {
- return false;
- }
true
}
@@ -1584,7 +1581,7 @@ static file_descriptor_proto_data: &'static [u8] = b"\
(\x0cR\x18proofOfDelegatedIdentity\"\x8c\x01\n\x18EvoluRegistrationReque\
st\x12+\n\x11certificate_chain\x18\x01\x20\x03(\x0cR\x10certificateChain\
\x12\x1c\n\tsignature\x18\x02\x20\x02(\x0cR\tsignature\x12%\n\x0erotatio\
- n_index\x18\x03\x20\x02(\rR\rrotationIndex\"\x8a\x01\n\x1cEvoluGetDelega\
+ n_index\x18\x03\x20\x01(\rR\rrotationIndex\"\x8a\x01\n\x1cEvoluGetDelega\
tedIdentityKey\x12%\n\x0ethp_credential\x18\x01\x20\x01(\x0cR\rthpCreden\
tial\x12%\n\x0erotation_index\x18\x03\x20\x01(\rR\rrotationIndex\x12\x16\
\n\x06rotate\x18\x04\x20\x01(\x08R\x06rotateJ\x04\x08\x02\x10\x03\"c\n\
Why this scored 23/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.