feat(common): allow `WebAuthnListResidentCredentials` pagination
What changed, and why it matters
This commit only changes the protocol definitions (the message formats) used for listing WebAuthn resident credentials. It adds an optional batch size, a flag indicating whether more credentials are available, and a new acknowledgment message so the host can request the next batch. There is no actual implementation of the pagination logic in the firmware or host code in this commit, and nothing in the commit suggests a security vulnerability. It appears to be a normal feature addition to support paginated credential listing.
No security action required. Treat as a normal feature/schema commit. If reviewing the broader pagination feature, inspect the follow-up implementation commits for correct bounds handling on batch_size and proper state management for the pagination session.
Security signals we found
No security-relevant keywords in commit title or message
Schema-only change with no behavioral implementation
New optional field with safe default (is_done defaults to true, preserving prior behavior)
No validation, parsing, or memory-management code modified
No vendor disclosure or advisory references present
Evidence from the diff
The diff updates protobuf definitions and generated bindings across Python, Rust, and core enums. WebAuthnListResidentCredentials gains an optional uint32 batch_size; WebAuthnCredentials gains an optional bool is_done (default true); a new wire-in message WebAuthnCredentialsAck (type 804) is added. No firmware logic, state machine, bounds checking, or host-side pagination loop is implemented here. The change is purely schema-level.
Changed components
common/protob/messages-webauthn.protocommon/protob/messages.protocore/src/trezor/enums/MessageType.pycore/src/trezor/enums/__init__.pycore/src/trezor/messages.pypython/src/trezorlib/messages.pyrust/trezor-client/src/messages/generated.rsrust/trezor-client/src/protos/generated/messages.rsrust/trezor-client/src/protos/generated/messages_webauthn.rsInspect captured patch +342 / −104
diff --git a/common/protob/messages-webauthn.proto b/common/protob/messages-webauthn.proto
index 60cf932d..5075fb28 100644
--- a/common/protob/messages-webauthn.proto
+++ b/common/protob/messages-webauthn.proto
@@ -11,7 +11,9 @@ option java_package = "com.satoshilabs.trezor.lib.protobuf";
* @next WebAuthnCredentials
* @next Failure
*/
-message WebAuthnListResidentCredentials {}
+message WebAuthnListResidentCredentials {
+ optional uint32 batch_size = 1; // if set, the response will be paginated
+}
/**
* Request: Add resident credential
@@ -36,6 +38,7 @@ message WebAuthnRemoveResidentCredential {
/**
* Response: Resident credential list
* @start
+ * @next WebAuthnCredentialsAck
* @next end
*/
message WebAuthnCredentials {
@@ -54,4 +57,13 @@ message WebAuthnCredentials {
optional sint32 algorithm = 11;
optional sint32 curve = 12;
}
+ optional bool is_done = 2 [default = true]; // false = pagination should continue
}
+
+/**
+ * Request: Send the next batch of credentials
+ * @start
+ * @next WebAuthnCredentials
+ * @next Failure
+ */
+message WebAuthnCredentialsAck {}
diff --git a/common/protob/messages.proto b/common/protob/messages.proto
index a8ade8b5..c422388b 100644
--- a/common/protob/messages.proto
+++ b/common/protob/messages.proto
@@ -325,6 +325,7 @@ enum MessageType {
MessageType_WebAuthnCredentials = 801 [(wire_out) = true];
MessageType_WebAuthnAddResidentCredential = 802 [(wire_in) = true];
MessageType_WebAuthnRemoveResidentCredential = 803 [(wire_in) = true];
+ MessageType_WebAuthnCredentialsAck = 804 [(wire_in) = true];
// Solana
MessageType_SolanaGetPublicKey = 900 [(wire_in) = true];
diff --git a/core/src/trezor/enums/MessageType.py b/core/src/trezor/enums/MessageType.py
index 2da847ea..d57c6d2d 100644
--- a/core/src/trezor/enums/MessageType.py
+++ b/core/src/trezor/enums/MessageType.py
@@ -264,6 +264,7 @@ if not utils.BITCOIN_ONLY:
WebAuthnCredentials = 801
WebAuthnAddResidentCredential = 802
WebAuthnRemoveResidentCredential = 803
+ WebAuthnCredentialsAck = 804
SolanaGetPublicKey = 900
SolanaPublicKey = 901
SolanaGetAddress = 902
diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py
index ef992782..dcfa7fe3 100644
--- a/core/src/trezor/enums/__init__.py
+++ b/core/src/trezor/enums/__init__.py
@@ -628,6 +628,7 @@ if TYPE_CHECKING:
WebAuthnCredentials = 801
WebAuthnAddResidentCredential = 802
WebAuthnRemoveResidentCredential = 803
+ WebAuthnCredentialsAck = 804
SolanaGetPublicKey = 900
SolanaPublicKey = 901
SolanaGetAddress = 902
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index 10f2fb67..f7892804 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -7128,6 +7128,14 @@ if TYPE_CHECKING:
return isinstance(msg, cls)
class WebAuthnListResidentCredentials(protobuf.MessageType):
+ batch_size: "int | None"
+
+ def __init__(
+ self,
+ *,
+ batch_size: "int | None" = None,
+ ) -> None:
+ pass
@classmethod
def is_type_of(cls, msg: Any) -> TypeGuard["WebAuthnListResidentCredentials"]:
@@ -7163,11 +7171,13 @@ if TYPE_CHECKING:
class WebAuthnCredentials(protobuf.MessageType):
credentials: "list[WebAuthnCredential]"
+ is_done: "bool"
def __init__(
self,
*,
credentials: "list[WebAuthnCredential] | None" = None,
+ is_done: "bool | None" = None,
) -> None:
pass
@@ -7175,6 +7185,12 @@ if TYPE_CHECKING:
def is_type_of(cls, msg: Any) -> TypeGuard["WebAuthnCredentials"]:
return isinstance(msg, cls)
+ class WebAuthnCredentialsAck(protobuf.MessageType):
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["WebAuthnCredentialsAck"]:
+ return isinstance(msg, cls)
+
class WebAuthnCredential(protobuf.MessageType):
index: "int | None"
id: "AnyBytes | None"
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index aed97409..3bd98673 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -683,6 +683,7 @@ class MessageType(IntEnum):
WebAuthnCredentials = 801
WebAuthnAddResidentCredential = 802
WebAuthnRemoveResidentCredential = 803
+ WebAuthnCredentialsAck = 804
SolanaGetPublicKey = 900
SolanaPublicKey = 901
SolanaGetAddress = 902
@@ -8965,6 +8966,16 @@ class TronRawParameter(protobuf.MessageType):
class WebAuthnListResidentCredentials(protobuf.MessageType):
MESSAGE_WIRE_TYPE = 800
+ FIELDS = {
+ 1: protobuf.Field("batch_size", "uint32", repeated=False, required=False, default=None),
+ }
+
+ def __init__(
+ self,
+ *,
+ batch_size: Optional["int"] = None,
+ ) -> None:
+ self.batch_size = batch_size
class WebAuthnAddResidentCredential(protobuf.MessageType):
@@ -8999,14 +9010,21 @@ class WebAuthnCredentials(protobuf.MessageType):
MESSAGE_WIRE_TYPE = 801
FIELDS = {
1: protobuf.Field("credentials", "WebAuthnCredential", repeated=True, required=False, default=None),
+ 2: protobuf.Field("is_done", "bool", repeated=False, required=False, default=True),
}
def __init__(
self,
*,
credentials: Optional[Sequence["WebAuthnCredential"]] = None,
+ is_done: Optional["bool"] = True,
) -> None:
self.credentials: Sequence["WebAuthnCredential"] = credentials if credentials is not None else []
+ self.is_done = is_done
+
+
+class WebAuthnCredentialsAck(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 804
class WebAuthnCredential(protobuf.MessageType):
diff --git a/rust/trezor-client/src/messages/generated.rs b/rust/trezor-client/src/messages/generated.rs
index 46579024..93198042 100644
--- a/rust/trezor-client/src/messages/generated.rs
+++ b/rust/trezor-client/src/messages/generated.rs
@@ -335,4 +335,5 @@ trezor_message_impl! {
WebAuthnCredentials => MessageType_WebAuthnCredentials,
WebAuthnAddResidentCredential => MessageType_WebAuthnAddResidentCredential,
WebAuthnRemoveResidentCredential => MessageType_WebAuthnRemoveResidentCredential,
+ WebAuthnCredentialsAck => MessageType_WebAuthnCredentialsAck,
}
diff --git a/rust/trezor-client/src/protos/generated/messages.rs b/rust/trezor-client/src/protos/generated/messages.rs
index d9ac6b65..b445c6b3 100644
--- a/rust/trezor-client/src/protos/generated/messages.rs
+++ b/rust/trezor-client/src/protos/generated/messages.rs
@@ -515,6 +515,8 @@ pub enum MessageType {
MessageType_WebAuthnAddResidentCredential = 802,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_WebAuthnRemoveResidentCredential)
MessageType_WebAuthnRemoveResidentCredential = 803,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_WebAuthnCredentialsAck)
+ MessageType_WebAuthnCredentialsAck = 804,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_SolanaGetPublicKey)
MessageType_SolanaGetPublicKey = 900,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_SolanaPublicKey)
@@ -842,6 +844,7 @@ impl ::protobuf::Enum for MessageType {
801 => ::std::option::Option::Some(MessageType::MessageType_WebAuthnCredentials),
802 => ::std::option::Option::Some(MessageType::MessageType_WebAuthnAddResidentCredential),
803 => ::std::option::Option::Some(MessageType::MessageType_WebAuthnRemoveResidentCredential),
+ 804 => ::std::option::Option::Some(MessageType::MessageType_WebAuthnCredentialsAck),
900 => ::std::option::Option::Some(MessageType::MessageType_SolanaGetPublicKey),
901 => ::std::option::Option::Some(MessageType::MessageType_SolanaPublicKey),
902 => ::std::option::Option::Some(MessageType::MessageType_SolanaGetAddress),
@@ -1128,6 +1131,7 @@ impl ::protobuf::Enum for MessageType {
"MessageType_WebAuthnCredentials" => ::std::option::Option::Some(MessageType::MessageType_WebAuthnCredentials),
"MessageType_WebAuthnAddResidentCredential" => ::std::option::Option::Some(MessageType::MessageType_WebAuthnAddResidentCredential),
"MessageType_WebAuthnRemoveResidentCredential" => ::std::option::Option::Some(MessageType::MessageType_WebAuthnRemoveResidentCredential),
+ "MessageType_WebAuthnCredentialsAck" => ::std::option::Option::Some(MessageType::MessageType_WebAuthnCredentialsAck),
"MessageType_SolanaGetPublicKey" => ::std::option::Option::Some(MessageType::MessageType_SolanaGetPublicKey),
"MessageType_SolanaPublicKey" => ::std::option::Option::Some(MessageType::MessageType_SolanaPublicKey),
"MessageType_SolanaGetAddress" => ::std::option::Option::Some(MessageType::MessageType_SolanaGetAddress),
@@ -1413,6 +1417,7 @@ impl ::protobuf::Enum for MessageType {
MessageType::MessageType_WebAuthnCredentials,
MessageType::MessageType_WebAuthnAddResidentCredential,
MessageType::MessageType_WebAuthnRemoveResidentCredential,
+ MessageType::MessageType_WebAuthnCredentialsAck,
MessageType::MessageType_SolanaGetPublicKey,
MessageType::MessageType_SolanaPublicKey,
MessageType::MessageType_SolanaGetAddress,
@@ -1704,42 +1709,43 @@ impl ::protobuf::EnumFull for MessageType {
MessageType::MessageType_WebAuthnCredentials => 241,
MessageType::MessageType_WebAuthnAddResidentCredential => 242,
MessageType::MessageType_WebAuthnRemoveResidentCredential => 243,
- MessageType::MessageType_SolanaGetPublicKey => 244,
- MessageType::MessageType_SolanaPublicKey => 245,
- MessageType::MessageType_SolanaGetAddress => 246,
- MessageType::MessageType_SolanaAddress => 247,
- MessageType::MessageType_SolanaSignTx => 248,
- MessageType::MessageType_SolanaTxSignature => 249,
- MessageType::MessageType_ThpCreateNewSession => 250,
- MessageType::MessageType_ThpCredentialRequest => 251,
- MessageType::MessageType_ThpCredentialResponse => 252,
- MessageType::MessageType_NostrGetPubkey => 253,
- MessageType::MessageType_NostrPubkey => 254,
- MessageType::MessageType_NostrSignEvent => 255,
- MessageType::MessageType_NostrEventSignature => 256,
- MessageType::MessageType_EvoluGetNode => 257,
- MessageType::MessageType_EvoluNode => 258,
- MessageType::MessageType_EvoluSignRegistrationRequest => 259,
- MessageType::MessageType_EvoluRegistrationRequest => 260,
- MessageType::MessageType_EvoluGetDelegatedIdentityKey => 261,
- MessageType::MessageType_EvoluDelegatedIdentityKey => 262,
- MessageType::MessageType_TronGetAddress => 263,
- MessageType::MessageType_TronAddress => 264,
- MessageType::MessageType_TronSignTx => 265,
- MessageType::MessageType_TronSignature => 266,
- MessageType::MessageType_TronContractRequest => 267,
- MessageType::MessageType_TronTransferContract => 268,
- MessageType::MessageType_TronTriggerSmartContract => 269,
- MessageType::MessageType_TronFreezeBalanceV2Contract => 270,
- MessageType::MessageType_TronUnfreezeBalanceV2Contract => 271,
- MessageType::MessageType_TronWithdrawUnfreeze => 272,
- MessageType::MessageType_TronVoteWitnessContract => 273,
- MessageType::MessageType_BenchmarkListNames => 274,
- MessageType::MessageType_BenchmarkNames => 275,
- MessageType::MessageType_BenchmarkRun => 276,
- MessageType::MessageType_BenchmarkResult => 277,
- MessageType::MessageType_TelemetryGet => 278,
- MessageType::MessageType_Telemetry => 279,
+ MessageType::MessageType_WebAuthnCredentialsAck => 244,
+ MessageType::MessageType_SolanaGetPublicKey => 245,
+ MessageType::MessageType_SolanaPublicKey => 246,
+ MessageType::MessageType_SolanaGetAddress => 247,
+ MessageType::MessageType_SolanaAddress => 248,
+ MessageType::MessageType_SolanaSignTx => 249,
+ MessageType::MessageType_SolanaTxSignature => 250,
+ MessageType::MessageType_ThpCreateNewSession => 251,
+ MessageType::MessageType_ThpCredentialRequest => 252,
+ MessageType::MessageType_ThpCredentialResponse => 253,
+ MessageType::MessageType_NostrGetPubkey => 254,
+ MessageType::MessageType_NostrPubkey => 255,
+ MessageType::MessageType_NostrSignEvent => 256,
+ MessageType::MessageType_NostrEventSignature => 257,
+ MessageType::MessageType_EvoluGetNode => 258,
+ MessageType::MessageType_EvoluNode => 259,
+ MessageType::MessageType_EvoluSignRegistrationRequest => 260,
+ MessageType::MessageType_EvoluRegistrationRequest => 261,
+ MessageType::MessageType_EvoluGetDelegatedIdentityKey => 262,
+ MessageType::MessageType_EvoluDelegatedIdentityKey => 263,
+ MessageType::MessageType_TronGetAddress => 264,
+ MessageType::MessageType_TronAddress => 265,
+ MessageType::MessageType_TronSignTx => 266,
+ MessageType::MessageType_TronSignature => 267,
+ MessageType::MessageType_TronContractRequest => 268,
+ MessageType::MessageType_TronTransferContract => 269,
+ MessageType::MessageType_TronTriggerSmartContract => 270,
+ MessageType::MessageType_TronFreezeBalanceV2Contract => 271,
+ MessageType::MessageType_TronUnfreezeBalanceV2Contract => 272,
+ MessageType::MessageType_TronWithdrawUnfreeze => 273,
+ MessageType::MessageType_TronVoteWitnessContract => 274,
+ MessageType::MessageType_BenchmarkListNames => 275,
+ MessageType::MessageType_BenchmarkNames => 276,
+ MessageType::MessageType_BenchmarkRun => 277,
+ MessageType::MessageType_BenchmarkResult => 278,
+ MessageType::MessageType_TelemetryGet => 279,
+ MessageType::MessageType_Telemetry => 280,
};
Self::enum_descriptor().value_by_index(index)
}
@@ -1758,7 +1764,7 @@ impl MessageType {
}
static file_descriptor_proto_data: &'static [u8] = b"\
- \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\x84b\
+ \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xb3b\
\n\x0bMessageType\x12(\n\x16MessageType_Initialize\x10\0\x1a\x0c\x80\xa6\
\x1d\x01\xb0\xb5\x18\x01\x90\xb5\x18\x01\x12\x1e\n\x10MessageType_Ping\
\x10\x01\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12%\n\x13MessageType_S\
@@ -2039,52 +2045,53 @@ static file_descriptor_proto_data: &'static [u8] = b"\
ageType_WebAuthnCredentials\x10\xa1\x06\x1a\x04\x98\xb5\x18\x01\x124\n)M\
essageType_WebAuthnAddResidentCredential\x10\xa2\x06\x1a\x04\x90\xb5\x18\
\x01\x127\n,MessageType_WebAuthnRemoveResidentCredential\x10\xa3\x06\x1a\
- \x04\x90\xb5\x18\x01\x12)\n\x1eMessageType_SolanaGetPublicKey\x10\x84\
- \x07\x1a\x04\x90\xb5\x18\x01\x12&\n\x1bMessageType_SolanaPublicKey\x10\
- \x85\x07\x1a\x04\x98\xb5\x18\x01\x12'\n\x1cMessageType_SolanaGetAddress\
- \x10\x86\x07\x1a\x04\x90\xb5\x18\x01\x12$\n\x19MessageType_SolanaAddress\
- \x10\x87\x07\x1a\x04\x98\xb5\x18\x01\x12#\n\x18MessageType_SolanaSignTx\
- \x10\x88\x07\x1a\x04\x90\xb5\x18\x01\x12(\n\x1dMessageType_SolanaTxSigna\
- ture\x10\x89\x07\x1a\x04\x98\xb5\x18\x01\x12*\n\x1fMessageType_ThpCreate\
- NewSession\x10\xe8\x07\x1a\x04\x80\xa6\x1d\x01\x12+\n\x20MessageType_Thp\
- CredentialRequest\x10\xf8\x07\x1a\x04\x80\xa6\x1d\x01\x12,\n!MessageType\
- _ThpCredentialResponse\x10\xf9\x07\x1a\x04\x80\xa6\x1d\x01\x12%\n\x1aMes\
- sageType_NostrGetPubkey\x10\xd1\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x17M\
- essageType_NostrPubkey\x10\xd2\x0f\x1a\x04\x98\xb5\x18\x01\x12%\n\x1aMes\
- sageType_NostrSignEvent\x10\xd3\x0f\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMe\
- ssageType_NostrEventSignature\x10\xd4\x0f\x1a\x04\x98\xb5\x18\x01\x12'\n\
- \x18MessageType_EvoluGetNode\x10\xb4\x10\x1a\x08\x80\xa6\x1d\x01\x90\xb5\
- \x18\x01\x12$\n\x15MessageType_EvoluNode\x10\xb5\x10\x1a\x08\x80\xa6\x1d\
- \x01\x98\xb5\x18\x01\x127\n(MessageType_EvoluSignRegistrationRequest\x10\
- \xb6\x10\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x123\n$MessageType_Evol\
- uRegistrationRequest\x10\xb7\x10\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\
- \x127\n(MessageType_EvoluGetDelegatedIdentityKey\x10\xb8\x10\x1a\x08\x80\
- \xa6\x1d\x01\x90\xb5\x18\x01\x124\n%MessageType_EvoluDelegatedIdentityKe\
- y\x10\xb9\x10\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12%\n\x1aMessageT\
- ype_TronGetAddress\x10\x98\x11\x1a\x04\x90\xb5\x18\x01\x12\"\n\x17Messag\
- eType_TronAddress\x10\x99\x11\x1a\x04\x98\xb5\x18\x01\x12!\n\x16MessageT\
- ype_TronSignTx\x10\x9a\x11\x1a\x04\x90\xb5\x18\x01\x12$\n\x19MessageType\
- _TronSignature\x10\x9b\x11\x1a\x04\x98\xb5\x18\x01\x12*\n\x1fMessageType\
- _TronContractRequest\x10\x9c\x11\x1a\x04\x98\xb5\x18\x01\x12+\n\x20Messa\
- geType_TronTransferContract\x10\x9d\x11\x1a\x04\x90\xb5\x18\x01\x12/\n$M\
- essageType_TronTriggerSmartContract\x10\x9e\x11\x1a\x04\x90\xb5\x18\x01\
- \x122\n'MessageType_TronFreezeBalanceV2Contract\x10\x9f\x11\x1a\x04\x90\
- \xb5\x18\x01\x124\n)MessageType_TronUnfreezeBalanceV2Contract\x10\xa0\
- \x11\x1a\x04\x90\xb5\x18\x01\x12+\n\x20MessageType_TronWithdrawUnfreeze\
- \x10\xa1\x11\x1a\x04\x90\xb5\x18\x01\x12.\n#MessageType_TronVoteWitnessC\
- ontract\x10\xa2\x11\x1a\x04\x90\xb5\x18\x01\x12)\n\x1eMessageType_Benchm\
- arkListNames\x10\x8cG\x1a\x04\x80\xa6\x1d\x01\x12%\n\x1aMessageType_Benc\
- hmarkNames\x10\x8dG\x1a\x04\x80\xa6\x1d\x01\x12#\n\x18MessageType_Benchm\
- arkRun\x10\x8eG\x1a\x04\x80\xa6\x1d\x01\x12&\n\x1bMessageType_BenchmarkR\
- esult\x10\x8fG\x1a\x04\x80\xa6\x1d\x01\x12'\n\x18MessageType_TelemetryGe\
- t\x10\xcc\x08\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12$\n\x15MessageT\
- ype_Telemetry\x10\xcd\x08\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x1a\
- \x08\xc8\xf3\x18\x01\xd0\xf3\x18\x01\"\x04\x08Z\x10\\\"\x04\x08G\x10J\"\
- \x04\x08r\x10z\"\x05\x08{\x10\x95\x01\"\x06\x08\xdb\x01\x10\xdb\x01\"\
- \x06\x08\xe0\x01\x10\xe0\x01\"\x06\x08\xac\x02\x10\xb0\x02\"\x06\x08\xb5\
- \x02\x10\xb8\x02\"\x06\x08\xbc\x05\x10\xc5\x05\"\x06\x08\xe9\x07\x10\xf7\
- \x07\"\x06\x08\xfa\x07\x10\xcb\x08B8\n#com.satoshilabs.trezor.lib.protob\
- ufB\rTrezorMessage\x80\xa6\x1d\x01\
+ \x04\x90\xb5\x18\x01\x12-\n\"MessageType_WebAuthnCredentialsAck\x10\xa4\
+ \x06\x1a\x04\x90\xb5\x18\x01\x12)\n\x1eMessageType_SolanaGetPublicKey\
+ \x10\x84\x07\x1a\x04\x90\xb5\x18\x01\x12&\n\x1bMessageType_SolanaPublicK\
+ ey\x10\x85\x07\x1a\x04\x98\xb5\x18\x01\x12'\n\x1cMessageType_SolanaGetAd\
+ dress\x10\x86\x07\x1a\x04\x90\xb5\x18\x01\x12$\n\x19MessageType_SolanaAd\
+ dress\x10\x87\x07\x1a\x04\x98\xb5\x18\x01\x12#\n\x18MessageType_SolanaSi\
+ gnTx\x10\x88\x07\x1a\x04\x90\xb5\x18\x01\x12(\n\x1dMessageType_SolanaTxS\
+ ignature\x10\x89\x07\x1a\x04\x98\xb5\x18\x01\x12*\n\x1fMessageType_ThpCr\
+ eateNewSession\x10\xe8\x07\x1a\x04\x80\xa6\x1d\x01\x12+\n\x20MessageType\
+ _ThpCredentialRequest\x10\xf8\x07\x1a\x04\x80\xa6\x1d\x01\x12,\n!Message\
+ Type_ThpCredentialResponse\x10\xf9\x07\x1a\x04\x80\xa6\x1d\x01\x12%\n\
+ \x1aMessageType_NostrGetPubkey\x10\xd1\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\
+ \n\x17MessageType_NostrPubkey\x10\xd2\x0f\x1a\x04\x98\xb5\x18\x01\x12%\n\
+ \x1aMessageType_NostrSignEvent\x10\xd3\x0f\x1a\x04\x90\xb5\x18\x01\x12*\
+ \n\x1fMessageType_NostrEventSignature\x10\xd4\x0f\x1a\x04\x98\xb5\x18\
+ \x01\x12'\n\x18MessageType_EvoluGetNode\x10\xb4\x10\x1a\x08\x80\xa6\x1d\
+ \x01\x90\xb5\x18\x01\x12$\n\x15MessageType_EvoluNode\x10\xb5\x10\x1a\x08\
+ \x80\xa6\x1d\x01\x98\xb5\x18\x01\x127\n(MessageType_EvoluSignRegistratio\
+ nRequest\x10\xb6\x10\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x123\n$Mess\
+ ageType_EvoluRegistrationRequest\x10\xb7\x10\x1a\x08\x80\xa6\x1d\x01\x98\
+ \xb5\x18\x01\x127\n(MessageType_EvoluGetDelegatedIdentityKey\x10\xb8\x10\
+ \x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x124\n%MessageType_EvoluDelegat\
+ edIdentityKey\x10\xb9\x10\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12%\n\
+ \x1aMessageType_TronGetAddress\x10\x98\x11\x1a\x04\x90\xb5\x18\x01\x12\"\
+ \n\x17MessageType_TronAddress\x10\x99\x11\x1a\x04\x98\xb5\x18\x01\x12!\n\
+ \x16MessageType_TronSignTx\x10\x9a\x11\x1a\x04\x90\xb5\x18\x01\x12$\n\
+ \x19MessageType_TronSignature\x10\x9b\x11\x1a\x04\x98\xb5\x18\x01\x12*\n\
+ \x1fMessageType_TronContractRequest\x10\x9c\x11\x1a\x04\x98\xb5\x18\x01\
+ \x12+\n\x20MessageType_TronTransferContract\x10\x9d\x11\x1a\x04\x90\xb5\
+ \x18\x01\x12/\n$MessageType_TronTriggerSmartContract\x10\x9e\x11\x1a\x04\
+ \x90\xb5\x18\x01\x122\n'MessageType_TronFreezeBalanceV2Contract\x10\x9f\
+ \x11\x1a\x04\x90\xb5\x18\x01\x124\n)MessageType_TronUnfreezeBalanceV2Con\
+ tract\x10\xa0\x11\x1a\x04\x90\xb5\x18\x01\x12+\n\x20MessageType_TronWith\
+ drawUnfreeze\x10\xa1\x11\x1a\x04\x90\xb5\x18\x01\x12.\n#MessageType_Tron\
+ VoteWitnessContract\x10\xa2\x11\x1a\x04\x90\xb5\x18\x01\x12)\n\x1eMessag\
+ eType_BenchmarkListNames\x10\x8cG\x1a\x04\x80\xa6\x1d\x01\x12%\n\x1aMess\
+ ageType_BenchmarkNames\x10\x8dG\x1a\x04\x80\xa6\x1d\x01\x12#\n\x18Messag\
+ eType_BenchmarkRun\x10\x8eG\x1a\x04\x80\xa6\x1d\x01\x12&\n\x1bMessageTyp\
+ e_BenchmarkResult\x10\x8fG\x1a\x04\x80\xa6\x1d\x01\x12'\n\x18MessageType\
+ _TelemetryGet\x10\xcc\x08\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12$\n\
+ \x15MessageType_Telemetry\x10\xcd\x08\x1a\x08\x80\xa6\x1d\x01\x98\xb5\
+ \x18\x01\x1a\x08\xc8\xf3\x18\x01\xd0\xf3\x18\x01\"\x04\x08Z\x10\\\"\x04\
+ \x08G\x10J\"\x04\x08r\x10z\"\x05\x08{\x10\x95\x01\"\x06\x08\xdb\x01\x10\
+ \xdb\x01\"\x06\x08\xe0\x01\x10\xe0\x01\"\x06\x08\xac\x02\x10\xb0\x02\"\
+ \x06\x08\xb5\x02\x10\xb8\x02\"\x06\x08\xbc\x05\x10\xc5\x05\"\x06\x08\xe9\
+ \x07\x10\xf7\x07\"\x06\x08\xfa\x07\x10\xcb\x08B8\n#com.satoshilabs.trezo\
+ r.lib.protobufB\rTrezorMessage\x80\xa6\x1d\x01\
";
/// `FileDescriptorProto` object which was a source for this generated file
diff --git a/rust/trezor-client/src/protos/generated/messages_webauthn.rs b/rust/trezor-client/src/protos/generated/messages_webauthn.rs
index b153adbc..143a0554 100644
--- a/rust/trezor-client/src/protos/generated/messages_webauthn.rs
+++ b/rust/trezor-client/src/protos/generated/messages_webauthn.rs
@@ -27,6 +27,9 @@ const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;
// @@protoc_insertion_point(message:hw.trezor.messages.webauthn.WebAuthnListResidentCredentials)
#[derive(PartialEq,Clone,Default,Debug)]
pub struct WebAuthnListResidentCredentials {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.webauthn.WebAuthnListResidentCredentials.batch_size)
+ pub batch_size: ::std::option::Option<u32>,
// special fields
// @@protoc_insertion_point(special_field:hw.trezor.messages.webauthn.WebAuthnListResidentCredentials.special_fields)
pub special_fields: ::protobuf::SpecialFields,
@@ -43,9 +46,33 @@ impl WebAuthnListResidentCredentials {
::std::default::Default::default()
}
+ // optional uint32 batch_size = 1;
+
+ pub fn batch_size(&self) -> u32 {
+ self.batch_size.unwrap_or(0)
+ }
+
+ pub fn clear_batch_size(&mut self) {
+ self.batch_size = ::std::option::Option::None;
+ }
+
+ pub fn has_batch_size(&self) -> bool {
+ self.batch_size.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_batch_size(&mut self, v: u32) {
+ self.batch_size = ::std::option::Option::Some(v);
+ }
+
fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
- let mut fields = ::std::vec::Vec::with_capacity(0);
+ let mut fields = ::std::vec::Vec::with_capacity(1);
let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "batch_size",
+ |m: &WebAuthnListResidentCredentials| { &m.batch_size },
+ |m: &mut WebAuthnListResidentCredentials| { &mut m.batch_size },
+ ));
::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<WebAuthnListResidentCredentials>(
"WebAuthnListResidentCredentials",
fields,
@@ -64,6 +91,9 @@ impl ::protobuf::Message for WebAuthnListResidentCredentials {
fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
while let Some(tag) = is.read_raw_tag_or_eof()? {
match tag {
+ 8 => {
+ self.batch_size = ::std::option::Option::Some(is.read_uint32()?);
+ },
tag => {
::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
},
@@ -76,12 +106,18 @@ impl ::protobuf::Message for WebAuthnListResidentCredentials {
#[allow(unused_variables)]
fn compute_size(&self) -> u64 {
let mut my_size = 0;
+ if let Some(v) = self.batch_size {
+ my_size += ::protobuf::rt::uint32_size(1, 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
}
fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+ if let Some(v) = self.batch_size {
+ os.write_uint32(1, v)?;
+ }
os.write_unknown_fields(self.special_fields.unknown_fields())?;
::std::result::Result::Ok(())
}
@@ -99,11 +135,13 @@ impl ::protobuf::Message for WebAuthnListResidentCredentials {
}
fn clear(&mut self) {
+ self.batch_size = ::std::option::Option::None;
self.special_fields.clear();
}
fn default_instance() -> &'static WebAuthnListResidentCredentials {
static instance: WebAuthnListResidentCredentials = WebAuthnListResidentCredentials {
+ batch_size: ::std::option::Option::None,
special_fields: ::protobuf::SpecialFields::new(),
};
&instance
@@ -432,6 +470,8 @@ pub struct WebAuthnCredentials {
// message fields
// @@protoc_insertion_point(field:hw.trezor.messages.webauthn.WebAuthnCredentials.credentials)
pub credentials: ::std::vec::Vec<web_authn_credentials::WebAuthnCredential>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.webauthn.WebAuthnCredentials.is_done)
+ pub is_done: ::std::option::Option<bool>,
// special fields
// @@protoc_insertion_point(special_field:hw.trezor.messages.webauthn.WebAuthnCredentials.special_fields)
pub special_fields: ::protobuf::SpecialFields,
@@ -448,14 +488,38 @@ impl WebAuthnCredentials {
::std::default::Default::default()
}
+ // optional bool is_done = 2;
+
+ pub fn is_done(&self) -> bool {
+ self.is_done.unwrap_or(true)
+ }
+
+ pub fn clear_is_done(&mut self) {
+ self.is_done = ::std::option::Option::None;
+ }
+
+ pub fn has_is_done(&self) -> bool {
+ self.is_done.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_is_done(&mut self, v: bool) {
+ self.is_done = ::std::option::Option::Some(v);
+ }
+
fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
- let mut fields = ::std::vec::Vec::with_capacity(1);
+ 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_vec_simpler_accessor::<_, _>(
"credentials",
|m: &WebAuthnCredentials| { &m.credentials },
|m: &mut WebAuthnCredentials| { &mut m.credentials },
));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "is_done",
+ |m: &WebAuthnCredentials| { &m.is_done },
+ |m: &mut WebAuthnCredentials| { &mut m.is_done },
+ ));
::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<WebAuthnCredentials>(
"WebAuthnCredentials",
fields,
@@ -477,6 +541,9 @@ impl ::protobuf::Message for WebAuthnCredentials {
10 => {
self.credentials.push(is.read_message()?);
},
+ 16 => {
+ self.is_done = ::std::option::Option::Some(is.read_bool()?);
+ },
tag => {
::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
},
@@ -493,6 +560,9 @@ impl ::protobuf::Message for WebAuthnCredentials {
let len = value.compute_size();
my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
};
+ if let Some(v) = self.is_done {
+ my_size += 1 + 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
@@ -502,6 +572,9 @@ impl ::protobuf::Message for WebAuthnCredentials {
for v in &self.credentials {
::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;
};
+ if let Some(v) = self.is_done {
+ os.write_bool(2, v)?;
+ }
os.write_unknown_fields(self.special_fields.unknown_fields())?;
::std::result::Result::Ok(())
}
@@ -520,12 +593,14 @@ impl ::protobuf::Message for WebAuthnCredentials {
fn clear(&mut self) {
self.credentials.clear();
+ self.is_done = ::std::option::Option::None;
self.special_fields.clear();
}
fn default_instance() -> &'static WebAuthnCredentials {
static instance: WebAuthnCredentials = WebAuthnCredentials {
credentials: ::std::vec::Vec::new(),
+ is_done: ::std::option::Option::None,
special_fields: ::protobuf::SpecialFields::new(),
};
&instance
@@ -1202,24 +1277,129 @@ pub mod web_authn_credentials {
}
}
+// @@protoc_insertion_point(message:hw.trezor.messages.webauthn.WebAuthnCredentialsAck)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct WebAuthnCredentialsAck {
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.webauthn.WebAuthnCredentialsAck.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a WebAuthnCredentialsAck {
+ fn default() -> &'a WebAuthnCredentialsAck {
+ <WebAuthnCredentialsAck as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl WebAuthnCredentialsAck {
+ pub fn new() -> WebAuthnCredentialsAck {
+ ::std::default::Default::default()
+ }
+
+ fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ let mut fields = ::std::vec::Vec::with_capacity(0);
+ let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<WebAuthnCredentialsAck>(
+ "WebAuthnCredentialsAck",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for WebAuthnCredentialsAck {
+ const NAME: &'static str = "WebAuthnCredentialsAck";
+
+ fn is_initialized(&self) -> bool {
+ true
+ }
+
+ fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+ while let Some(tag) = is.read_raw_tag_or_eof()? {
+ match tag {
+ tag => {
+ ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+ },
+ };
+ }
+ ::std::result::Result::Ok(())
+ }
+
+ // Compute sizes of nested messages
+ #[allow(unused_variables)]
+ fn compute_size(&self) -> u64 {
+ let mut my_size = 0;
+ my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+ self.special_fields.cached_size().set(my_size as u32);
+ my_size
+ }
+
+ fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+ os.write_unknown_fields(self.special_fields.unknown_fields())?;
+ ::std::result::Result::Ok(())
+ }
+
+ fn special_fields(&self) -> &::protobuf::SpecialFields {
+ &self.special_fields
+ }
+
+ fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+ &mut self.special_fields
+ }
+
+ fn new() -> WebAuthnCredentialsAck {
+ WebAuthnCredentialsAck::new()
+ }
+
+ fn clear(&mut self) {
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static WebAuthnCredentialsAck {
+ static instance: WebAuthnCredentialsAck = WebAuthnCredentialsAck {
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for WebAuthnCredentialsAck {
+ fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
+ static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
+ descriptor.get(|| file_descriptor().message_by_package_relative_name("WebAuthnCredentialsAck").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for WebAuthnCredentialsAck {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for WebAuthnCredentialsAck {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
static file_descriptor_proto_data: &'static [u8] = b"\
- \n\x17messages-webauthn.proto\x12\x1bhw.trezor.messages.webauthn\"!\n\
- \x1fWebAuthnListResidentCredentials\"D\n\x1dWebAuthnAddResidentCredentia\
- l\x12#\n\rcredential_id\x18\x01\x20\x01(\x0cR\x0ccredentialId\"8\n\x20We\
- bAuthnRemoveResidentCredential\x12\x14\n\x05index\x18\x01\x20\x01(\rR\
- \x05index\"\xe9\x03\n\x13WebAuthnCredentials\x12e\n\x0bcredentials\x18\
- \x01\x20\x03(\x0b2C.hw.trezor.messages.webauthn.WebAuthnCredentials.WebA\
- uthnCredentialR\x0bcredentials\x1a\xea\x02\n\x12WebAuthnCredential\x12\
- \x14\n\x05index\x18\x01\x20\x01(\rR\x05index\x12\x0e\n\x02id\x18\x02\x20\
- \x01(\x0cR\x02id\x12\x13\n\x05rp_id\x18\x03\x20\x01(\tR\x04rpId\x12\x17\
- \n\x07rp_name\x18\x04\x20\x01(\tR\x06rpName\x12\x17\n\x07user_id\x18\x05\
- \x20\x01(\x0cR\x06userId\x12\x1b\n\tuser_name\x18\x06\x20\x01(\tR\x08use\
- rName\x12*\n\x11user_display_name\x18\x07\x20\x01(\tR\x0fuserDisplayName\
- \x12#\n\rcreation_time\x18\x08\x20\x01(\rR\x0ccreationTime\x12\x1f\n\x0b\
- hmac_secret\x18\t\x20\x01(\x08R\nhmacSecret\x12$\n\x0euse_sign_count\x18\
- \n\x20\x01(\x08R\x0cuseSignCount\x12\x1c\n\talgorithm\x18\x0b\x20\x01(\
- \x11R\talgorithm\x12\x14\n\x05curve\x18\x0c\x20\x01(\x11R\x05curveB<\n#c\
- om.satoshilabs.trezor.lib.protobufB\x15TrezorMessageWebAuthn\
+ \n\x17messages-webauthn.proto\x12\x1bhw.trezor.messages.webauthn\"@\n\
+ \x1fWebAuthnListResidentCredentials\x12\x1d\n\nbatch_size\x18\x01\x20\
+ \x01(\rR\tbatchSize\"D\n\x1dWebAuthnAddResidentCredential\x12#\n\rcreden\
+ tial_id\x18\x01\x20\x01(\x0cR\x0ccredentialId\"8\n\x20WebAuthnRemoveResi\
+ dentCredential\x12\x14\n\x05index\x18\x01\x20\x01(\rR\x05index\"\x88\x04\
+ \n\x13WebAuthnCredentials\x12e\n\x0bcredentials\x18\x01\x20\x03(\x0b2C.h\
+ w.trezor.messages.webauthn.WebAuthnCredentials.WebAuthnCredentialR\x0bcr\
+ edentials\x12\x1d\n\x07is_done\x18\x02\x20\x01(\x08:\x04trueR\x06isDone\
+ \x1a\xea\x02\n\x12WebAuthnCredential\x12\x14\n\x05index\x18\x01\x20\x01(\
+ \rR\x05index\x12\x0e\n\x02id\x18\x02\x20\x01(\x0cR\x02id\x12\x13\n\x05rp\
+ _id\x18\x03\x20\x01(\tR\x04rpId\x12\x17\n\x07rp_name\x18\x04\x20\x01(\tR\
+ \x06rpName\x12\x17\n\x07user_id\x18\x05\x20\x01(\x0cR\x06userId\x12\x1b\
+ \n\tuser_name\x18\x06\x20\x01(\tR\x08userName\x12*\n\x11user_display_nam\
+ e\x18\x07\x20\x01(\tR\x0fuserDisplayName\x12#\n\rcreation_time\x18\x08\
+ \x20\x01(\rR\x0ccreationTime\x12\x1f\n\x0bhmac_secret\x18\t\x20\x01(\x08\
+ R\nhmacSecret\x12$\n\x0euse_sign_count\x18\n\x20\x01(\x08R\x0cuseSignCou\
+ nt\x12\x1c\n\talgorithm\x18\x0b\x20\x01(\x11R\talgorithm\x12\x14\n\x05cu\
+ rve\x18\x0c\x20\x01(\x11R\x05curve\"\x18\n\x16WebAuthnCredentialsAckB<\n\
+ #com.satoshilabs.trezor.lib.protobufB\x15TrezorMessageWebAuthn\
";
/// `FileDescriptorProto` object which was a source for this generated file
@@ -1237,11 +1417,12 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {
file_descriptor.get(|| {
let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
let mut deps = ::std::vec::Vec::with_capacity(0);
- let mut messages = ::std::vec::Vec::with_capacity(5);
+ let mut messages = ::std::vec::Vec::with_capacity(6);
messages.push(WebAuthnListResidentCredentials::generated_message_descriptor_data());
messages.push(WebAuthnAddResidentCredential::generated_message_descriptor_data());
messages.push(WebAuthnRemoveResidentCredential::generated_message_descriptor_data());
messages.push(WebAuthnCredentials::generated_message_descriptor_data());
+ messages.push(WebAuthnCredentialsAck::generated_message_descriptor_data());
messages.push(web_authn_credentials::WebAuthnCredential::generated_message_descriptor_data());
let mut enums = ::std::vec::Vec::with_capacity(0);
::protobuf::reflect::GeneratedFileDescriptor::new_generated(
Why this scored 21/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.