feat(common): introduce DebugLink-based N4W1 emulator messages
What changed, and why it matters
This commit only adds new message definitions for a debug-only feature called N4W1 emulator. It does not change any firmware logic, cryptographic code, or user-facing behavior. The messages are marked as DebugLink traffic, which is intended for testing and emulator use, not for production devices. There is no direct security vulnerability visible in this change, but adding debug interfaces always slightly increases the attack surface if those interfaces are accidentally reachable in production.
Treat this as a low-signal infrastructure change. When the corresponding handler implementation is committed, review it carefully for authorization, input validation, and whether the interface can be reached outside emulator/debug builds. Ensure DebugLink is disabled in release firmware and that these messages cannot be used to read or modify security-relevant storage.
Security signals we found
New DebugLink message types added to the wire protocol
Messages allow read/write/delete-like operations on key-value pairs over debug channel
Legacy firmware build explicitly skips these messages
No implementation of handlers or authorization checks present in this commit
DebugLink interfaces are generally disabled on production hardware
Evidence from the diff
The commit introduces four new protobuf messages (DebugLinkN4W1Connected, DebugLinkN4W1Write, DebugLinkN4W1Read, DebugLinkN4W1Response) and their generated bindings across Python, Rust, and legacy firmware build files. The messages are wired as DebugLink messages (wire_debug_in/wire_debug_out) and are explicitly skipped in the legacy firmware Makefile. No handler implementation, state machine changes, or storage logic are included in the diff. The actual security effect depends entirely on how these messages will be implemented in subsequent commits.
Changed components
common/protob/messages-debug.protocommon/protob/messages.protocore/src/trezor/enums/MessageType.pycore/src/trezor/enums/__init__.pycore/src/trezor/messages.pylegacy/firmware/protob/Makefilepython/src/trezorlib/messages.pyrust/trezor-client/src/messages/generated.rsrust/trezor-client/src/protos/generated/messages.rsrust/trezor-client/src/protos/generated/messages_debug.rsInspect captured patch +1011 / −184
diff --git a/common/protob/messages-debug.proto b/common/protob/messages-debug.proto
index 0df4378c..8a4888e3 100644
--- a/common/protob/messages-debug.proto
+++ b/common/protob/messages-debug.proto
@@ -298,3 +298,41 @@ message DebugLinkGcInfo {
message DebugLinkSetLogFilter {
optional string filter = 1; // filter string
}
+
+/**
+ * Request: Start N4W1 exchange over DebugLink (initiated by the host).
+ * Blocks until there is a N4W1 request to be handled.
+ * @start
+ * @next DebugLinkN4W1Read
+ * @next DebugLinkN4W1Write
+ */
+message DebugLinkN4W1Connected {}
+
+/**
+ * Request: Simulate N4W1 write over DebugLink (sent by the device).
+ * @start
+ * @next DebugLinkN4W1Response
+ */
+message DebugLinkN4W1Write {
+ optional string key = 1;
+ optional bytes value = 2; // if is None, the entry is deleted
+}
+
+/**
+ * Request: Simulate N4W1 read over DebugLink (sent by the device).
+ * @start
+ * @next DebugLinkN4W1Response
+ */
+message DebugLinkN4W1Read {
+ optional string key = 1;
+}
+
+/**
+ * Response: Simulate N4W1 read/write result over DebugLink (sent by the host).
+ * @next DebugLinkN4W1Read
+ * @next DebugLinkN4W1Write
+ * @next Success
+ */
+message DebugLinkN4W1Response {
+ optional bytes value = 1; // existing value is returned on write/delete, `None` if key is missing
+}
diff --git a/common/protob/messages.proto b/common/protob/messages.proto
index ac14439f..a8ade8b5 100644
--- a/common/protob/messages.proto
+++ b/common/protob/messages.proto
@@ -147,6 +147,10 @@ enum MessageType {
MessageType_DebugLinkGetPairingInfo = 9011 [(bitcoin_only) = true, (wire_debug_in) = true];
MessageType_DebugLinkPairingInfo = 9012 [(bitcoin_only) = true, (wire_debug_out) = true];
MessageType_DebugLinkSetLogFilter = 9013 [(bitcoin_only) = true, (wire_debug_in) = true];
+ MessageType_DebugLinkN4W1Connected = 9014 [(bitcoin_only) = true, (wire_debug_in) = true];
+ MessageType_DebugLinkN4W1Write = 9015 [(bitcoin_only) = true, (wire_debug_out) = true];
+ MessageType_DebugLinkN4W1Read = 9016 [(bitcoin_only) = true, (wire_debug_out) = true];
+ MessageType_DebugLinkN4W1Response = 9017 [(bitcoin_only) = true, (wire_debug_in) = true];
// Ethereum
MessageType_EthereumGetPublicKey = 450 [(wire_in) = true];
diff --git a/core/src/trezor/enums/MessageType.py b/core/src/trezor/enums/MessageType.py
index 992d420b..2da847ea 100644
--- a/core/src/trezor/enums/MessageType.py
+++ b/core/src/trezor/enums/MessageType.py
@@ -120,6 +120,10 @@ if __debug__:
DebugLinkGetPairingInfo = 9011
DebugLinkPairingInfo = 9012
DebugLinkSetLogFilter = 9013
+ DebugLinkN4W1Connected = 9014
+ DebugLinkN4W1Write = 9015
+ DebugLinkN4W1Read = 9016
+ DebugLinkN4W1Response = 9017
if utils.USE_THP:
ThpCreateNewSession = 1000
ThpCredentialRequest = 1016
diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py
index 11d21166..ef992782 100644
--- a/core/src/trezor/enums/__init__.py
+++ b/core/src/trezor/enums/__init__.py
@@ -492,6 +492,10 @@ if TYPE_CHECKING:
DebugLinkGetPairingInfo = 9011
DebugLinkPairingInfo = 9012
DebugLinkSetLogFilter = 9013
+ DebugLinkN4W1Connected = 9014
+ DebugLinkN4W1Write = 9015
+ DebugLinkN4W1Read = 9016
+ DebugLinkN4W1Response = 9017
EthereumGetPublicKey = 450
EthereumPublicKey = 451
EthereumGetAddress = 56
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index 0262829e..10f2fb67 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -3101,6 +3101,56 @@ if TYPE_CHECKING:
def is_type_of(cls, msg: Any) -> TypeGuard["DebugLinkSetLogFilter"]:
return isinstance(msg, cls)
+ class DebugLinkN4W1Connected(protobuf.MessageType):
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["DebugLinkN4W1Connected"]:
+ return isinstance(msg, cls)
+
+ class DebugLinkN4W1Write(protobuf.MessageType):
+ key: "str | None"
+ value: "AnyBytes | None"
+
+ def __init__(
+ self,
+ *,
+ key: "str | None" = None,
+ value: "AnyBytes | None" = None,
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["DebugLinkN4W1Write"]:
+ return isinstance(msg, cls)
+
+ class DebugLinkN4W1Read(protobuf.MessageType):
+ key: "str | None"
+
+ def __init__(
+ self,
+ *,
+ key: "str | None" = None,
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["DebugLinkN4W1Read"]:
+ return isinstance(msg, cls)
+
+ class DebugLinkN4W1Response(protobuf.MessageType):
+ value: "AnyBytes | None"
+
+ def __init__(
+ self,
+ *,
+ value: "AnyBytes | None" = None,
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["DebugLinkN4W1Response"]:
+ return isinstance(msg, cls)
+
class DebugLinkGcInfoItem(protobuf.MessageType):
name: "str"
value: "int"
diff --git a/legacy/firmware/protob/Makefile b/legacy/firmware/protob/Makefile
index 130604bd..08d1fc43 100644
--- a/legacy/firmware/protob/Makefile
+++ b/legacy/firmware/protob/Makefile
@@ -13,6 +13,7 @@ SKIPPED_MESSAGES := Cardano DebugMonero Eos Monero Ontology Ripple SdProtect Tez
Solana StellarClaimClaimableBalanceOp \
ChangeLanguage DataChunkRequest DataChunkAck Thp \
SetBrightness DebugLinkOptigaSetSecMax DebugLinkSetLogFilter \
+ DebugLinkN4W1Connected DebugLinkN4W1Read DebugLinkN4W1Write DebugLinkN4W1Response \
BenchmarkListNames BenchmarkRun BenchmarkNames BenchmarkResult \
NostrGetPubkey NostrPubkey NostrSignEvent NostrEventSignature \
BleUnpair PaymentNotification Evolu \
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index 583d12ec..aed97409 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -547,6 +547,10 @@ class MessageType(IntEnum):
DebugLinkGetPairingInfo = 9011
DebugLinkPairingInfo = 9012
DebugLinkSetLogFilter = 9013
+ DebugLinkN4W1Connected = 9014
+ DebugLinkN4W1Write = 9015
+ DebugLinkN4W1Read = 9016
+ DebugLinkN4W1Response = 9017
EthereumGetPublicKey = 450
EthereumPublicKey = 451
EthereumGetAddress = 56
@@ -4446,6 +4450,55 @@ class DebugLinkSetLogFilter(protobuf.MessageType):
self.filter = filter
+class DebugLinkN4W1Connected(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 9014
+
+
+class DebugLinkN4W1Write(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 9015
+ FIELDS = {
+ 1: protobuf.Field("key", "string", repeated=False, required=False, default=None),
+ 2: protobuf.Field("value", "bytes", repeated=False, required=False, default=None),
+ }
+
+ def __init__(
+ self,
+ *,
+ key: Optional["str"] = None,
+ value: Optional["bytes"] = None,
+ ) -> None:
+ self.key = key
+ self.value = value
+
+
+class DebugLinkN4W1Read(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 9016
+ FIELDS = {
+ 1: protobuf.Field("key", "string", repeated=False, required=False, default=None),
+ }
+
+ def __init__(
+ self,
+ *,
+ key: Optional["str"] = None,
+ ) -> None:
+ self.key = key
+
+
+class DebugLinkN4W1Response(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = 9017
+ FIELDS = {
+ 1: protobuf.Field("value", "bytes", repeated=False, required=False, default=None),
+ }
+
+ def __init__(
+ self,
+ *,
+ value: Optional["bytes"] = None,
+ ) -> None:
+ self.value = value
+
+
class DebugLinkGcInfoItem(protobuf.MessageType):
MESSAGE_WIRE_TYPE = None
FIELDS = {
diff --git a/rust/trezor-client/src/messages/generated.rs b/rust/trezor-client/src/messages/generated.rs
index 0762f381..46579024 100644
--- a/rust/trezor-client/src/messages/generated.rs
+++ b/rust/trezor-client/src/messages/generated.rs
@@ -92,6 +92,10 @@ trezor_message_impl! {
DebugLinkGetPairingInfo => MessageType_DebugLinkGetPairingInfo,
DebugLinkPairingInfo => MessageType_DebugLinkPairingInfo,
DebugLinkSetLogFilter => MessageType_DebugLinkSetLogFilter,
+ DebugLinkN4W1Connected => MessageType_DebugLinkN4W1Connected,
+ DebugLinkN4W1Write => MessageType_DebugLinkN4W1Write,
+ DebugLinkN4W1Read => MessageType_DebugLinkN4W1Read,
+ DebugLinkN4W1Response => MessageType_DebugLinkN4W1Response,
ThpCreateNewSession => MessageType_ThpCreateNewSession,
ThpCredentialRequest => MessageType_ThpCredentialRequest,
ThpCredentialResponse => MessageType_ThpCredentialResponse,
diff --git a/rust/trezor-client/src/protos/generated/messages.rs b/rust/trezor-client/src/protos/generated/messages.rs
index 303447af..d9ac6b65 100644
--- a/rust/trezor-client/src/protos/generated/messages.rs
+++ b/rust/trezor-client/src/protos/generated/messages.rs
@@ -243,6 +243,14 @@ pub enum MessageType {
MessageType_DebugLinkPairingInfo = 9012,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_DebugLinkSetLogFilter)
MessageType_DebugLinkSetLogFilter = 9013,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_DebugLinkN4W1Connected)
+ MessageType_DebugLinkN4W1Connected = 9014,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_DebugLinkN4W1Write)
+ MessageType_DebugLinkN4W1Write = 9015,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_DebugLinkN4W1Read)
+ MessageType_DebugLinkN4W1Read = 9016,
+ // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_DebugLinkN4W1Response)
+ MessageType_DebugLinkN4W1Response = 9017,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_EthereumGetPublicKey)
MessageType_EthereumGetPublicKey = 450,
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_EthereumPublicKey)
@@ -698,6 +706,10 @@ impl ::protobuf::Enum for MessageType {
9011 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkGetPairingInfo),
9012 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkPairingInfo),
9013 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkSetLogFilter),
+ 9014 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkN4W1Connected),
+ 9015 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkN4W1Write),
+ 9016 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkN4W1Read),
+ 9017 => ::std::option::Option::Some(MessageType::MessageType_DebugLinkN4W1Response),
450 => ::std::option::Option::Some(MessageType::MessageType_EthereumGetPublicKey),
451 => ::std::option::Option::Some(MessageType::MessageType_EthereumPublicKey),
56 => ::std::option::Option::Some(MessageType::MessageType_EthereumGetAddress),
@@ -980,6 +992,10 @@ impl ::protobuf::Enum for MessageType {
"MessageType_DebugLinkGetPairingInfo" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkGetPairingInfo),
"MessageType_DebugLinkPairingInfo" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkPairingInfo),
"MessageType_DebugLinkSetLogFilter" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkSetLogFilter),
+ "MessageType_DebugLinkN4W1Connected" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkN4W1Connected),
+ "MessageType_DebugLinkN4W1Write" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkN4W1Write),
+ "MessageType_DebugLinkN4W1Read" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkN4W1Read),
+ "MessageType_DebugLinkN4W1Response" => ::std::option::Option::Some(MessageType::MessageType_DebugLinkN4W1Response),
"MessageType_EthereumGetPublicKey" => ::std::option::Option::Some(MessageType::MessageType_EthereumGetPublicKey),
"MessageType_EthereumPublicKey" => ::std::option::Option::Some(MessageType::MessageType_EthereumPublicKey),
"MessageType_EthereumGetAddress" => ::std::option::Option::Some(MessageType::MessageType_EthereumGetAddress),
@@ -1261,6 +1277,10 @@ impl ::protobuf::Enum for MessageType {
MessageType::MessageType_DebugLinkGetPairingInfo,
MessageType::MessageType_DebugLinkPairingInfo,
MessageType::MessageType_DebugLinkSetLogFilter,
+ MessageType::MessageType_DebugLinkN4W1Connected,
+ MessageType::MessageType_DebugLinkN4W1Write,
+ MessageType::MessageType_DebugLinkN4W1Read,
+ MessageType::MessageType_DebugLinkN4W1Response,
MessageType::MessageType_EthereumGetPublicKey,
MessageType::MessageType_EthereumPublicKey,
MessageType::MessageType_EthereumGetAddress,
@@ -1548,174 +1568,178 @@ impl ::protobuf::EnumFull for MessageType {
MessageType::MessageType_DebugLinkGetPairingInfo => 105,
MessageType::MessageType_DebugLinkPairingInfo => 106,
MessageType::MessageType_DebugLinkSetLogFilter => 107,
- MessageType::MessageType_EthereumGetPublicKey => 108,
- MessageType::MessageType_EthereumPublicKey => 109,
- MessageType::MessageType_EthereumGetAddress => 110,
- MessageType::MessageType_EthereumAddress => 111,
- MessageType::MessageType_EthereumSignTx => 112,
- MessageType::MessageType_EthereumSignTxEIP1559 => 113,
- MessageType::MessageType_EthereumTxRequest => 114,
- MessageType::MessageType_EthereumTxAck => 115,
- MessageType::MessageType_EthereumSignMessage => 116,
- MessageType::MessageType_EthereumVerifyMessage => 117,
- MessageType::MessageType_EthereumMessageSignature => 118,
- MessageType::MessageType_EthereumSignTypedData => 119,
- MessageType::MessageType_EthereumTypedDataStructRequest => 120,
- MessageType::MessageType_EthereumTypedDataStructAck => 121,
- MessageType::MessageType_EthereumTypedDataValueRequest => 122,
- MessageType::MessageType_EthereumTypedDataValueAck => 123,
- MessageType::MessageType_EthereumTypedDataSignature => 124,
- MessageType::MessageType_EthereumSignTypedHash => 125,
- MessageType::MessageType_NEMGetAddress => 126,
- MessageType::MessageType_NEMAddress => 127,
- MessageType::MessageType_NEMSignTx => 128,
- MessageType::MessageType_NEMSignedTx => 129,
- MessageType::MessageType_NEMDecryptMessage => 130,
- MessageType::MessageType_NEMDecryptedMessage => 131,
- MessageType::MessageType_TezosGetAddress => 132,
- MessageType::MessageType_TezosAddress => 133,
- MessageType::MessageType_TezosSignTx => 134,
- MessageType::MessageType_TezosSignedTx => 135,
- MessageType::MessageType_TezosGetPublicKey => 136,
- MessageType::MessageType_TezosPublicKey => 137,
- MessageType::MessageType_StellarSignTx => 138,
- MessageType::MessageType_StellarTxOpRequest => 139,
- MessageType::MessageType_StellarGetAddress => 140,
- MessageType::MessageType_StellarAddress => 141,
- MessageType::MessageType_StellarCreateAccountOp => 142,
- MessageType::MessageType_StellarPaymentOp => 143,
- MessageType::MessageType_StellarPathPaymentStrictReceiveOp => 144,
- MessageType::MessageType_StellarManageSellOfferOp => 145,
- MessageType::MessageType_StellarCreatePassiveSellOfferOp => 146,
- MessageType::MessageType_StellarSetOptionsOp => 147,
- MessageType::MessageType_StellarChangeTrustOp => 148,
- MessageType::MessageType_StellarAllowTrustOp => 149,
- MessageType::MessageType_StellarAccountMergeOp => 150,
- MessageType::MessageType_StellarManageDataOp => 151,
- MessageType::MessageType_StellarBumpSequenceOp => 152,
- MessageType::MessageType_StellarManageBuyOfferOp => 153,
- MessageType::MessageType_StellarPathPaymentStrictSendOp => 154,
- MessageType::MessageType_StellarClaimClaimableBalanceOp => 155,
- MessageType::MessageType_StellarSignedTx => 156,
- MessageType::MessageType_CardanoGetPublicKey => 157,
- MessageType::MessageType_CardanoPublicKey => 158,
- MessageType::MessageType_CardanoGetAddress => 159,
- MessageType::MessageType_CardanoAddress => 160,
- MessageType::MessageType_CardanoTxItemAck => 161,
- MessageType::MessageType_CardanoTxAuxiliaryDataSupplement => 162,
- MessageType::MessageType_CardanoTxWitnessRequest => 163,
- MessageType::MessageType_CardanoTxWitnessResponse => 164,
- MessageType::MessageType_CardanoTxHostAck => 165,
- MessageType::MessageType_CardanoTxBodyHash => 166,
- MessageType::MessageType_CardanoSignTxFinished => 167,
- MessageType::MessageType_CardanoSignTxInit => 168,
- MessageType::MessageType_CardanoTxInput => 169,
- MessageType::MessageType_CardanoTxOutput => 170,
- MessageType::MessageType_CardanoAssetGroup => 171,
- MessageType::MessageType_CardanoToken => 172,
- MessageType::MessageType_CardanoTxCertificate => 173,
- MessageType::MessageType_CardanoTxWithdrawal => 174,
- MessageType::MessageType_CardanoTxAuxiliaryData => 175,
- MessageType::MessageType_CardanoPoolOwner => 176,
- MessageType::MessageType_CardanoPoolRelayParameters => 177,
- MessageType::MessageType_CardanoGetNativeScriptHash => 178,
- MessageType::MessageType_CardanoNativeScriptHash => 179,
- MessageType::MessageType_CardanoTxMint => 180,
- MessageType::MessageType_CardanoTxCollateralInput => 181,
- MessageType::MessageType_CardanoTxRequiredSigner => 182,
- MessageType::MessageType_CardanoTxInlineDatumChunk => 183,
- MessageType::MessageType_CardanoTxReferenceScriptChunk => 184,
- MessageType::MessageType_CardanoTxReferenceInput => 185,
- MessageType::MessageType_CardanoSignMessageInit => 186,
- MessageType::MessageType_CardanoMessageDataRequest => 187,
- MessageType::MessageType_CardanoMessageDataResponse => 188,
- MessageType::MessageType_CardanoMessageSignature => 189,
- MessageType::MessageType_RippleGetAddress => 190,
- MessageType::MessageType_RippleAddress => 191,
- MessageType::MessageType_RippleSignTx => 192,
- MessageType::MessageType_RippleSignedTx => 193,
- MessageType::MessageType_MoneroTransactionInitRequest => 194,
- MessageType::MessageType_MoneroTransactionInitAck => 195,
- MessageType::MessageType_MoneroTransactionSetInputRequest => 196,
- MessageType::MessageType_MoneroTransactionSetInputAck => 197,
- MessageType::MessageType_MoneroTransactionInputViniRequest => 198,
- MessageType::MessageType_MoneroTransactionInputViniAck => 199,
- MessageType::MessageType_MoneroTransactionAllInputsSetRequest => 200,
- MessageType::MessageType_MoneroTransactionAllInputsSetAck => 201,
- MessageType::MessageType_MoneroTransactionSetOutputRequest => 202,
- MessageType::MessageType_MoneroTransactionSetOutputAck => 203,
- MessageType::MessageType_MoneroTransactionAllOutSetRequest => 204,
- MessageType::MessageType_MoneroTransactionAllOutSetAck => 205,
- MessageType::MessageType_MoneroTransactionSignInputRequest => 206,
- MessageType::MessageType_MoneroTransactionSignInputAck => 207,
- MessageType::MessageType_MoneroTransactionFinalRequest => 208,
- MessageType::MessageType_MoneroTransactionFinalAck => 209,
- MessageType::MessageType_MoneroKeyImageExportInitRequest => 210,
- MessageType::MessageType_MoneroKeyImageExportInitAck => 211,
- MessageType::MessageType_MoneroKeyImageSyncStepRequest => 212,
- MessageType::MessageType_MoneroKeyImageSyncStepAck => 213,
- MessageType::MessageType_MoneroKeyImageSyncFinalRequest => 214,
- MessageType::MessageType_MoneroKeyImageSyncFinalAck => 215,
- MessageType::MessageType_MoneroGetAddress => 216,
- MessageType::MessageType_MoneroAddress => 217,
- MessageType::MessageType_MoneroGetWatchKey => 218,
- MessageType::MessageType_MoneroWatchKey => 219,
- MessageType::MessageType_DebugMoneroDiagRequest => 220,
- MessageType::MessageType_DebugMoneroDiagAck => 221,
- MessageType::MessageType_MoneroGetTxKeyRequest => 222,
- MessageType::MessageType_MoneroGetTxKeyAck => 223,
- MessageType::MessageType_MoneroLiveRefreshStartRequest => 224,
- MessageType::MessageType_MoneroLiveRefreshStartAck => 225,
- MessageType::MessageType_MoneroLiveRefreshStepRequest => 226,
- MessageType::MessageType_MoneroLiveRefreshStepAck => 227,
- MessageType::MessageType_MoneroLiveRefreshFinalRequest => 228,
- MessageType::MessageType_MoneroLiveRefreshFinalAck => 229,
- MessageType::MessageType_EosGetPublicKey => 230,
- MessageType::MessageType_EosPublicKey => 231,
- MessageType::MessageType_EosSignTx => 232,
- MessageType::MessageType_EosTxActionRequest => 233,
- MessageType::MessageType_EosTxActionAck => 234,
- MessageType::MessageType_EosSignedTx => 235,
- MessageType::MessageType_WebAuthnListResidentCredentials => 236,
- MessageType::MessageType_WebAuthnCredentials => 237,
- MessageType::MessageType_WebAuthnAddResidentCredential => 238,
- MessageType::MessageType_WebAuthnRemoveResidentCredential => 239,
- MessageType::MessageType_SolanaGetPublicKey => 240,
- MessageType::MessageType_SolanaPublicKey => 241,
- MessageType::MessageType_SolanaGetAddress => 242,
- MessageType::MessageType_SolanaAddress => 243,
- MessageType::MessageType_SolanaSignTx => 244,
- MessageType::MessageType_SolanaTxSignature => 245,
- MessageType::MessageType_ThpCreateNewSession => 246,
- MessageType::MessageType_ThpCredentialRequest => 247,
- MessageType::MessageType_ThpCredentialResponse => 248,
- MessageType::MessageType_NostrGetPubkey => 249,
- MessageType::MessageType_NostrPubkey => 250,
- MessageType::MessageType_NostrSignEvent => 251,
- MessageType::MessageType_NostrEventSignature => 252,
- MessageType::MessageType_EvoluGetNode => 253,
- MessageType::MessageType_EvoluNode => 254,
- MessageType::MessageType_EvoluSignRegistrationRequest => 255,
- MessageType::MessageType_EvoluRegistrationRequest => 256,
- MessageType::MessageType_EvoluGetDelegatedIdentityKey => 257,
- MessageType::MessageType_EvoluDelegatedIdentityKey => 258,
- MessageType::MessageType_TronGetAddress => 259,
- MessageType::MessageType_TronAddress => 260,
- MessageType::MessageType_TronSignTx => 261,
- MessageType::MessageType_TronSignature => 262,
- MessageType::MessageType_TronContractRequest => 263,
- MessageType::MessageType_TronTransferContract => 264,
- MessageType::MessageType_TronTriggerSmartContract => 265,
- MessageType::MessageType_TronFreezeBalanceV2Contract => 266,
- MessageType::MessageType_TronUnfreezeBalanceV2Contract => 267,
- MessageType::MessageType_TronWithdrawUnfreeze => 268,
- MessageType::MessageType_TronVoteWitnessContract => 269,
- MessageType::MessageType_BenchmarkListNames => 270,
- MessageType::MessageType_BenchmarkNames => 271,
- MessageType::MessageType_BenchmarkRun => 272,
- MessageType::MessageType_BenchmarkResult => 273,
- MessageType::MessageType_TelemetryGet => 274,
- MessageType::MessageType_Telemetry => 275,
+ MessageType::MessageType_DebugLinkN4W1Connected => 108,
+ MessageType::MessageType_DebugLinkN4W1Write => 109,
+ MessageType::MessageType_DebugLinkN4W1Read => 110,
+ MessageType::MessageType_DebugLinkN4W1Response => 111,
+ MessageType::MessageType_EthereumGetPublicKey => 112,
+ MessageType::MessageType_EthereumPublicKey => 113,
+ MessageType::MessageType_EthereumGetAddress => 114,
+ MessageType::MessageType_EthereumAddress => 115,
+ MessageType::MessageType_EthereumSignTx => 116,
+ MessageType::MessageType_EthereumSignTxEIP1559 => 117,
+ MessageType::MessageType_EthereumTxRequest => 118,
+ MessageType::MessageType_EthereumTxAck => 119,
+ MessageType::MessageType_EthereumSignMessage => 120,
+ MessageType::MessageType_EthereumVerifyMessage => 121,
+ MessageType::MessageType_EthereumMessageSignature => 122,
+ MessageType::MessageType_EthereumSignTypedData => 123,
+ MessageType::MessageType_EthereumTypedDataStructRequest => 124,
+ MessageType::MessageType_EthereumTypedDataStructAck => 125,
+ MessageType::MessageType_EthereumTypedDataValueRequest => 126,
+ MessageType::MessageType_EthereumTypedDataValueAck => 127,
+ MessageType::MessageType_EthereumTypedDataSignature => 128,
+ MessageType::MessageType_EthereumSignTypedHash => 129,
+ MessageType::MessageType_NEMGetAddress => 130,
+ MessageType::MessageType_NEMAddress => 131,
+ MessageType::MessageType_NEMSignTx => 132,
+ MessageType::MessageType_NEMSignedTx => 133,
+ MessageType::MessageType_NEMDecryptMessage => 134,
+ MessageType::MessageType_NEMDecryptedMessage => 135,
+ MessageType::MessageType_TezosGetAddress => 136,
+ MessageType::MessageType_TezosAddress => 137,
+ MessageType::MessageType_TezosSignTx => 138,
+ MessageType::MessageType_TezosSignedTx => 139,
+ MessageType::MessageType_TezosGetPublicKey => 140,
+ MessageType::MessageType_TezosPublicKey => 141,
+ MessageType::MessageType_StellarSignTx => 142,
+ MessageType::MessageType_StellarTxOpRequest => 143,
+ MessageType::MessageType_StellarGetAddress => 144,
+ MessageType::MessageType_StellarAddress => 145,
+ MessageType::MessageType_StellarCreateAccountOp => 146,
+ MessageType::MessageType_StellarPaymentOp => 147,
+ MessageType::MessageType_StellarPathPaymentStrictReceiveOp => 148,
+ MessageType::MessageType_StellarManageSellOfferOp => 149,
+ MessageType::MessageType_StellarCreatePassiveSellOfferOp => 150,
+ MessageType::MessageType_StellarSetOptionsOp => 151,
+ MessageType::MessageType_StellarChangeTrustOp => 152,
+ MessageType::MessageType_StellarAllowTrustOp => 153,
+ MessageType::MessageType_StellarAccountMergeOp => 154,
+ MessageType::MessageType_StellarManageDataOp => 155,
+ MessageType::MessageType_StellarBumpSequenceOp => 156,
+ MessageType::MessageType_StellarManageBuyOfferOp => 157,
+ MessageType::MessageType_StellarPathPaymentStrictSendOp => 158,
+ MessageType::MessageType_StellarClaimClaimableBalanceOp => 159,
+ MessageType::MessageType_StellarSignedTx => 160,
+ MessageType::MessageType_CardanoGetPublicKey => 161,
+ MessageType::MessageType_CardanoPublicKey => 162,
+ MessageType::MessageType_CardanoGetAddress => 163,
+ MessageType::MessageType_CardanoAddress => 164,
+ MessageType::MessageType_CardanoTxItemAck => 165,
+ MessageType::MessageType_CardanoTxAuxiliaryDataSupplement => 166,
+ MessageType::MessageType_CardanoTxWitnessRequest => 167,
+ MessageType::MessageType_CardanoTxWitnessResponse => 168,
+ MessageType::MessageType_CardanoTxHostAck => 169,
+ MessageType::MessageType_CardanoTxBodyHash => 170,
+ MessageType::MessageType_CardanoSignTxFinished => 171,
+ MessageType::MessageType_CardanoSignTxInit => 172,
+ MessageType::MessageType_CardanoTxInput => 173,
+ MessageType::MessageType_CardanoTxOutput => 174,
+ MessageType::MessageType_CardanoAssetGroup => 175,
+ MessageType::MessageType_CardanoToken => 176,
+ MessageType::MessageType_CardanoTxCertificate => 177,
+ MessageType::MessageType_CardanoTxWithdrawal => 178,
+ MessageType::MessageType_CardanoTxAuxiliaryData => 179,
+ MessageType::MessageType_CardanoPoolOwner => 180,
+ MessageType::MessageType_CardanoPoolRelayParameters => 181,
+ MessageType::MessageType_CardanoGetNativeScriptHash => 182,
+ MessageType::MessageType_CardanoNativeScriptHash => 183,
+ MessageType::MessageType_CardanoTxMint => 184,
+ MessageType::MessageType_CardanoTxCollateralInput => 185,
+ MessageType::MessageType_CardanoTxRequiredSigner => 186,
+ MessageType::MessageType_CardanoTxInlineDatumChunk => 187,
+ MessageType::MessageType_CardanoTxReferenceScriptChunk => 188,
+ MessageType::MessageType_CardanoTxReferenceInput => 189,
+ MessageType::MessageType_CardanoSignMessageInit => 190,
+ MessageType::MessageType_CardanoMessageDataRequest => 191,
+ MessageType::MessageType_CardanoMessageDataResponse => 192,
+ MessageType::MessageType_CardanoMessageSignature => 193,
+ MessageType::MessageType_RippleGetAddress => 194,
+ MessageType::MessageType_RippleAddress => 195,
+ MessageType::MessageType_RippleSignTx => 196,
+ MessageType::MessageType_RippleSignedTx => 197,
+ MessageType::MessageType_MoneroTransactionInitRequest => 198,
+ MessageType::MessageType_MoneroTransactionInitAck => 199,
+ MessageType::MessageType_MoneroTransactionSetInputRequest => 200,
+ MessageType::MessageType_MoneroTransactionSetInputAck => 201,
+ MessageType::MessageType_MoneroTransactionInputViniRequest => 202,
+ MessageType::MessageType_MoneroTransactionInputViniAck => 203,
+ MessageType::MessageType_MoneroTransactionAllInputsSetRequest => 204,
+ MessageType::MessageType_MoneroTransactionAllInputsSetAck => 205,
+ MessageType::MessageType_MoneroTransactionSetOutputRequest => 206,
+ MessageType::MessageType_MoneroTransactionSetOutputAck => 207,
+ MessageType::MessageType_MoneroTransactionAllOutSetRequest => 208,
+ MessageType::MessageType_MoneroTransactionAllOutSetAck => 209,
+ MessageType::MessageType_MoneroTransactionSignInputRequest => 210,
+ MessageType::MessageType_MoneroTransactionSignInputAck => 211,
+ MessageType::MessageType_MoneroTransactionFinalRequest => 212,
+ MessageType::MessageType_MoneroTransactionFinalAck => 213,
+ MessageType::MessageType_MoneroKeyImageExportInitRequest => 214,
+ MessageType::MessageType_MoneroKeyImageExportInitAck => 215,
+ MessageType::MessageType_MoneroKeyImageSyncStepRequest => 216,
+ MessageType::MessageType_MoneroKeyImageSyncStepAck => 217,
+ MessageType::MessageType_MoneroKeyImageSyncFinalRequest => 218,
+ MessageType::MessageType_MoneroKeyImageSyncFinalAck => 219,
+ MessageType::MessageType_MoneroGetAddress => 220,
+ MessageType::MessageType_MoneroAddress => 221,
+ MessageType::MessageType_MoneroGetWatchKey => 222,
+ MessageType::MessageType_MoneroWatchKey => 223,
+ MessageType::MessageType_DebugMoneroDiagRequest => 224,
+ MessageType::MessageType_DebugMoneroDiagAck => 225,
+ MessageType::MessageType_MoneroGetTxKeyRequest => 226,
+ MessageType::MessageType_MoneroGetTxKeyAck => 227,
+ MessageType::MessageType_MoneroLiveRefreshStartRequest => 228,
+ MessageType::MessageType_MoneroLiveRefreshStartAck => 229,
+ MessageType::MessageType_MoneroLiveRefreshStepRequest => 230,
+ MessageType::MessageType_MoneroLiveRefreshStepAck => 231,
+ MessageType::MessageType_MoneroLiveRefreshFinalRequest => 232,
+ MessageType::MessageType_MoneroLiveRefreshFinalAck => 233,
+ MessageType::MessageType_EosGetPublicKey => 234,
+ MessageType::MessageType_EosPublicKey => 235,
+ MessageType::MessageType_EosSignTx => 236,
+ MessageType::MessageType_EosTxActionRequest => 237,
+ MessageType::MessageType_EosTxActionAck => 238,
+ MessageType::MessageType_EosSignedTx => 239,
+ MessageType::MessageType_WebAuthnListResidentCredentials => 240,
+ 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,
};
Self::enum_descriptor().value_by_index(index)
}
@@ -1734,7 +1758,7 @@ impl MessageType {
}
static file_descriptor_proto_data: &'static [u8] = b"\
- \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xc2`\
+ \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\x84b\
\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\
@@ -1865,18 +1889,23 @@ static file_descriptor_proto_data: &'static [u8] = b"\
nfo\x10\xb3F\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12/\n\x20MessageTy\
pe_DebugLinkPairingInfo\x10\xb4F\x1a\x08\x80\xa6\x1d\x01\xa8\xb5\x18\x01\
\x120\n!MessageType_DebugLinkSetLogFilter\x10\xb5F\x1a\x08\x80\xa6\x1d\
- \x01\xa0\xb5\x18\x01\x12+\n\x20MessageType_EthereumGetPublicKey\x10\xc2\
- \x03\x1a\x04\x90\xb5\x18\x01\x12(\n\x1dMessageType_EthereumPublicKey\x10\
- \xc3\x03\x1a\x04\x98\xb5\x18\x01\x12(\n\x1eMessageType_EthereumGetAddres\
- s\x108\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_EthereumAddress\x10\
- 9\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EthereumSignTx\x10:\x1a\
- \x04\x90\xb5\x18\x01\x12,\n!MessageType_EthereumSignTxEIP1559\x10\xc4\
- \x03\x1a\x04\x90\xb5\x18\x01\x12'\n\x1dMessageType_EthereumTxRequest\x10\
- ;\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_EthereumTxAck\x10<\x1a\
- \x04\x90\xb5\x18\x01\x12)\n\x1fMessageType_EthereumSignMessage\x10@\x1a\
- \x04\x90\xb5\x18\x01\x12+\n!MessageType_EthereumVerifyMessage\x10A\x1a\
- \x04\x90\xb5\x18\x01\x12.\n$MessageType_EthereumMessageSignature\x10B\
- \x1a\x04\x98\xb5\x18\x01\x12,\n!MessageType_EthereumSignTypedData\x10\
+ \x01\xa0\xb5\x18\x01\x121\n\"MessageType_DebugLinkN4W1Connected\x10\xb6F\
+ \x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12-\n\x1eMessageType_DebugLink\
+ N4W1Write\x10\xb7F\x1a\x08\x80\xa6\x1d\x01\xa8\xb5\x18\x01\x12,\n\x1dMes\
+ sageType_DebugLinkN4W1Read\x10\xb8F\x1a\x08\x80\xa6\x1d\x01\xa8\xb5\x18\
+ \x01\x120\n!MessageType_DebugLinkN4W1Response\x10\xb9F\x1a\x08\x80\xa6\
+ \x1d\x01\xa0\xb5\x18\x01\x12+\n\x20MessageType_EthereumGetPublicKey\x10\
+ \xc2\x03\x1a\x04\x90\xb5\x18\x01\x12(\n\x1dMessageType_EthereumPublicKey\
+ \x10\xc3\x03\x1a\x04\x98\xb5\x18\x01\x12(\n\x1eMessageType_EthereumGetAd\
+ dress\x108\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_EthereumAddress\
+ \x109\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EthereumSignTx\x10:\
+ \x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType_EthereumSignTxEIP1559\x10\
+ \xc4\x03\x1a\x04\x90\xb5\x18\x01\x12'\n\x1dMessageType_EthereumTxRequest\
+ \x10;\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_EthereumTxAck\x10<\
+ \x1a\x04\x90\xb5\x18\x01\x12)\n\x1fMessageType_EthereumSignMessage\x10@\
+ \x1a\x04\x90\xb5\x18\x01\x12+\n!MessageType_EthereumVerifyMessage\x10A\
+ \x1a\x04\x90\xb5\x18\x01\x12.\n$MessageType_EthereumMessageSignature\x10\
+ B\x1a\x04\x98\xb5\x18\x01\x12,\n!MessageType_EthereumSignTypedData\x10\
\xd0\x03\x1a\x04\x90\xb5\x18\x01\x125\n*MessageType_EthereumTypedDataStr\
uctRequest\x10\xd1\x03\x1a\x04\x98\xb5\x18\x01\x121\n&MessageType_Ethere\
umTypedDataStructAck\x10\xd2\x03\x1a\x04\x90\xb5\x18\x01\x124\n)MessageT\
diff --git a/rust/trezor-client/src/protos/generated/messages_debug.rs b/rust/trezor-client/src/protos/generated/messages_debug.rs
index da5059f2..d34c7d50 100644
--- a/rust/trezor-client/src/protos/generated/messages_debug.rs
+++ b/rust/trezor-client/src/protos/generated/messages_debug.rs
@@ -4989,6 +4989,637 @@ impl ::protobuf::reflect::ProtobufValue for DebugLinkSetLogFilter {
type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
}
+// @@protoc_insertion_point(message:hw.trezor.messages.debug.DebugLinkN4W1Connected)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct DebugLinkN4W1Connected {
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.debug.DebugLinkN4W1Connected.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a DebugLinkN4W1Connected {
+ fn default() -> &'a DebugLinkN4W1Connected {
+ <DebugLinkN4W1Connected as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl DebugLinkN4W1Connected {
+ pub fn new() -> DebugLinkN4W1Connected {
+ ::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::<DebugLinkN4W1Connected>(
+ "DebugLinkN4W1Connected",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for DebugLinkN4W1Connected {
+ const NAME: &'static str = "DebugLinkN4W1Connected";
+
+ 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() -> DebugLinkN4W1Connected {
+ DebugLinkN4W1Connected::new()
+ }
+
+ fn clear(&mut self) {
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static DebugLinkN4W1Connected {
+ static instance: DebugLinkN4W1Connected = DebugLinkN4W1Connected {
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for DebugLinkN4W1Connected {
+ 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("DebugLinkN4W1Connected").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for DebugLinkN4W1Connected {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for DebugLinkN4W1Connected {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+// @@protoc_insertion_point(message:hw.trezor.messages.debug.DebugLinkN4W1Write)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct DebugLinkN4W1Write {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.debug.DebugLinkN4W1Write.key)
+ pub key: ::std::option::Option<::std::string::String>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.debug.DebugLinkN4W1Write.value)
+ pub value: ::std::option::Option<::std::vec::Vec<u8>>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.debug.DebugLinkN4W1Write.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a DebugLinkN4W1Write {
+ fn default() -> &'a DebugLinkN4W1Write {
+ <DebugLinkN4W1Write as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl DebugLinkN4W1Write {
+ pub fn new() -> DebugLinkN4W1Write {
+ ::std::default::Default::default()
+ }
+
+ // optional string key = 1;
+
+ pub fn key(&self) -> &str {
+ match self.key.as_ref() {
+ Some(v) => v,
+ None => "",
+ }
+ }
+
+ pub fn clear_key(&mut self) {
+ self.key = ::std::option::Option::None;
+ }
+
+ pub fn has_key(&self) -> bool {
+ self.key.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_key(&mut self, v: ::std::string::String) {
+ self.key = ::std::option::Option::Some(v);
+ }
+
+ // Mutable pointer to the field.
+ // If field is not initialized, it is initialized with default value first.
+ pub fn mut_key(&mut self) -> &mut ::std::string::String {
+ if self.key.is_none() {
+ self.key = ::std::option::Option::Some(::std::string::String::new());
+ }
+ self.key.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_key(&mut self) -> ::std::string::String {
+ self.key.take().unwrap_or_else(|| ::std::string::String::new())
+ }
+
+ // optional bytes value = 2;
+
+ pub fn value(&self) -> &[u8] {
+ match self.value.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_value(&mut self) {
+ self.value = ::std::option::Option::None;
+ }
+
+ pub fn has_value(&self) -> bool {
+ self.value.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_value(&mut self, v: ::std::vec::Vec<u8>) {
+ self.value = ::std::option::Option::Some(v);
+ }
+
+ // Mutable pointer to the field.
+ // If field is not initialized, it is initialized with default value first.
+ pub fn mut_value(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.value.is_none() {
+ self.value = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.value.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_value(&mut self) -> ::std::vec::Vec<u8> {
+ self.value.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ 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::<_, _>(
+ "key",
+ |m: &DebugLinkN4W1Write| { &m.key },
+ |m: &mut DebugLinkN4W1Write| { &mut m.key },
+ ));
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "value",
+ |m: &DebugLinkN4W1Write| { &m.value },
+ |m: &mut DebugLinkN4W1Write| { &mut m.value },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<DebugLinkN4W1Write>(
+ "DebugLinkN4W1Write",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for DebugLinkN4W1Write {
+ const NAME: &'static str = "DebugLinkN4W1Write";
+
+ 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 {
+ 10 => {
+ self.key = ::std::option::Option::Some(is.read_string()?);
+ },
+ 18 => {
+ self.value = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ 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;
+ if let Some(v) = self.key.as_ref() {
+ my_size += ::protobuf::rt::string_size(1, &v);
+ }
+ if let Some(v) = self.value.as_ref() {
+ my_size += ::protobuf::rt::bytes_size(2, &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.key.as_ref() {
+ os.write_string(1, v)?;
+ }
+ if let Some(v) = self.value.as_ref() {
+ os.write_bytes(2, v)?;
+ }
+ 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() -> DebugLinkN4W1Write {
+ DebugLinkN4W1Write::new()
+ }
+
+ fn clear(&mut self) {
+ self.key = ::std::option::Option::None;
+ self.value = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static DebugLinkN4W1Write {
+ static instance: DebugLinkN4W1Write = DebugLinkN4W1Write {
+ key: ::std::option::Option::None,
+ value: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for DebugLinkN4W1Write {
+ 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("DebugLinkN4W1Write").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for DebugLinkN4W1Write {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for DebugLinkN4W1Write {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+// @@protoc_insertion_point(message:hw.trezor.messages.debug.DebugLinkN4W1Read)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct DebugLinkN4W1Read {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.debug.DebugLinkN4W1Read.key)
+ pub key: ::std::option::Option<::std::string::String>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.debug.DebugLinkN4W1Read.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a DebugLinkN4W1Read {
+ fn default() -> &'a DebugLinkN4W1Read {
+ <DebugLinkN4W1Read as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl DebugLinkN4W1Read {
+ pub fn new() -> DebugLinkN4W1Read {
+ ::std::default::Default::default()
+ }
+
+ // optional string key = 1;
+
+ pub fn key(&self) -> &str {
+ match self.key.as_ref() {
+ Some(v) => v,
+ None => "",
+ }
+ }
+
+ pub fn clear_key(&mut self) {
+ self.key = ::std::option::Option::None;
+ }
+
+ pub fn has_key(&self) -> bool {
+ self.key.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_key(&mut self, v: ::std::string::String) {
+ self.key = ::std::option::Option::Some(v);
+ }
+
+ // Mutable pointer to the field.
+ // If field is not initialized, it is initialized with default value first.
+ pub fn mut_key(&mut self) -> &mut ::std::string::String {
+ if self.key.is_none() {
+ self.key = ::std::option::Option::Some(::std::string::String::new());
+ }
+ self.key.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_key(&mut self) -> ::std::string::String {
+ self.key.take().unwrap_or_else(|| ::std::string::String::new())
+ }
+
+ fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ 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::<_, _>(
+ "key",
+ |m: &DebugLinkN4W1Read| { &m.key },
+ |m: &mut DebugLinkN4W1Read| { &mut m.key },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<DebugLinkN4W1Read>(
+ "DebugLinkN4W1Read",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for DebugLinkN4W1Read {
+ const NAME: &'static str = "DebugLinkN4W1Read";
+
+ 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 {
+ 10 => {
+ self.key = ::std::option::Option::Some(is.read_string()?);
+ },
+ 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;
+ if let Some(v) = self.key.as_ref() {
+ my_size += ::protobuf::rt::string_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.key.as_ref() {
+ os.write_string(1, v)?;
+ }
+ 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() -> DebugLinkN4W1Read {
+ DebugLinkN4W1Read::new()
+ }
+
+ fn clear(&mut self) {
+ self.key = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static DebugLinkN4W1Read {
+ static instance: DebugLinkN4W1Read = DebugLinkN4W1Read {
+ key: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for DebugLinkN4W1Read {
+ 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("DebugLinkN4W1Read").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for DebugLinkN4W1Read {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for DebugLinkN4W1Read {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+// @@protoc_insertion_point(message:hw.trezor.messages.debug.DebugLinkN4W1Response)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct DebugLinkN4W1Response {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.debug.DebugLinkN4W1Response.value)
+ pub value: ::std::option::Option<::std::vec::Vec<u8>>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.debug.DebugLinkN4W1Response.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a DebugLinkN4W1Response {
+ fn default() -> &'a DebugLinkN4W1Response {
+ <DebugLinkN4W1Response as ::protobuf::Message>::default_instance()
+ }
+}
+
+impl DebugLinkN4W1Response {
+ pub fn new() -> DebugLinkN4W1Response {
+ ::std::default::Default::default()
+ }
+
+ // optional bytes value = 1;
+
+ pub fn value(&self) -> &[u8] {
+ match self.value.as_ref() {
+ Some(v) => v,
+ None => &[],
+ }
+ }
+
+ pub fn clear_value(&mut self) {
+ self.value = ::std::option::Option::None;
+ }
+
+ pub fn has_value(&self) -> bool {
+ self.value.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_value(&mut self, v: ::std::vec::Vec<u8>) {
+ self.value = ::std::option::Option::Some(v);
+ }
+
+ // Mutable pointer to the field.
+ // If field is not initialized, it is initialized with default value first.
+ pub fn mut_value(&mut self) -> &mut ::std::vec::Vec<u8> {
+ if self.value.is_none() {
+ self.value = ::std::option::Option::Some(::std::vec::Vec::new());
+ }
+ self.value.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_value(&mut self) -> ::std::vec::Vec<u8> {
+ self.value.take().unwrap_or_else(|| ::std::vec::Vec::new())
+ }
+
+ fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ 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::<_, _>(
+ "value",
+ |m: &DebugLinkN4W1Response| { &m.value },
+ |m: &mut DebugLinkN4W1Response| { &mut m.value },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<DebugLinkN4W1Response>(
+ "DebugLinkN4W1Response",
+ fields,
+ oneofs,
+ )
+ }
+}
+
+impl ::protobuf::Message for DebugLinkN4W1Response {
+ const NAME: &'static str = "DebugLinkN4W1Response";
+
+ 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 {
+ 10 => {
+ self.value = ::std::option::Option::Some(is.read_bytes()?);
+ },
+ 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;
+ if let Some(v) = self.value.as_ref() {
+ my_size += ::protobuf::rt::bytes_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.value.as_ref() {
+ os.write_bytes(1, v)?;
+ }
+ 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() -> DebugLinkN4W1Response {
+ DebugLinkN4W1Response::new()
+ }
+
+ fn clear(&mut self) {
+ self.value = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static DebugLinkN4W1Response {
+ static instance: DebugLinkN4W1Response = DebugLinkN4W1Response {
+ value: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+}
+
+impl ::protobuf::MessageFull for DebugLinkN4W1Response {
+ 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("DebugLinkN4W1Response").unwrap()).clone()
+ }
+}
+
+impl ::std::fmt::Display for DebugLinkN4W1Response {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+}
+
+impl ::protobuf::reflect::ProtobufValue for DebugLinkN4W1Response {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
static file_descriptor_proto_data: &'static [u8] = b"\
\n\x14messages-debug.proto\x12\x18hw.trezor.messages.debug\x1a\x15messag\
es-common.proto\x1a\x19messages-management.proto\x1a\roptions.proto\"\
@@ -5058,8 +5689,13 @@ static file_descriptor_proto_data: &'static [u8] = b"\
sages.debug.DebugLinkGcInfo.DebugLinkGcInfoItemR\x05items\x1a?\n\x13Debu\
gLinkGcInfoItem\x12\x12\n\x04name\x18\x01\x20\x02(\tR\x04name\x12\x14\n\
\x05value\x18\x02\x20\x02(\x04R\x05value\"/\n\x15DebugLinkSetLogFilter\
- \x12\x16\n\x06filter\x18\x01\x20\x01(\tR\x06filterB=\n#com.satoshilabs.t\
- rezor.lib.protobufB\x12TrezorMessageDebug\x80\xa6\x1d\x01\
+ \x12\x16\n\x06filter\x18\x01\x20\x01(\tR\x06filter\"\x18\n\x16DebugLinkN\
+ 4W1Connected\"<\n\x12DebugLinkN4W1Write\x12\x10\n\x03key\x18\x01\x20\x01\
+ (\tR\x03key\x12\x14\n\x05value\x18\x02\x20\x01(\x0cR\x05value\"%\n\x11De\
+ bugLinkN4W1Read\x12\x10\n\x03key\x18\x01\x20\x01(\tR\x03key\"-\n\x15Debu\
+ gLinkN4W1Response\x12\x14\n\x05value\x18\x01\x20\x01(\x0cR\x05valueB=\n#\
+ com.satoshilabs.trezor.lib.protobufB\x12TrezorMessageDebug\x80\xa6\x1d\
+ \x01\
";
/// `FileDescriptorProto` object which was a source for this generated file
@@ -5080,7 +5716,7 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {
deps.push(super::messages_common::file_descriptor().clone());
deps.push(super::messages_management::file_descriptor().clone());
deps.push(super::options::file_descriptor().clone());
- let mut messages = ::std::vec::Vec::with_capacity(22);
+ let mut messages = ::std::vec::Vec::with_capacity(26);
messages.push(DebugLinkDecision::generated_message_descriptor_data());
messages.push(DebugLinkLayout::generated_message_descriptor_data());
messages.push(DebugLinkReseedRandom::generated_message_descriptor_data());
@@ -5102,6 +5738,10 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {
messages.push(DebugLinkGetGcInfo::generated_message_descriptor_data());
messages.push(DebugLinkGcInfo::generated_message_descriptor_data());
messages.push(DebugLinkSetLogFilter::generated_message_descriptor_data());
+ messages.push(DebugLinkN4W1Connected::generated_message_descriptor_data());
+ messages.push(DebugLinkN4W1Write::generated_message_descriptor_data());
+ messages.push(DebugLinkN4W1Read::generated_message_descriptor_data());
+ messages.push(DebugLinkN4W1Response::generated_message_descriptor_data());
messages.push(debug_link_gc_info::DebugLinkGcInfoItem::generated_message_descriptor_data());
let mut enums = ::std::vec::Vec::with_capacity(5);
enums.push(debug_link_decision::DebugSwipeDirection::generated_enum_descriptor_data());
Why this scored 20/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.