mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-12 17:38:13 +00:00
feat(core): add nostr
This commit is contained in:
parent
010fdda1e3
commit
c91590426d
55
common/protob/messages-nostr.proto
Normal file
55
common/protob/messages-nostr.proto
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
syntax = "proto2";
|
||||||
|
package hw.trezor.messages.nostr;
|
||||||
|
|
||||||
|
// Sugar for easier handling in Java
|
||||||
|
option java_package = "com.satoshilabs.trezor.lib.protobuf";
|
||||||
|
option java_outer_classname = "TrezorMessageNostr";
|
||||||
|
|
||||||
|
import "options.proto";
|
||||||
|
|
||||||
|
option (include_in_bitcoin_only) = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request: Ask the device for the Nostr public key
|
||||||
|
* @start
|
||||||
|
* @next NostrMessageSignature
|
||||||
|
*/
|
||||||
|
message NostrGetPubkey {
|
||||||
|
repeated uint32 address_n = 1; // used to derive the key
|
||||||
|
optional uint32 created_at = 2;
|
||||||
|
optional uint32 kind = 3;
|
||||||
|
repeated string tags = 4;
|
||||||
|
optional string content = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Response: Nostr pubkey
|
||||||
|
* @end
|
||||||
|
*/
|
||||||
|
message NostrPubkey {
|
||||||
|
required bytes pubkey = 1; // pubkey derived from the seed
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request: Ask device to sign event
|
||||||
|
* @start
|
||||||
|
* @next NostrEventSignature
|
||||||
|
* @next Failure
|
||||||
|
*/
|
||||||
|
message NostrSignEvent {
|
||||||
|
repeated uint32 address_n = 1; // used to derive the key
|
||||||
|
optional uint32 created_at = 2;
|
||||||
|
optional uint32 kind = 3;
|
||||||
|
repeated string tags = 4;
|
||||||
|
optional string content = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Response: Computed event ID and signature
|
||||||
|
* @end
|
||||||
|
*/
|
||||||
|
message NostrEventSignature {
|
||||||
|
required bytes pubkey = 1; // pubkey used to sign the event
|
||||||
|
required bytes id = 2; // ID of the event
|
||||||
|
required bytes signature = 3; // signature of the event
|
||||||
|
}
|
@ -77,7 +77,6 @@ enum MessageType {
|
|||||||
MessageType_NextU2FCounter = 81 [(wire_out) = true];
|
MessageType_NextU2FCounter = 81 [(wire_out) = true];
|
||||||
|
|
||||||
// Deprecated messages, kept for protobuf compatibility.
|
// Deprecated messages, kept for protobuf compatibility.
|
||||||
// Both are marked wire_out so that we don't need to implement incoming handler for legacy
|
|
||||||
MessageType_Deprecated_PassphraseStateRequest = 77 [deprecated = true];
|
MessageType_Deprecated_PassphraseStateRequest = 77 [deprecated = true];
|
||||||
MessageType_Deprecated_PassphraseStateAck = 78 [deprecated = true];
|
MessageType_Deprecated_PassphraseStateAck = 78 [deprecated = true];
|
||||||
|
|
||||||
@ -105,6 +104,12 @@ enum MessageType {
|
|||||||
MessageType_OwnershipProof = 50 [(bitcoin_only) = true, (wire_out) = true];
|
MessageType_OwnershipProof = 50 [(bitcoin_only) = true, (wire_out) = true];
|
||||||
MessageType_AuthorizeCoinJoin = 51 [(bitcoin_only) = true, (wire_in) = true];
|
MessageType_AuthorizeCoinJoin = 51 [(bitcoin_only) = true, (wire_in) = true];
|
||||||
|
|
||||||
|
// Nostr
|
||||||
|
MessageType_NostrGetPubkey = 2001 [(bitcoin_only) = true, (wire_in) = true];
|
||||||
|
MessageType_NostrPubkey = 2002 [(bitcoin_only) = true, (wire_out) = true];
|
||||||
|
MessageType_NostrSignEvent = 2003 [(bitcoin_only) = true, (wire_in) = true];
|
||||||
|
MessageType_NostrEventSignature = 2004 [(bitcoin_only) = true, (wire_out) = true];
|
||||||
|
|
||||||
// Crypto
|
// Crypto
|
||||||
MessageType_CipherKeyValue = 23 [(bitcoin_only) = true, (wire_in) = true];
|
MessageType_CipherKeyValue = 23 [(bitcoin_only) = true, (wire_in) = true];
|
||||||
MessageType_CipheredKeyValue = 48 [(bitcoin_only) = true, (wire_out) = true];
|
MessageType_CipheredKeyValue = 48 [(bitcoin_only) = true, (wire_out) = true];
|
||||||
|
1
core/.changelog.d/4160.added
Normal file
1
core/.changelog.d/4160.added
Normal file
@ -0,0 +1 @@
|
|||||||
|
Add Nostr support.
|
6
core/src/all_modules.py
generated
6
core/src/all_modules.py
generated
@ -415,6 +415,12 @@ apps.misc.get_firmware_hash
|
|||||||
import apps.misc.get_firmware_hash
|
import apps.misc.get_firmware_hash
|
||||||
apps.misc.sign_identity
|
apps.misc.sign_identity
|
||||||
import apps.misc.sign_identity
|
import apps.misc.sign_identity
|
||||||
|
apps.nostr
|
||||||
|
import apps.nostr
|
||||||
|
apps.nostr.get_pubkey
|
||||||
|
import apps.nostr.get_pubkey
|
||||||
|
apps.nostr.sign_event
|
||||||
|
import apps.nostr.sign_event
|
||||||
apps.workflow_handlers
|
apps.workflow_handlers
|
||||||
import apps.workflow_handlers
|
import apps.workflow_handlers
|
||||||
|
|
||||||
|
@ -91,6 +91,9 @@ SLIP44_BITCOIN = const(0)
|
|||||||
# SLIP-44 coin type for all Testnet coins
|
# SLIP-44 coin type for all Testnet coins
|
||||||
SLIP44_TESTNET = const(1)
|
SLIP44_TESTNET = const(1)
|
||||||
|
|
||||||
|
# SLIP-44 "coin type" for Nostr
|
||||||
|
SLIP44_NOSTR = const(1237)
|
||||||
|
|
||||||
|
|
||||||
def validate_path_against_script_type(
|
def validate_path_against_script_type(
|
||||||
coin: coininfo.CoinInfo,
|
coin: coininfo.CoinInfo,
|
||||||
|
5
core/src/apps/nostr/__init__.py
Normal file
5
core/src/apps/nostr/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from apps.common.paths import PATTERN_BIP44
|
||||||
|
|
||||||
|
CURVE = "secp256k1"
|
||||||
|
SLIP44_ID = 1237
|
||||||
|
PATTERN = PATTERN_BIP44
|
20
core/src/apps/nostr/get_pubkey.py
Normal file
20
core/src/apps/nostr/get_pubkey.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
from apps.common.keychain import auto_keychain
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from trezor.messages import NostrGetPubkey, NostrPubkey
|
||||||
|
|
||||||
|
from apps.common.keychain import Keychain
|
||||||
|
|
||||||
|
|
||||||
|
@auto_keychain(__name__)
|
||||||
|
async def get_pubkey(msg: NostrGetPubkey, keychain: Keychain) -> NostrPubkey:
|
||||||
|
from trezor.messages import NostrPubkey
|
||||||
|
|
||||||
|
address_n = msg.address_n
|
||||||
|
|
||||||
|
node = keychain.derive(address_n)
|
||||||
|
pk = node.public_key()[-32:]
|
||||||
|
|
||||||
|
return NostrPubkey(pubkey=pk)
|
35
core/src/apps/nostr/sign_event.py
Normal file
35
core/src/apps/nostr/sign_event.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
from apps.common.keychain import auto_keychain
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from trezor.messages import NostrEventSignature, NostrSignEvent
|
||||||
|
|
||||||
|
from apps.common.keychain import Keychain
|
||||||
|
|
||||||
|
|
||||||
|
@auto_keychain(__name__)
|
||||||
|
async def sign_event(msg: NostrSignEvent, keychain: Keychain) -> NostrEventSignature:
|
||||||
|
from ubinascii import hexlify
|
||||||
|
|
||||||
|
from trezor.crypto.curve import secp256k1
|
||||||
|
from trezor.crypto.hashlib import sha256
|
||||||
|
from trezor.messages import NostrEventSignature
|
||||||
|
|
||||||
|
address_n = msg.address_n
|
||||||
|
created_at = msg.created_at
|
||||||
|
kind = msg.kind
|
||||||
|
tags = msg.tags
|
||||||
|
content = msg.content
|
||||||
|
|
||||||
|
node = keychain.derive(address_n)
|
||||||
|
pk = node.public_key()[-32:]
|
||||||
|
sk = node.private_key()
|
||||||
|
|
||||||
|
serialized_event = (
|
||||||
|
f'[0,"{hexlify(pk).decode()}",{created_at},{kind},{tags},"{content}"]'
|
||||||
|
)
|
||||||
|
event_id = sha256(serialized_event).digest()
|
||||||
|
signature = secp256k1.sign(sk, event_id)[-64:]
|
||||||
|
|
||||||
|
return NostrEventSignature(pubkey=pk, id=event_id, signature=signature)
|
@ -106,6 +106,12 @@ def _find_message_handler_module(msg_type: int) -> str:
|
|||||||
if msg_type == MessageType.GetFirmwareHash:
|
if msg_type == MessageType.GetFirmwareHash:
|
||||||
return "apps.misc.get_firmware_hash"
|
return "apps.misc.get_firmware_hash"
|
||||||
|
|
||||||
|
# nostr
|
||||||
|
if msg_type == MessageType.NostrGetPubkey:
|
||||||
|
return "apps.nostr.get_pubkey"
|
||||||
|
if msg_type == MessageType.NostrSignEvent:
|
||||||
|
return "apps.nostr.sign_event"
|
||||||
|
|
||||||
if not utils.BITCOIN_ONLY:
|
if not utils.BITCOIN_ONLY:
|
||||||
if msg_type == MessageType.SetU2FCounter:
|
if msg_type == MessageType.SetU2FCounter:
|
||||||
return "apps.management.set_u2f_counter"
|
return "apps.management.set_u2f_counter"
|
||||||
|
4
core/src/trezor/enums/MessageType.py
generated
4
core/src/trezor/enums/MessageType.py
generated
@ -73,6 +73,10 @@ OwnershipId = 44
|
|||||||
GetOwnershipProof = 49
|
GetOwnershipProof = 49
|
||||||
OwnershipProof = 50
|
OwnershipProof = 50
|
||||||
AuthorizeCoinJoin = 51
|
AuthorizeCoinJoin = 51
|
||||||
|
NostrGetPubkey = 2001
|
||||||
|
NostrPubkey = 2002
|
||||||
|
NostrSignEvent = 2003
|
||||||
|
NostrEventSignature = 2004
|
||||||
CipherKeyValue = 23
|
CipherKeyValue = 23
|
||||||
CipheredKeyValue = 48
|
CipheredKeyValue = 48
|
||||||
SignIdentity = 53
|
SignIdentity = 53
|
||||||
|
4
core/src/trezor/enums/__init__.py
generated
4
core/src/trezor/enums/__init__.py
generated
@ -423,6 +423,10 @@ if TYPE_CHECKING:
|
|||||||
GetOwnershipProof = 49
|
GetOwnershipProof = 49
|
||||||
OwnershipProof = 50
|
OwnershipProof = 50
|
||||||
AuthorizeCoinJoin = 51
|
AuthorizeCoinJoin = 51
|
||||||
|
NostrGetPubkey = 2001
|
||||||
|
NostrPubkey = 2002
|
||||||
|
NostrSignEvent = 2003
|
||||||
|
NostrEventSignature = 2004
|
||||||
CipherKeyValue = 23
|
CipherKeyValue = 23
|
||||||
CipheredKeyValue = 48
|
CipheredKeyValue = 48
|
||||||
SignIdentity = 53
|
SignIdentity = 53
|
||||||
|
76
core/src/trezor/messages.py
generated
76
core/src/trezor/messages.py
generated
@ -5192,6 +5192,82 @@ if TYPE_CHECKING:
|
|||||||
def is_type_of(cls, msg: Any) -> TypeGuard["NEMCosignatoryModification"]:
|
def is_type_of(cls, msg: Any) -> TypeGuard["NEMCosignatoryModification"]:
|
||||||
return isinstance(msg, cls)
|
return isinstance(msg, cls)
|
||||||
|
|
||||||
|
class NostrGetPubkey(protobuf.MessageType):
|
||||||
|
address_n: "list[int]"
|
||||||
|
created_at: "int | None"
|
||||||
|
kind: "int | None"
|
||||||
|
tags: "list[str]"
|
||||||
|
content: "str | None"
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
address_n: "list[int] | None" = None,
|
||||||
|
tags: "list[str] | None" = None,
|
||||||
|
created_at: "int | None" = None,
|
||||||
|
kind: "int | None" = None,
|
||||||
|
content: "str | None" = None,
|
||||||
|
) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_type_of(cls, msg: Any) -> TypeGuard["NostrGetPubkey"]:
|
||||||
|
return isinstance(msg, cls)
|
||||||
|
|
||||||
|
class NostrPubkey(protobuf.MessageType):
|
||||||
|
pubkey: "bytes"
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
pubkey: "bytes",
|
||||||
|
) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_type_of(cls, msg: Any) -> TypeGuard["NostrPubkey"]:
|
||||||
|
return isinstance(msg, cls)
|
||||||
|
|
||||||
|
class NostrSignEvent(protobuf.MessageType):
|
||||||
|
address_n: "list[int]"
|
||||||
|
created_at: "int | None"
|
||||||
|
kind: "int | None"
|
||||||
|
tags: "list[str]"
|
||||||
|
content: "str | None"
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
address_n: "list[int] | None" = None,
|
||||||
|
tags: "list[str] | None" = None,
|
||||||
|
created_at: "int | None" = None,
|
||||||
|
kind: "int | None" = None,
|
||||||
|
content: "str | None" = None,
|
||||||
|
) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_type_of(cls, msg: Any) -> TypeGuard["NostrSignEvent"]:
|
||||||
|
return isinstance(msg, cls)
|
||||||
|
|
||||||
|
class NostrEventSignature(protobuf.MessageType):
|
||||||
|
pubkey: "bytes"
|
||||||
|
id: "bytes"
|
||||||
|
signature: "bytes"
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
pubkey: "bytes",
|
||||||
|
id: "bytes",
|
||||||
|
signature: "bytes",
|
||||||
|
) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_type_of(cls, msg: Any) -> TypeGuard["NostrEventSignature"]:
|
||||||
|
return isinstance(msg, cls)
|
||||||
|
|
||||||
class RippleGetAddress(protobuf.MessageType):
|
class RippleGetAddress(protobuf.MessageType):
|
||||||
address_n: "list[int]"
|
address_n: "list[int]"
|
||||||
show_display: "bool | None"
|
show_display: "bool | None"
|
||||||
|
@ -95,6 +95,7 @@ async def handle_session(iface: WireInterface) -> None:
|
|||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
# Log and ignore. The session handler can only exit explicitly in the
|
# Log and ignore. The session handler can only exit explicitly in the
|
||||||
# following finally block.
|
# following finally block.
|
||||||
|
do_not_restart = True
|
||||||
if __debug__:
|
if __debug__:
|
||||||
log.exception(__name__, exc)
|
log.exception(__name__, exc)
|
||||||
finally:
|
finally:
|
||||||
|
@ -12,7 +12,8 @@ SKIPPED_MESSAGES := Binance Cardano DebugMonero Eos Monero Ontology Ripple SdPro
|
|||||||
Solana StellarClaimClaimableBalanceOp \
|
Solana StellarClaimClaimableBalanceOp \
|
||||||
ChangeLanguage TranslationDataRequest TranslationDataAck \
|
ChangeLanguage TranslationDataRequest TranslationDataAck \
|
||||||
SetBrightness DebugLinkOptigaSetSecMax \
|
SetBrightness DebugLinkOptigaSetSecMax \
|
||||||
BenchmarkListNames BenchmarkRun BenchmarkNames BenchmarkResult
|
BenchmarkListNames BenchmarkRun BenchmarkNames BenchmarkResult \
|
||||||
|
NostrGetPubkey NostrPubkey NostrSignEvent NostrEventSignature
|
||||||
|
|
||||||
ifeq ($(BITCOIN_ONLY), 1)
|
ifeq ($(BITCOIN_ONLY), 1)
|
||||||
SKIPPED_MESSAGES += Ethereum NEM Stellar
|
SKIPPED_MESSAGES += Ethereum NEM Stellar
|
||||||
|
82
python/src/trezorlib/cli/nostr.py
Normal file
82
python/src/trezorlib/cli/nostr.py
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
# This file is part of the Trezor project.
|
||||||
|
#
|
||||||
|
# Copyright (C) 2012-2025 SatoshiLabs and contributors
|
||||||
|
#
|
||||||
|
# This library is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License version 3
|
||||||
|
# as published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the License along with this library.
|
||||||
|
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
|
||||||
|
|
||||||
|
import json
|
||||||
|
from typing import TYPE_CHECKING, Dict
|
||||||
|
|
||||||
|
import click
|
||||||
|
|
||||||
|
from .. import nostr, tools
|
||||||
|
from . import with_client
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from ..client import TrezorClient
|
||||||
|
|
||||||
|
|
||||||
|
@click.group(name="nostr")
|
||||||
|
def cli() -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command()
|
||||||
|
@click.option("-n", "--address", default="m/44'/1237'/0'/0/0", help="BIP-32 path")
|
||||||
|
@with_client
|
||||||
|
def get_pubkey(
|
||||||
|
client: "TrezorClient",
|
||||||
|
address: str,
|
||||||
|
) -> Dict[str, str]:
|
||||||
|
"""Derive the pubkey from the seed."""
|
||||||
|
|
||||||
|
address_n = tools.parse_path(address)
|
||||||
|
|
||||||
|
res = nostr.get_pubkey(
|
||||||
|
client,
|
||||||
|
address_n,
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"pubkey": res.pubkey.hex(),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command()
|
||||||
|
@click.option("-n", "--address", default="m/44'/1237'/0'/0/0", help="BIP-32 path")
|
||||||
|
@click.argument("event")
|
||||||
|
@with_client
|
||||||
|
def sign_event(
|
||||||
|
client: "TrezorClient",
|
||||||
|
address: str,
|
||||||
|
event: str,
|
||||||
|
) -> Dict[str, str]:
|
||||||
|
"""Sign an event using address of given path."""
|
||||||
|
|
||||||
|
event_json = json.loads(event)
|
||||||
|
|
||||||
|
address_n = tools.parse_path(address)
|
||||||
|
|
||||||
|
res = nostr.sign_event(
|
||||||
|
client,
|
||||||
|
address_n,
|
||||||
|
event,
|
||||||
|
)
|
||||||
|
|
||||||
|
event_json["id"] = res.id.hex()
|
||||||
|
event_json["pubkey"] = res.pubkey.hex()
|
||||||
|
event_json["sig"] = res.signature.hex()
|
||||||
|
|
||||||
|
return {
|
||||||
|
"signed_event": json.dumps(event_json),
|
||||||
|
}
|
@ -44,6 +44,7 @@ from . import (
|
|||||||
firmware,
|
firmware,
|
||||||
monero,
|
monero,
|
||||||
nem,
|
nem,
|
||||||
|
nostr,
|
||||||
ripple,
|
ripple,
|
||||||
settings,
|
settings,
|
||||||
solana,
|
solana,
|
||||||
@ -409,6 +410,7 @@ cli.add_command(ethereum.cli)
|
|||||||
cli.add_command(fido.cli)
|
cli.add_command(fido.cli)
|
||||||
cli.add_command(monero.cli)
|
cli.add_command(monero.cli)
|
||||||
cli.add_command(nem.cli)
|
cli.add_command(nem.cli)
|
||||||
|
cli.add_command(nostr.cli)
|
||||||
cli.add_command(ripple.cli)
|
cli.add_command(ripple.cli)
|
||||||
cli.add_command(settings.cli)
|
cli.add_command(settings.cli)
|
||||||
cli.add_command(solana.cli)
|
cli.add_command(solana.cli)
|
||||||
|
@ -62,7 +62,9 @@ class ProtobufMapping:
|
|||||||
"""
|
"""
|
||||||
wire_type = self.class_to_type_override.get(type(msg), msg.MESSAGE_WIRE_TYPE)
|
wire_type = self.class_to_type_override.get(type(msg), msg.MESSAGE_WIRE_TYPE)
|
||||||
if wire_type is None:
|
if wire_type is None:
|
||||||
raise ValueError("Cannot encode class without wire type")
|
raise ValueError(
|
||||||
|
f'Cannot encode class "{type(msg).__name__}" without wire type'
|
||||||
|
)
|
||||||
|
|
||||||
buf = io.BytesIO()
|
buf = io.BytesIO()
|
||||||
protobuf.dump_message(buf, msg)
|
protobuf.dump_message(buf, msg)
|
||||||
|
90
python/src/trezorlib/messages.py
generated
90
python/src/trezorlib/messages.py
generated
@ -476,6 +476,10 @@ class MessageType(IntEnum):
|
|||||||
GetOwnershipProof = 49
|
GetOwnershipProof = 49
|
||||||
OwnershipProof = 50
|
OwnershipProof = 50
|
||||||
AuthorizeCoinJoin = 51
|
AuthorizeCoinJoin = 51
|
||||||
|
NostrGetPubkey = 2001
|
||||||
|
NostrPubkey = 2002
|
||||||
|
NostrSignEvent = 2003
|
||||||
|
NostrEventSignature = 2004
|
||||||
CipherKeyValue = 23
|
CipherKeyValue = 23
|
||||||
CipheredKeyValue = 48
|
CipheredKeyValue = 48
|
||||||
SignIdentity = 53
|
SignIdentity = 53
|
||||||
@ -6763,6 +6767,92 @@ class NEMCosignatoryModification(protobuf.MessageType):
|
|||||||
self.public_key = public_key
|
self.public_key = public_key
|
||||||
|
|
||||||
|
|
||||||
|
class NostrGetPubkey(protobuf.MessageType):
|
||||||
|
MESSAGE_WIRE_TYPE = 2001
|
||||||
|
FIELDS = {
|
||||||
|
1: protobuf.Field("address_n", "uint32", repeated=True, required=False, default=None),
|
||||||
|
2: protobuf.Field("created_at", "uint32", repeated=False, required=False, default=None),
|
||||||
|
3: protobuf.Field("kind", "uint32", repeated=False, required=False, default=None),
|
||||||
|
4: protobuf.Field("tags", "string", repeated=True, required=False, default=None),
|
||||||
|
5: protobuf.Field("content", "string", repeated=False, required=False, default=None),
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
address_n: Optional[Sequence["int"]] = None,
|
||||||
|
tags: Optional[Sequence["str"]] = None,
|
||||||
|
created_at: Optional["int"] = None,
|
||||||
|
kind: Optional["int"] = None,
|
||||||
|
content: Optional["str"] = None,
|
||||||
|
) -> None:
|
||||||
|
self.address_n: Sequence["int"] = address_n if address_n is not None else []
|
||||||
|
self.tags: Sequence["str"] = tags if tags is not None else []
|
||||||
|
self.created_at = created_at
|
||||||
|
self.kind = kind
|
||||||
|
self.content = content
|
||||||
|
|
||||||
|
|
||||||
|
class NostrPubkey(protobuf.MessageType):
|
||||||
|
MESSAGE_WIRE_TYPE = 2002
|
||||||
|
FIELDS = {
|
||||||
|
1: protobuf.Field("pubkey", "bytes", repeated=False, required=True),
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
pubkey: "bytes",
|
||||||
|
) -> None:
|
||||||
|
self.pubkey = pubkey
|
||||||
|
|
||||||
|
|
||||||
|
class NostrSignEvent(protobuf.MessageType):
|
||||||
|
MESSAGE_WIRE_TYPE = 2003
|
||||||
|
FIELDS = {
|
||||||
|
1: protobuf.Field("address_n", "uint32", repeated=True, required=False, default=None),
|
||||||
|
2: protobuf.Field("created_at", "uint32", repeated=False, required=False, default=None),
|
||||||
|
3: protobuf.Field("kind", "uint32", repeated=False, required=False, default=None),
|
||||||
|
4: protobuf.Field("tags", "string", repeated=True, required=False, default=None),
|
||||||
|
5: protobuf.Field("content", "string", repeated=False, required=False, default=None),
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
address_n: Optional[Sequence["int"]] = None,
|
||||||
|
tags: Optional[Sequence["str"]] = None,
|
||||||
|
created_at: Optional["int"] = None,
|
||||||
|
kind: Optional["int"] = None,
|
||||||
|
content: Optional["str"] = None,
|
||||||
|
) -> None:
|
||||||
|
self.address_n: Sequence["int"] = address_n if address_n is not None else []
|
||||||
|
self.tags: Sequence["str"] = tags if tags is not None else []
|
||||||
|
self.created_at = created_at
|
||||||
|
self.kind = kind
|
||||||
|
self.content = content
|
||||||
|
|
||||||
|
|
||||||
|
class NostrEventSignature(protobuf.MessageType):
|
||||||
|
MESSAGE_WIRE_TYPE = 2004
|
||||||
|
FIELDS = {
|
||||||
|
1: protobuf.Field("pubkey", "bytes", repeated=False, required=True),
|
||||||
|
2: protobuf.Field("id", "bytes", repeated=False, required=True),
|
||||||
|
3: protobuf.Field("signature", "bytes", repeated=False, required=True),
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
pubkey: "bytes",
|
||||||
|
id: "bytes",
|
||||||
|
signature: "bytes",
|
||||||
|
) -> None:
|
||||||
|
self.pubkey = pubkey
|
||||||
|
self.id = id
|
||||||
|
self.signature = signature
|
||||||
|
|
||||||
|
|
||||||
class RippleGetAddress(protobuf.MessageType):
|
class RippleGetAddress(protobuf.MessageType):
|
||||||
MESSAGE_WIRE_TYPE = 400
|
MESSAGE_WIRE_TYPE = 400
|
||||||
FIELDS = {
|
FIELDS = {
|
||||||
|
57
python/src/trezorlib/nostr.py
Normal file
57
python/src/trezorlib/nostr.py
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# This file is part of the Trezor project.
|
||||||
|
#
|
||||||
|
# Copyright (C) 2012-2025 SatoshiLabs and contributors
|
||||||
|
#
|
||||||
|
# This library is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License version 3
|
||||||
|
# as published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the License along with this library.
|
||||||
|
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
|
||||||
|
|
||||||
|
|
||||||
|
import json
|
||||||
|
from typing import TYPE_CHECKING, AnyStr
|
||||||
|
|
||||||
|
from . import messages
|
||||||
|
from .tools import expect
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from .client import TrezorClient
|
||||||
|
from .protobuf import MessageType
|
||||||
|
from .tools import Address
|
||||||
|
|
||||||
|
|
||||||
|
@expect(messages.NostrPubkey)
|
||||||
|
def get_pubkey(
|
||||||
|
client: "TrezorClient",
|
||||||
|
n: "Address",
|
||||||
|
) -> "MessageType":
|
||||||
|
return client.call(
|
||||||
|
messages.NostrGetPubkey(
|
||||||
|
address_n=n,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@expect(messages.NostrEventSignature)
|
||||||
|
def sign_event(
|
||||||
|
client: "TrezorClient",
|
||||||
|
n: "Address",
|
||||||
|
event: AnyStr,
|
||||||
|
) -> "MessageType":
|
||||||
|
event_json = json.loads(event)
|
||||||
|
return client.call(
|
||||||
|
messages.NostrSignEvent(
|
||||||
|
address_n=n,
|
||||||
|
created_at=event_json["created_at"],
|
||||||
|
kind=event_json["kind"],
|
||||||
|
tags=event_json["tags"],
|
||||||
|
content=event_json["content"],
|
||||||
|
)
|
||||||
|
)
|
4
rust/trezor-client/src/messages/generated.rs
generated
4
rust/trezor-client/src/messages/generated.rs
generated
@ -58,6 +58,10 @@ trezor_message_impl! {
|
|||||||
FirmwareUpload => MessageType_FirmwareUpload,
|
FirmwareUpload => MessageType_FirmwareUpload,
|
||||||
FirmwareRequest => MessageType_FirmwareRequest,
|
FirmwareRequest => MessageType_FirmwareRequest,
|
||||||
ProdTestT1 => MessageType_ProdTestT1,
|
ProdTestT1 => MessageType_ProdTestT1,
|
||||||
|
NostrGetPubkey => MessageType_NostrGetPubkey,
|
||||||
|
NostrPubkey => MessageType_NostrPubkey,
|
||||||
|
NostrSignEvent => MessageType_NostrSignEvent,
|
||||||
|
NostrEventSignature => MessageType_NostrEventSignature,
|
||||||
CipherKeyValue => MessageType_CipherKeyValue,
|
CipherKeyValue => MessageType_CipherKeyValue,
|
||||||
CipheredKeyValue => MessageType_CipheredKeyValue,
|
CipheredKeyValue => MessageType_CipheredKeyValue,
|
||||||
SignIdentity => MessageType_SignIdentity,
|
SignIdentity => MessageType_SignIdentity,
|
||||||
|
527
rust/trezor-client/src/protos/generated/messages.rs
generated
527
rust/trezor-client/src/protos/generated/messages.rs
generated
@ -178,6 +178,14 @@ pub enum MessageType {
|
|||||||
MessageType_OwnershipProof = 50,
|
MessageType_OwnershipProof = 50,
|
||||||
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_AuthorizeCoinJoin)
|
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_AuthorizeCoinJoin)
|
||||||
MessageType_AuthorizeCoinJoin = 51,
|
MessageType_AuthorizeCoinJoin = 51,
|
||||||
|
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_NostrGetPubkey)
|
||||||
|
MessageType_NostrGetPubkey = 2001,
|
||||||
|
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_NostrPubkey)
|
||||||
|
MessageType_NostrPubkey = 2002,
|
||||||
|
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_NostrSignEvent)
|
||||||
|
MessageType_NostrSignEvent = 2003,
|
||||||
|
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_NostrEventSignature)
|
||||||
|
MessageType_NostrEventSignature = 2004,
|
||||||
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_CipherKeyValue)
|
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_CipherKeyValue)
|
||||||
MessageType_CipherKeyValue = 23,
|
MessageType_CipherKeyValue = 23,
|
||||||
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_CipheredKeyValue)
|
// @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_CipheredKeyValue)
|
||||||
@ -604,6 +612,10 @@ impl ::protobuf::Enum for MessageType {
|
|||||||
49 => ::std::option::Option::Some(MessageType::MessageType_GetOwnershipProof),
|
49 => ::std::option::Option::Some(MessageType::MessageType_GetOwnershipProof),
|
||||||
50 => ::std::option::Option::Some(MessageType::MessageType_OwnershipProof),
|
50 => ::std::option::Option::Some(MessageType::MessageType_OwnershipProof),
|
||||||
51 => ::std::option::Option::Some(MessageType::MessageType_AuthorizeCoinJoin),
|
51 => ::std::option::Option::Some(MessageType::MessageType_AuthorizeCoinJoin),
|
||||||
|
2001 => ::std::option::Option::Some(MessageType::MessageType_NostrGetPubkey),
|
||||||
|
2002 => ::std::option::Option::Some(MessageType::MessageType_NostrPubkey),
|
||||||
|
2003 => ::std::option::Option::Some(MessageType::MessageType_NostrSignEvent),
|
||||||
|
2004 => ::std::option::Option::Some(MessageType::MessageType_NostrEventSignature),
|
||||||
23 => ::std::option::Option::Some(MessageType::MessageType_CipherKeyValue),
|
23 => ::std::option::Option::Some(MessageType::MessageType_CipherKeyValue),
|
||||||
48 => ::std::option::Option::Some(MessageType::MessageType_CipheredKeyValue),
|
48 => ::std::option::Option::Some(MessageType::MessageType_CipheredKeyValue),
|
||||||
53 => ::std::option::Option::Some(MessageType::MessageType_SignIdentity),
|
53 => ::std::option::Option::Some(MessageType::MessageType_SignIdentity),
|
||||||
@ -855,6 +867,10 @@ impl ::protobuf::Enum for MessageType {
|
|||||||
"MessageType_GetOwnershipProof" => ::std::option::Option::Some(MessageType::MessageType_GetOwnershipProof),
|
"MessageType_GetOwnershipProof" => ::std::option::Option::Some(MessageType::MessageType_GetOwnershipProof),
|
||||||
"MessageType_OwnershipProof" => ::std::option::Option::Some(MessageType::MessageType_OwnershipProof),
|
"MessageType_OwnershipProof" => ::std::option::Option::Some(MessageType::MessageType_OwnershipProof),
|
||||||
"MessageType_AuthorizeCoinJoin" => ::std::option::Option::Some(MessageType::MessageType_AuthorizeCoinJoin),
|
"MessageType_AuthorizeCoinJoin" => ::std::option::Option::Some(MessageType::MessageType_AuthorizeCoinJoin),
|
||||||
|
"MessageType_NostrGetPubkey" => ::std::option::Option::Some(MessageType::MessageType_NostrGetPubkey),
|
||||||
|
"MessageType_NostrPubkey" => ::std::option::Option::Some(MessageType::MessageType_NostrPubkey),
|
||||||
|
"MessageType_NostrSignEvent" => ::std::option::Option::Some(MessageType::MessageType_NostrSignEvent),
|
||||||
|
"MessageType_NostrEventSignature" => ::std::option::Option::Some(MessageType::MessageType_NostrEventSignature),
|
||||||
"MessageType_CipherKeyValue" => ::std::option::Option::Some(MessageType::MessageType_CipherKeyValue),
|
"MessageType_CipherKeyValue" => ::std::option::Option::Some(MessageType::MessageType_CipherKeyValue),
|
||||||
"MessageType_CipheredKeyValue" => ::std::option::Option::Some(MessageType::MessageType_CipheredKeyValue),
|
"MessageType_CipheredKeyValue" => ::std::option::Option::Some(MessageType::MessageType_CipheredKeyValue),
|
||||||
"MessageType_SignIdentity" => ::std::option::Option::Some(MessageType::MessageType_SignIdentity),
|
"MessageType_SignIdentity" => ::std::option::Option::Some(MessageType::MessageType_SignIdentity),
|
||||||
@ -1105,6 +1121,10 @@ impl ::protobuf::Enum for MessageType {
|
|||||||
MessageType::MessageType_GetOwnershipProof,
|
MessageType::MessageType_GetOwnershipProof,
|
||||||
MessageType::MessageType_OwnershipProof,
|
MessageType::MessageType_OwnershipProof,
|
||||||
MessageType::MessageType_AuthorizeCoinJoin,
|
MessageType::MessageType_AuthorizeCoinJoin,
|
||||||
|
MessageType::MessageType_NostrGetPubkey,
|
||||||
|
MessageType::MessageType_NostrPubkey,
|
||||||
|
MessageType::MessageType_NostrSignEvent,
|
||||||
|
MessageType::MessageType_NostrEventSignature,
|
||||||
MessageType::MessageType_CipherKeyValue,
|
MessageType::MessageType_CipherKeyValue,
|
||||||
MessageType::MessageType_CipheredKeyValue,
|
MessageType::MessageType_CipheredKeyValue,
|
||||||
MessageType::MessageType_SignIdentity,
|
MessageType::MessageType_SignIdentity,
|
||||||
@ -1361,176 +1381,180 @@ impl ::protobuf::EnumFull for MessageType {
|
|||||||
MessageType::MessageType_GetOwnershipProof => 72,
|
MessageType::MessageType_GetOwnershipProof => 72,
|
||||||
MessageType::MessageType_OwnershipProof => 73,
|
MessageType::MessageType_OwnershipProof => 73,
|
||||||
MessageType::MessageType_AuthorizeCoinJoin => 74,
|
MessageType::MessageType_AuthorizeCoinJoin => 74,
|
||||||
MessageType::MessageType_CipherKeyValue => 75,
|
MessageType::MessageType_NostrGetPubkey => 75,
|
||||||
MessageType::MessageType_CipheredKeyValue => 76,
|
MessageType::MessageType_NostrPubkey => 76,
|
||||||
MessageType::MessageType_SignIdentity => 77,
|
MessageType::MessageType_NostrSignEvent => 77,
|
||||||
MessageType::MessageType_SignedIdentity => 78,
|
MessageType::MessageType_NostrEventSignature => 78,
|
||||||
MessageType::MessageType_GetECDHSessionKey => 79,
|
MessageType::MessageType_CipherKeyValue => 79,
|
||||||
MessageType::MessageType_ECDHSessionKey => 80,
|
MessageType::MessageType_CipheredKeyValue => 80,
|
||||||
MessageType::MessageType_DebugLinkDecision => 81,
|
MessageType::MessageType_SignIdentity => 81,
|
||||||
MessageType::MessageType_DebugLinkGetState => 82,
|
MessageType::MessageType_SignedIdentity => 82,
|
||||||
MessageType::MessageType_DebugLinkState => 83,
|
MessageType::MessageType_GetECDHSessionKey => 83,
|
||||||
MessageType::MessageType_DebugLinkStop => 84,
|
MessageType::MessageType_ECDHSessionKey => 84,
|
||||||
MessageType::MessageType_DebugLinkLog => 85,
|
MessageType::MessageType_DebugLinkDecision => 85,
|
||||||
MessageType::MessageType_DebugLinkMemoryRead => 86,
|
MessageType::MessageType_DebugLinkGetState => 86,
|
||||||
MessageType::MessageType_DebugLinkMemory => 87,
|
MessageType::MessageType_DebugLinkState => 87,
|
||||||
MessageType::MessageType_DebugLinkMemoryWrite => 88,
|
MessageType::MessageType_DebugLinkStop => 88,
|
||||||
MessageType::MessageType_DebugLinkFlashErase => 89,
|
MessageType::MessageType_DebugLinkLog => 89,
|
||||||
MessageType::MessageType_DebugLinkLayout => 90,
|
MessageType::MessageType_DebugLinkMemoryRead => 90,
|
||||||
MessageType::MessageType_DebugLinkReseedRandom => 91,
|
MessageType::MessageType_DebugLinkMemory => 91,
|
||||||
MessageType::MessageType_DebugLinkRecordScreen => 92,
|
MessageType::MessageType_DebugLinkMemoryWrite => 92,
|
||||||
MessageType::MessageType_DebugLinkEraseSdCard => 93,
|
MessageType::MessageType_DebugLinkFlashErase => 93,
|
||||||
MessageType::MessageType_DebugLinkWatchLayout => 94,
|
MessageType::MessageType_DebugLinkLayout => 94,
|
||||||
MessageType::MessageType_DebugLinkResetDebugEvents => 95,
|
MessageType::MessageType_DebugLinkReseedRandom => 95,
|
||||||
MessageType::MessageType_DebugLinkOptigaSetSecMax => 96,
|
MessageType::MessageType_DebugLinkRecordScreen => 96,
|
||||||
MessageType::MessageType_EthereumGetPublicKey => 97,
|
MessageType::MessageType_DebugLinkEraseSdCard => 97,
|
||||||
MessageType::MessageType_EthereumPublicKey => 98,
|
MessageType::MessageType_DebugLinkWatchLayout => 98,
|
||||||
MessageType::MessageType_EthereumGetAddress => 99,
|
MessageType::MessageType_DebugLinkResetDebugEvents => 99,
|
||||||
MessageType::MessageType_EthereumAddress => 100,
|
MessageType::MessageType_DebugLinkOptigaSetSecMax => 100,
|
||||||
MessageType::MessageType_EthereumSignTx => 101,
|
MessageType::MessageType_EthereumGetPublicKey => 101,
|
||||||
MessageType::MessageType_EthereumSignTxEIP1559 => 102,
|
MessageType::MessageType_EthereumPublicKey => 102,
|
||||||
MessageType::MessageType_EthereumTxRequest => 103,
|
MessageType::MessageType_EthereumGetAddress => 103,
|
||||||
MessageType::MessageType_EthereumTxAck => 104,
|
MessageType::MessageType_EthereumAddress => 104,
|
||||||
MessageType::MessageType_EthereumSignMessage => 105,
|
MessageType::MessageType_EthereumSignTx => 105,
|
||||||
MessageType::MessageType_EthereumVerifyMessage => 106,
|
MessageType::MessageType_EthereumSignTxEIP1559 => 106,
|
||||||
MessageType::MessageType_EthereumMessageSignature => 107,
|
MessageType::MessageType_EthereumTxRequest => 107,
|
||||||
MessageType::MessageType_EthereumSignTypedData => 108,
|
MessageType::MessageType_EthereumTxAck => 108,
|
||||||
MessageType::MessageType_EthereumTypedDataStructRequest => 109,
|
MessageType::MessageType_EthereumSignMessage => 109,
|
||||||
MessageType::MessageType_EthereumTypedDataStructAck => 110,
|
MessageType::MessageType_EthereumVerifyMessage => 110,
|
||||||
MessageType::MessageType_EthereumTypedDataValueRequest => 111,
|
MessageType::MessageType_EthereumMessageSignature => 111,
|
||||||
MessageType::MessageType_EthereumTypedDataValueAck => 112,
|
MessageType::MessageType_EthereumSignTypedData => 112,
|
||||||
MessageType::MessageType_EthereumTypedDataSignature => 113,
|
MessageType::MessageType_EthereumTypedDataStructRequest => 113,
|
||||||
MessageType::MessageType_EthereumSignTypedHash => 114,
|
MessageType::MessageType_EthereumTypedDataStructAck => 114,
|
||||||
MessageType::MessageType_NEMGetAddress => 115,
|
MessageType::MessageType_EthereumTypedDataValueRequest => 115,
|
||||||
MessageType::MessageType_NEMAddress => 116,
|
MessageType::MessageType_EthereumTypedDataValueAck => 116,
|
||||||
MessageType::MessageType_NEMSignTx => 117,
|
MessageType::MessageType_EthereumTypedDataSignature => 117,
|
||||||
MessageType::MessageType_NEMSignedTx => 118,
|
MessageType::MessageType_EthereumSignTypedHash => 118,
|
||||||
MessageType::MessageType_NEMDecryptMessage => 119,
|
MessageType::MessageType_NEMGetAddress => 119,
|
||||||
MessageType::MessageType_NEMDecryptedMessage => 120,
|
MessageType::MessageType_NEMAddress => 120,
|
||||||
MessageType::MessageType_TezosGetAddress => 121,
|
MessageType::MessageType_NEMSignTx => 121,
|
||||||
MessageType::MessageType_TezosAddress => 122,
|
MessageType::MessageType_NEMSignedTx => 122,
|
||||||
MessageType::MessageType_TezosSignTx => 123,
|
MessageType::MessageType_NEMDecryptMessage => 123,
|
||||||
MessageType::MessageType_TezosSignedTx => 124,
|
MessageType::MessageType_NEMDecryptedMessage => 124,
|
||||||
MessageType::MessageType_TezosGetPublicKey => 125,
|
MessageType::MessageType_TezosGetAddress => 125,
|
||||||
MessageType::MessageType_TezosPublicKey => 126,
|
MessageType::MessageType_TezosAddress => 126,
|
||||||
MessageType::MessageType_StellarSignTx => 127,
|
MessageType::MessageType_TezosSignTx => 127,
|
||||||
MessageType::MessageType_StellarTxOpRequest => 128,
|
MessageType::MessageType_TezosSignedTx => 128,
|
||||||
MessageType::MessageType_StellarGetAddress => 129,
|
MessageType::MessageType_TezosGetPublicKey => 129,
|
||||||
MessageType::MessageType_StellarAddress => 130,
|
MessageType::MessageType_TezosPublicKey => 130,
|
||||||
MessageType::MessageType_StellarCreateAccountOp => 131,
|
MessageType::MessageType_StellarSignTx => 131,
|
||||||
MessageType::MessageType_StellarPaymentOp => 132,
|
MessageType::MessageType_StellarTxOpRequest => 132,
|
||||||
MessageType::MessageType_StellarPathPaymentStrictReceiveOp => 133,
|
MessageType::MessageType_StellarGetAddress => 133,
|
||||||
MessageType::MessageType_StellarManageSellOfferOp => 134,
|
MessageType::MessageType_StellarAddress => 134,
|
||||||
MessageType::MessageType_StellarCreatePassiveSellOfferOp => 135,
|
MessageType::MessageType_StellarCreateAccountOp => 135,
|
||||||
MessageType::MessageType_StellarSetOptionsOp => 136,
|
MessageType::MessageType_StellarPaymentOp => 136,
|
||||||
MessageType::MessageType_StellarChangeTrustOp => 137,
|
MessageType::MessageType_StellarPathPaymentStrictReceiveOp => 137,
|
||||||
MessageType::MessageType_StellarAllowTrustOp => 138,
|
MessageType::MessageType_StellarManageSellOfferOp => 138,
|
||||||
MessageType::MessageType_StellarAccountMergeOp => 139,
|
MessageType::MessageType_StellarCreatePassiveSellOfferOp => 139,
|
||||||
MessageType::MessageType_StellarManageDataOp => 140,
|
MessageType::MessageType_StellarSetOptionsOp => 140,
|
||||||
MessageType::MessageType_StellarBumpSequenceOp => 141,
|
MessageType::MessageType_StellarChangeTrustOp => 141,
|
||||||
MessageType::MessageType_StellarManageBuyOfferOp => 142,
|
MessageType::MessageType_StellarAllowTrustOp => 142,
|
||||||
MessageType::MessageType_StellarPathPaymentStrictSendOp => 143,
|
MessageType::MessageType_StellarAccountMergeOp => 143,
|
||||||
MessageType::MessageType_StellarClaimClaimableBalanceOp => 144,
|
MessageType::MessageType_StellarManageDataOp => 144,
|
||||||
MessageType::MessageType_StellarSignedTx => 145,
|
MessageType::MessageType_StellarBumpSequenceOp => 145,
|
||||||
MessageType::MessageType_CardanoGetPublicKey => 146,
|
MessageType::MessageType_StellarManageBuyOfferOp => 146,
|
||||||
MessageType::MessageType_CardanoPublicKey => 147,
|
MessageType::MessageType_StellarPathPaymentStrictSendOp => 147,
|
||||||
MessageType::MessageType_CardanoGetAddress => 148,
|
MessageType::MessageType_StellarClaimClaimableBalanceOp => 148,
|
||||||
MessageType::MessageType_CardanoAddress => 149,
|
MessageType::MessageType_StellarSignedTx => 149,
|
||||||
MessageType::MessageType_CardanoTxItemAck => 150,
|
MessageType::MessageType_CardanoGetPublicKey => 150,
|
||||||
MessageType::MessageType_CardanoTxAuxiliaryDataSupplement => 151,
|
MessageType::MessageType_CardanoPublicKey => 151,
|
||||||
MessageType::MessageType_CardanoTxWitnessRequest => 152,
|
MessageType::MessageType_CardanoGetAddress => 152,
|
||||||
MessageType::MessageType_CardanoTxWitnessResponse => 153,
|
MessageType::MessageType_CardanoAddress => 153,
|
||||||
MessageType::MessageType_CardanoTxHostAck => 154,
|
MessageType::MessageType_CardanoTxItemAck => 154,
|
||||||
MessageType::MessageType_CardanoTxBodyHash => 155,
|
MessageType::MessageType_CardanoTxAuxiliaryDataSupplement => 155,
|
||||||
MessageType::MessageType_CardanoSignTxFinished => 156,
|
MessageType::MessageType_CardanoTxWitnessRequest => 156,
|
||||||
MessageType::MessageType_CardanoSignTxInit => 157,
|
MessageType::MessageType_CardanoTxWitnessResponse => 157,
|
||||||
MessageType::MessageType_CardanoTxInput => 158,
|
MessageType::MessageType_CardanoTxHostAck => 158,
|
||||||
MessageType::MessageType_CardanoTxOutput => 159,
|
MessageType::MessageType_CardanoTxBodyHash => 159,
|
||||||
MessageType::MessageType_CardanoAssetGroup => 160,
|
MessageType::MessageType_CardanoSignTxFinished => 160,
|
||||||
MessageType::MessageType_CardanoToken => 161,
|
MessageType::MessageType_CardanoSignTxInit => 161,
|
||||||
MessageType::MessageType_CardanoTxCertificate => 162,
|
MessageType::MessageType_CardanoTxInput => 162,
|
||||||
MessageType::MessageType_CardanoTxWithdrawal => 163,
|
MessageType::MessageType_CardanoTxOutput => 163,
|
||||||
MessageType::MessageType_CardanoTxAuxiliaryData => 164,
|
MessageType::MessageType_CardanoAssetGroup => 164,
|
||||||
MessageType::MessageType_CardanoPoolOwner => 165,
|
MessageType::MessageType_CardanoToken => 165,
|
||||||
MessageType::MessageType_CardanoPoolRelayParameters => 166,
|
MessageType::MessageType_CardanoTxCertificate => 166,
|
||||||
MessageType::MessageType_CardanoGetNativeScriptHash => 167,
|
MessageType::MessageType_CardanoTxWithdrawal => 167,
|
||||||
MessageType::MessageType_CardanoNativeScriptHash => 168,
|
MessageType::MessageType_CardanoTxAuxiliaryData => 168,
|
||||||
MessageType::MessageType_CardanoTxMint => 169,
|
MessageType::MessageType_CardanoPoolOwner => 169,
|
||||||
MessageType::MessageType_CardanoTxCollateralInput => 170,
|
MessageType::MessageType_CardanoPoolRelayParameters => 170,
|
||||||
MessageType::MessageType_CardanoTxRequiredSigner => 171,
|
MessageType::MessageType_CardanoGetNativeScriptHash => 171,
|
||||||
MessageType::MessageType_CardanoTxInlineDatumChunk => 172,
|
MessageType::MessageType_CardanoNativeScriptHash => 172,
|
||||||
MessageType::MessageType_CardanoTxReferenceScriptChunk => 173,
|
MessageType::MessageType_CardanoTxMint => 173,
|
||||||
MessageType::MessageType_CardanoTxReferenceInput => 174,
|
MessageType::MessageType_CardanoTxCollateralInput => 174,
|
||||||
MessageType::MessageType_RippleGetAddress => 175,
|
MessageType::MessageType_CardanoTxRequiredSigner => 175,
|
||||||
MessageType::MessageType_RippleAddress => 176,
|
MessageType::MessageType_CardanoTxInlineDatumChunk => 176,
|
||||||
MessageType::MessageType_RippleSignTx => 177,
|
MessageType::MessageType_CardanoTxReferenceScriptChunk => 177,
|
||||||
MessageType::MessageType_RippleSignedTx => 178,
|
MessageType::MessageType_CardanoTxReferenceInput => 178,
|
||||||
MessageType::MessageType_MoneroTransactionInitRequest => 179,
|
MessageType::MessageType_RippleGetAddress => 179,
|
||||||
MessageType::MessageType_MoneroTransactionInitAck => 180,
|
MessageType::MessageType_RippleAddress => 180,
|
||||||
MessageType::MessageType_MoneroTransactionSetInputRequest => 181,
|
MessageType::MessageType_RippleSignTx => 181,
|
||||||
MessageType::MessageType_MoneroTransactionSetInputAck => 182,
|
MessageType::MessageType_RippleSignedTx => 182,
|
||||||
MessageType::MessageType_MoneroTransactionInputViniRequest => 183,
|
MessageType::MessageType_MoneroTransactionInitRequest => 183,
|
||||||
MessageType::MessageType_MoneroTransactionInputViniAck => 184,
|
MessageType::MessageType_MoneroTransactionInitAck => 184,
|
||||||
MessageType::MessageType_MoneroTransactionAllInputsSetRequest => 185,
|
MessageType::MessageType_MoneroTransactionSetInputRequest => 185,
|
||||||
MessageType::MessageType_MoneroTransactionAllInputsSetAck => 186,
|
MessageType::MessageType_MoneroTransactionSetInputAck => 186,
|
||||||
MessageType::MessageType_MoneroTransactionSetOutputRequest => 187,
|
MessageType::MessageType_MoneroTransactionInputViniRequest => 187,
|
||||||
MessageType::MessageType_MoneroTransactionSetOutputAck => 188,
|
MessageType::MessageType_MoneroTransactionInputViniAck => 188,
|
||||||
MessageType::MessageType_MoneroTransactionAllOutSetRequest => 189,
|
MessageType::MessageType_MoneroTransactionAllInputsSetRequest => 189,
|
||||||
MessageType::MessageType_MoneroTransactionAllOutSetAck => 190,
|
MessageType::MessageType_MoneroTransactionAllInputsSetAck => 190,
|
||||||
MessageType::MessageType_MoneroTransactionSignInputRequest => 191,
|
MessageType::MessageType_MoneroTransactionSetOutputRequest => 191,
|
||||||
MessageType::MessageType_MoneroTransactionSignInputAck => 192,
|
MessageType::MessageType_MoneroTransactionSetOutputAck => 192,
|
||||||
MessageType::MessageType_MoneroTransactionFinalRequest => 193,
|
MessageType::MessageType_MoneroTransactionAllOutSetRequest => 193,
|
||||||
MessageType::MessageType_MoneroTransactionFinalAck => 194,
|
MessageType::MessageType_MoneroTransactionAllOutSetAck => 194,
|
||||||
MessageType::MessageType_MoneroKeyImageExportInitRequest => 195,
|
MessageType::MessageType_MoneroTransactionSignInputRequest => 195,
|
||||||
MessageType::MessageType_MoneroKeyImageExportInitAck => 196,
|
MessageType::MessageType_MoneroTransactionSignInputAck => 196,
|
||||||
MessageType::MessageType_MoneroKeyImageSyncStepRequest => 197,
|
MessageType::MessageType_MoneroTransactionFinalRequest => 197,
|
||||||
MessageType::MessageType_MoneroKeyImageSyncStepAck => 198,
|
MessageType::MessageType_MoneroTransactionFinalAck => 198,
|
||||||
MessageType::MessageType_MoneroKeyImageSyncFinalRequest => 199,
|
MessageType::MessageType_MoneroKeyImageExportInitRequest => 199,
|
||||||
MessageType::MessageType_MoneroKeyImageSyncFinalAck => 200,
|
MessageType::MessageType_MoneroKeyImageExportInitAck => 200,
|
||||||
MessageType::MessageType_MoneroGetAddress => 201,
|
MessageType::MessageType_MoneroKeyImageSyncStepRequest => 201,
|
||||||
MessageType::MessageType_MoneroAddress => 202,
|
MessageType::MessageType_MoneroKeyImageSyncStepAck => 202,
|
||||||
MessageType::MessageType_MoneroGetWatchKey => 203,
|
MessageType::MessageType_MoneroKeyImageSyncFinalRequest => 203,
|
||||||
MessageType::MessageType_MoneroWatchKey => 204,
|
MessageType::MessageType_MoneroKeyImageSyncFinalAck => 204,
|
||||||
MessageType::MessageType_DebugMoneroDiagRequest => 205,
|
MessageType::MessageType_MoneroGetAddress => 205,
|
||||||
MessageType::MessageType_DebugMoneroDiagAck => 206,
|
MessageType::MessageType_MoneroAddress => 206,
|
||||||
MessageType::MessageType_MoneroGetTxKeyRequest => 207,
|
MessageType::MessageType_MoneroGetWatchKey => 207,
|
||||||
MessageType::MessageType_MoneroGetTxKeyAck => 208,
|
MessageType::MessageType_MoneroWatchKey => 208,
|
||||||
MessageType::MessageType_MoneroLiveRefreshStartRequest => 209,
|
MessageType::MessageType_DebugMoneroDiagRequest => 209,
|
||||||
MessageType::MessageType_MoneroLiveRefreshStartAck => 210,
|
MessageType::MessageType_DebugMoneroDiagAck => 210,
|
||||||
MessageType::MessageType_MoneroLiveRefreshStepRequest => 211,
|
MessageType::MessageType_MoneroGetTxKeyRequest => 211,
|
||||||
MessageType::MessageType_MoneroLiveRefreshStepAck => 212,
|
MessageType::MessageType_MoneroGetTxKeyAck => 212,
|
||||||
MessageType::MessageType_MoneroLiveRefreshFinalRequest => 213,
|
MessageType::MessageType_MoneroLiveRefreshStartRequest => 213,
|
||||||
MessageType::MessageType_MoneroLiveRefreshFinalAck => 214,
|
MessageType::MessageType_MoneroLiveRefreshStartAck => 214,
|
||||||
MessageType::MessageType_EosGetPublicKey => 215,
|
MessageType::MessageType_MoneroLiveRefreshStepRequest => 215,
|
||||||
MessageType::MessageType_EosPublicKey => 216,
|
MessageType::MessageType_MoneroLiveRefreshStepAck => 216,
|
||||||
MessageType::MessageType_EosSignTx => 217,
|
MessageType::MessageType_MoneroLiveRefreshFinalRequest => 217,
|
||||||
MessageType::MessageType_EosTxActionRequest => 218,
|
MessageType::MessageType_MoneroLiveRefreshFinalAck => 218,
|
||||||
MessageType::MessageType_EosTxActionAck => 219,
|
MessageType::MessageType_EosGetPublicKey => 219,
|
||||||
MessageType::MessageType_EosSignedTx => 220,
|
MessageType::MessageType_EosPublicKey => 220,
|
||||||
MessageType::MessageType_BinanceGetAddress => 221,
|
MessageType::MessageType_EosSignTx => 221,
|
||||||
MessageType::MessageType_BinanceAddress => 222,
|
MessageType::MessageType_EosTxActionRequest => 222,
|
||||||
MessageType::MessageType_BinanceGetPublicKey => 223,
|
MessageType::MessageType_EosTxActionAck => 223,
|
||||||
MessageType::MessageType_BinancePublicKey => 224,
|
MessageType::MessageType_EosSignedTx => 224,
|
||||||
MessageType::MessageType_BinanceSignTx => 225,
|
MessageType::MessageType_BinanceGetAddress => 225,
|
||||||
MessageType::MessageType_BinanceTxRequest => 226,
|
MessageType::MessageType_BinanceAddress => 226,
|
||||||
MessageType::MessageType_BinanceTransferMsg => 227,
|
MessageType::MessageType_BinanceGetPublicKey => 227,
|
||||||
MessageType::MessageType_BinanceOrderMsg => 228,
|
MessageType::MessageType_BinancePublicKey => 228,
|
||||||
MessageType::MessageType_BinanceCancelMsg => 229,
|
MessageType::MessageType_BinanceSignTx => 229,
|
||||||
MessageType::MessageType_BinanceSignedTx => 230,
|
MessageType::MessageType_BinanceTxRequest => 230,
|
||||||
MessageType::MessageType_WebAuthnListResidentCredentials => 231,
|
MessageType::MessageType_BinanceTransferMsg => 231,
|
||||||
MessageType::MessageType_WebAuthnCredentials => 232,
|
MessageType::MessageType_BinanceOrderMsg => 232,
|
||||||
MessageType::MessageType_WebAuthnAddResidentCredential => 233,
|
MessageType::MessageType_BinanceCancelMsg => 233,
|
||||||
MessageType::MessageType_WebAuthnRemoveResidentCredential => 234,
|
MessageType::MessageType_BinanceSignedTx => 234,
|
||||||
MessageType::MessageType_SolanaGetPublicKey => 235,
|
MessageType::MessageType_WebAuthnListResidentCredentials => 235,
|
||||||
MessageType::MessageType_SolanaPublicKey => 236,
|
MessageType::MessageType_WebAuthnCredentials => 236,
|
||||||
MessageType::MessageType_SolanaGetAddress => 237,
|
MessageType::MessageType_WebAuthnAddResidentCredential => 237,
|
||||||
MessageType::MessageType_SolanaAddress => 238,
|
MessageType::MessageType_WebAuthnRemoveResidentCredential => 238,
|
||||||
MessageType::MessageType_SolanaSignTx => 239,
|
MessageType::MessageType_SolanaGetPublicKey => 239,
|
||||||
MessageType::MessageType_SolanaTxSignature => 240,
|
MessageType::MessageType_SolanaPublicKey => 240,
|
||||||
MessageType::MessageType_BenchmarkListNames => 241,
|
MessageType::MessageType_SolanaGetAddress => 241,
|
||||||
MessageType::MessageType_BenchmarkNames => 242,
|
MessageType::MessageType_SolanaAddress => 242,
|
||||||
MessageType::MessageType_BenchmarkRun => 243,
|
MessageType::MessageType_SolanaSignTx => 243,
|
||||||
MessageType::MessageType_BenchmarkResult => 244,
|
MessageType::MessageType_SolanaTxSignature => 244,
|
||||||
|
MessageType::MessageType_BenchmarkListNames => 245,
|
||||||
|
MessageType::MessageType_BenchmarkNames => 246,
|
||||||
|
MessageType::MessageType_BenchmarkRun => 247,
|
||||||
|
MessageType::MessageType_BenchmarkResult => 248,
|
||||||
};
|
};
|
||||||
Self::enum_descriptor().value_by_index(index)
|
Self::enum_descriptor().value_by_index(index)
|
||||||
}
|
}
|
||||||
@ -1549,7 +1573,7 @@ impl MessageType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static file_descriptor_proto_data: &'static [u8] = b"\
|
static file_descriptor_proto_data: &'static [u8] = b"\
|
||||||
\n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\x89U\
|
\n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xb7V\
|
||||||
\n\x0bMessageType\x12(\n\x16MessageType_Initialize\x10\0\x1a\x0c\x80\xa6\
|
\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\
|
\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\
|
\x10\x01\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12%\n\x13MessageType_S\
|
||||||
@ -1638,84 +1662,89 @@ static file_descriptor_proto_data: &'static [u8] = b"\
|
|||||||
\xa6\x1d\x01\x98\xb5\x18\x01\x12+\n\x1dMessageType_GetOwnershipProof\x10\
|
\xa6\x1d\x01\x98\xb5\x18\x01\x12+\n\x1dMessageType_GetOwnershipProof\x10\
|
||||||
1\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\x1aMessageType_Ownershi\
|
1\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\x1aMessageType_Ownershi\
|
||||||
pProof\x102\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12+\n\x1dMessageTyp\
|
pProof\x102\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12+\n\x1dMessageTyp\
|
||||||
e_AuthorizeCoinJoin\x103\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\
|
e_AuthorizeCoinJoin\x103\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12)\n\
|
||||||
\x1aMessageType_CipherKeyValue\x10\x17\x1a\x08\x80\xa6\x1d\x01\x90\xb5\
|
\x1aMessageType_NostrGetPubkey\x10\xd1\x0f\x1a\x08\x80\xa6\x1d\x01\x90\
|
||||||
\x18\x01\x12*\n\x1cMessageType_CipheredKeyValue\x100\x1a\x08\x80\xa6\x1d\
|
\xb5\x18\x01\x12&\n\x17MessageType_NostrPubkey\x10\xd2\x0f\x1a\x08\x80\
|
||||||
\x01\x98\xb5\x18\x01\x12&\n\x18MessageType_SignIdentity\x105\x1a\x08\x80\
|
\xa6\x1d\x01\x98\xb5\x18\x01\x12)\n\x1aMessageType_NostrSignEvent\x10\
|
||||||
\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\x1aMessageType_SignedIdentity\x106\
|
\xd3\x0f\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12.\n\x1fMessageType_N\
|
||||||
\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12+\n\x1dMessageType_GetECDHSe\
|
ostrEventSignature\x10\xd4\x0f\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\
|
||||||
ssionKey\x10=\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\x1aMessageT\
|
\x12(\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x08\x80\xa6\x1d\x01\
|
||||||
ype_ECDHSessionKey\x10>\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x123\n\
|
\x90\xb5\x18\x01\x12*\n\x1cMessageType_CipheredKeyValue\x100\x1a\x08\x80\
|
||||||
\x1dMessageType_DebugLinkDecision\x10d\x1a\x10\xc0\xb5\x18\x01\xb0\xb5\
|
\xa6\x1d\x01\x98\xb5\x18\x01\x12&\n\x18MessageType_SignIdentity\x105\x1a\
|
||||||
\x18\x01\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12/\n\x1dMessageType_DebugLink\
|
\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\x1aMessageType_SignedIdentit\
|
||||||
GetState\x10e\x1a\x0c\x80\xa6\x1d\x01\xb0\xb5\x18\x01\xa0\xb5\x18\x01\
|
y\x106\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12+\n\x1dMessageType_Get\
|
||||||
\x12(\n\x1aMessageType_DebugLinkState\x10f\x1a\x08\x80\xa6\x1d\x01\xa8\
|
ECDHSessionKey\x10=\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\x1aMe\
|
||||||
\xb5\x18\x01\x12'\n\x19MessageType_DebugLinkStop\x10g\x1a\x08\x80\xa6\
|
ssageType_ECDHSessionKey\x10>\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\
|
||||||
\x1d\x01\xa0\xb5\x18\x01\x12&\n\x18MessageType_DebugLinkLog\x10h\x1a\x08\
|
\x123\n\x1dMessageType_DebugLinkDecision\x10d\x1a\x10\xc0\xb5\x18\x01\
|
||||||
\x80\xa6\x1d\x01\xa8\xb5\x18\x01\x12-\n\x1fMessageType_DebugLinkMemoryRe\
|
\xb0\xb5\x18\x01\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12/\n\x1dMessageType_D\
|
||||||
ad\x10n\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12)\n\x1bMessageType_De\
|
ebugLinkGetState\x10e\x1a\x0c\x80\xa6\x1d\x01\xb0\xb5\x18\x01\xa0\xb5\
|
||||||
bugLinkMemory\x10o\x1a\x08\x80\xa6\x1d\x01\xa8\xb5\x18\x01\x12.\n\x20Mes\
|
\x18\x01\x12(\n\x1aMessageType_DebugLinkState\x10f\x1a\x08\x80\xa6\x1d\
|
||||||
sageType_DebugLinkMemoryWrite\x10p\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\
|
\x01\xa8\xb5\x18\x01\x12'\n\x19MessageType_DebugLinkStop\x10g\x1a\x08\
|
||||||
\x01\x12-\n\x1fMessageType_DebugLinkFlashErase\x10q\x1a\x08\x80\xa6\x1d\
|
\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12&\n\x18MessageType_DebugLinkLog\x10h\
|
||||||
\x01\xa0\xb5\x18\x01\x12*\n\x1bMessageType_DebugLinkLayout\x10\xa9F\x1a\
|
\x1a\x08\x80\xa6\x1d\x01\xa8\xb5\x18\x01\x12-\n\x1fMessageType_DebugLink\
|
||||||
\x08\x80\xa6\x1d\x01\xa8\xb5\x18\x01\x120\n!MessageType_DebugLinkReseedR\
|
MemoryRead\x10n\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12)\n\x1bMessag\
|
||||||
andom\x10\xaaF\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x120\n!MessageTyp\
|
eType_DebugLinkMemory\x10o\x1a\x08\x80\xa6\x1d\x01\xa8\xb5\x18\x01\x12.\
|
||||||
e_DebugLinkRecordScreen\x10\xabF\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\
|
\n\x20MessageType_DebugLinkMemoryWrite\x10p\x1a\x08\x80\xa6\x1d\x01\xa0\
|
||||||
\x12/\n\x20MessageType_DebugLinkEraseSdCard\x10\xadF\x1a\x08\x80\xa6\x1d\
|
\xb5\x18\x01\x12-\n\x1fMessageType_DebugLinkFlashErase\x10q\x1a\x08\x80\
|
||||||
\x01\xa0\xb5\x18\x01\x12/\n\x20MessageType_DebugLinkWatchLayout\x10\xaeF\
|
\xa6\x1d\x01\xa0\xb5\x18\x01\x12*\n\x1bMessageType_DebugLinkLayout\x10\
|
||||||
\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x124\n%MessageType_DebugLinkRes\
|
\xa9F\x1a\x08\x80\xa6\x1d\x01\xa8\xb5\x18\x01\x120\n!MessageType_DebugLi\
|
||||||
etDebugEvents\x10\xafF\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x123\n$Me\
|
nkReseedRandom\x10\xaaF\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x120\n!M\
|
||||||
ssageType_DebugLinkOptigaSetSecMax\x10\xb0F\x1a\x08\x80\xa6\x1d\x01\xa0\
|
essageType_DebugLinkRecordScreen\x10\xabF\x1a\x08\x80\xa6\x1d\x01\xa0\
|
||||||
\xb5\x18\x01\x12+\n\x20MessageType_EthereumGetPublicKey\x10\xc2\x03\x1a\
|
\xb5\x18\x01\x12/\n\x20MessageType_DebugLinkEraseSdCard\x10\xadF\x1a\x08\
|
||||||
\x04\x90\xb5\x18\x01\x12(\n\x1dMessageType_EthereumPublicKey\x10\xc3\x03\
|
\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x12/\n\x20MessageType_DebugLinkWatchLay\
|
||||||
\x1a\x04\x98\xb5\x18\x01\x12(\n\x1eMessageType_EthereumGetAddress\x108\
|
out\x10\xaeF\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\x01\x124\n%MessageType_\
|
||||||
\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_EthereumAddress\x109\x1a\
|
DebugLinkResetDebugEvents\x10\xafF\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\
|
||||||
\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EthereumSignTx\x10:\x1a\x04\
|
\x01\x123\n$MessageType_DebugLinkOptigaSetSecMax\x10\xb0F\x1a\x08\x80\
|
||||||
\x90\xb5\x18\x01\x12,\n!MessageType_EthereumSignTxEIP1559\x10\xc4\x03\
|
\xa6\x1d\x01\xa0\xb5\x18\x01\x12+\n\x20MessageType_EthereumGetPublicKey\
|
||||||
\x1a\x04\x90\xb5\x18\x01\x12'\n\x1dMessageType_EthereumTxRequest\x10;\
|
\x10\xc2\x03\x1a\x04\x90\xb5\x18\x01\x12(\n\x1dMessageType_EthereumPubli\
|
||||||
\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_EthereumTxAck\x10<\x1a\
|
cKey\x10\xc3\x03\x1a\x04\x98\xb5\x18\x01\x12(\n\x1eMessageType_EthereumG\
|
||||||
\x04\x90\xb5\x18\x01\x12)\n\x1fMessageType_EthereumSignMessage\x10@\x1a\
|
etAddress\x108\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_EthereumAdd\
|
||||||
\x04\x90\xb5\x18\x01\x12+\n!MessageType_EthereumVerifyMessage\x10A\x1a\
|
ress\x109\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EthereumSignTx\
|
||||||
\x04\x90\xb5\x18\x01\x12.\n$MessageType_EthereumMessageSignature\x10B\
|
\x10:\x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType_EthereumSignTxEIP1559\
|
||||||
\x1a\x04\x98\xb5\x18\x01\x12,\n!MessageType_EthereumSignTypedData\x10\
|
\x10\xc4\x03\x1a\x04\x90\xb5\x18\x01\x12'\n\x1dMessageType_EthereumTxReq\
|
||||||
\xd0\x03\x1a\x04\x90\xb5\x18\x01\x125\n*MessageType_EthereumTypedDataStr\
|
uest\x10;\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_EthereumTxAck\
|
||||||
uctRequest\x10\xd1\x03\x1a\x04\x98\xb5\x18\x01\x121\n&MessageType_Ethere\
|
\x10<\x1a\x04\x90\xb5\x18\x01\x12)\n\x1fMessageType_EthereumSignMessage\
|
||||||
umTypedDataStructAck\x10\xd2\x03\x1a\x04\x90\xb5\x18\x01\x124\n)MessageT\
|
\x10@\x1a\x04\x90\xb5\x18\x01\x12+\n!MessageType_EthereumVerifyMessage\
|
||||||
ype_EthereumTypedDataValueRequest\x10\xd3\x03\x1a\x04\x98\xb5\x18\x01\
|
\x10A\x1a\x04\x90\xb5\x18\x01\x12.\n$MessageType_EthereumMessageSignatur\
|
||||||
\x120\n%MessageType_EthereumTypedDataValueAck\x10\xd4\x03\x1a\x04\x90\
|
e\x10B\x1a\x04\x98\xb5\x18\x01\x12,\n!MessageType_EthereumSignTypedData\
|
||||||
\xb5\x18\x01\x121\n&MessageType_EthereumTypedDataSignature\x10\xd5\x03\
|
\x10\xd0\x03\x1a\x04\x90\xb5\x18\x01\x125\n*MessageType_EthereumTypedDat\
|
||||||
\x1a\x04\x98\xb5\x18\x01\x12,\n!MessageType_EthereumSignTypedHash\x10\
|
aStructRequest\x10\xd1\x03\x1a\x04\x98\xb5\x18\x01\x121\n&MessageType_Et\
|
||||||
\xd6\x03\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_NEMGetAddress\x10\
|
hereumTypedDataStructAck\x10\xd2\x03\x1a\x04\x90\xb5\x18\x01\x124\n)Mess\
|
||||||
C\x1a\x04\x90\xb5\x18\x01\x12\x20\n\x16MessageType_NEMAddress\x10D\x1a\
|
ageType_EthereumTypedDataValueRequest\x10\xd3\x03\x1a\x04\x98\xb5\x18\
|
||||||
\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_NEMSignTx\x10E\x1a\x04\x90\
|
\x01\x120\n%MessageType_EthereumTypedDataValueAck\x10\xd4\x03\x1a\x04\
|
||||||
\xb5\x18\x01\x12!\n\x17MessageType_NEMSignedTx\x10F\x1a\x04\x98\xb5\x18\
|
\x90\xb5\x18\x01\x121\n&MessageType_EthereumTypedDataSignature\x10\xd5\
|
||||||
\x01\x12'\n\x1dMessageType_NEMDecryptMessage\x10K\x1a\x04\x90\xb5\x18\
|
\x03\x1a\x04\x98\xb5\x18\x01\x12,\n!MessageType_EthereumSignTypedHash\
|
||||||
\x01\x12)\n\x1fMessageType_NEMDecryptedMessage\x10L\x1a\x04\x98\xb5\x18\
|
\x10\xd6\x03\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_NEMGetAddress\
|
||||||
\x01\x12&\n\x1bMessageType_TezosGetAddress\x10\x96\x01\x1a\x04\x90\xb5\
|
\x10C\x1a\x04\x90\xb5\x18\x01\x12\x20\n\x16MessageType_NEMAddress\x10D\
|
||||||
\x18\x01\x12#\n\x18MessageType_TezosAddress\x10\x97\x01\x1a\x04\x98\xb5\
|
\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_NEMSignTx\x10E\x1a\x04\
|
||||||
\x18\x01\x12\"\n\x17MessageType_TezosSignTx\x10\x98\x01\x1a\x04\x90\xb5\
|
\x90\xb5\x18\x01\x12!\n\x17MessageType_NEMSignedTx\x10F\x1a\x04\x98\xb5\
|
||||||
\x18\x01\x12$\n\x19MessageType_TezosSignedTx\x10\x99\x01\x1a\x04\x98\xb5\
|
\x18\x01\x12'\n\x1dMessageType_NEMDecryptMessage\x10K\x1a\x04\x90\xb5\
|
||||||
\x18\x01\x12(\n\x1dMessageType_TezosGetPublicKey\x10\x9a\x01\x1a\x04\x90\
|
\x18\x01\x12)\n\x1fMessageType_NEMDecryptedMessage\x10L\x1a\x04\x98\xb5\
|
||||||
\xb5\x18\x01\x12%\n\x1aMessageType_TezosPublicKey\x10\x9b\x01\x1a\x04\
|
\x18\x01\x12&\n\x1bMessageType_TezosGetAddress\x10\x96\x01\x1a\x04\x90\
|
||||||
\x98\xb5\x18\x01\x12$\n\x19MessageType_StellarSignTx\x10\xca\x01\x1a\x04\
|
\xb5\x18\x01\x12#\n\x18MessageType_TezosAddress\x10\x97\x01\x1a\x04\x98\
|
||||||
\x90\xb5\x18\x01\x12)\n\x1eMessageType_StellarTxOpRequest\x10\xcb\x01\
|
\xb5\x18\x01\x12\"\n\x17MessageType_TezosSignTx\x10\x98\x01\x1a\x04\x90\
|
||||||
\x1a\x04\x98\xb5\x18\x01\x12(\n\x1dMessageType_StellarGetAddress\x10\xcf\
|
\xb5\x18\x01\x12$\n\x19MessageType_TezosSignedTx\x10\x99\x01\x1a\x04\x98\
|
||||||
\x01\x1a\x04\x90\xb5\x18\x01\x12%\n\x1aMessageType_StellarAddress\x10\
|
\xb5\x18\x01\x12(\n\x1dMessageType_TezosGetPublicKey\x10\x9a\x01\x1a\x04\
|
||||||
\xd0\x01\x1a\x04\x98\xb5\x18\x01\x12-\n\"MessageType_StellarCreateAccoun\
|
\x90\xb5\x18\x01\x12%\n\x1aMessageType_TezosPublicKey\x10\x9b\x01\x1a\
|
||||||
tOp\x10\xd2\x01\x1a\x04\x90\xb5\x18\x01\x12'\n\x1cMessageType_StellarPay\
|
\x04\x98\xb5\x18\x01\x12$\n\x19MessageType_StellarSignTx\x10\xca\x01\x1a\
|
||||||
mentOp\x10\xd3\x01\x1a\x04\x90\xb5\x18\x01\x128\n-MessageType_StellarPat\
|
\x04\x90\xb5\x18\x01\x12)\n\x1eMessageType_StellarTxOpRequest\x10\xcb\
|
||||||
hPaymentStrictReceiveOp\x10\xd4\x01\x1a\x04\x90\xb5\x18\x01\x12/\n$Messa\
|
\x01\x1a\x04\x98\xb5\x18\x01\x12(\n\x1dMessageType_StellarGetAddress\x10\
|
||||||
geType_StellarManageSellOfferOp\x10\xd5\x01\x1a\x04\x90\xb5\x18\x01\x126\
|
\xcf\x01\x1a\x04\x90\xb5\x18\x01\x12%\n\x1aMessageType_StellarAddress\
|
||||||
\n+MessageType_StellarCreatePassiveSellOfferOp\x10\xd6\x01\x1a\x04\x90\
|
\x10\xd0\x01\x1a\x04\x98\xb5\x18\x01\x12-\n\"MessageType_StellarCreateAc\
|
||||||
\xb5\x18\x01\x12*\n\x1fMessageType_StellarSetOptionsOp\x10\xd7\x01\x1a\
|
countOp\x10\xd2\x01\x1a\x04\x90\xb5\x18\x01\x12'\n\x1cMessageType_Stella\
|
||||||
\x04\x90\xb5\x18\x01\x12+\n\x20MessageType_StellarChangeTrustOp\x10\xd8\
|
rPaymentOp\x10\xd3\x01\x1a\x04\x90\xb5\x18\x01\x128\n-MessageType_Stella\
|
||||||
\x01\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_StellarAllowTrustOp\
|
rPathPaymentStrictReceiveOp\x10\xd4\x01\x1a\x04\x90\xb5\x18\x01\x12/\n$M\
|
||||||
\x10\xd9\x01\x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType_StellarAccountMe\
|
essageType_StellarManageSellOfferOp\x10\xd5\x01\x1a\x04\x90\xb5\x18\x01\
|
||||||
rgeOp\x10\xda\x01\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_StellarM\
|
\x126\n+MessageType_StellarCreatePassiveSellOfferOp\x10\xd6\x01\x1a\x04\
|
||||||
anageDataOp\x10\xdc\x01\x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType_Stell\
|
\x90\xb5\x18\x01\x12*\n\x1fMessageType_StellarSetOptionsOp\x10\xd7\x01\
|
||||||
arBumpSequenceOp\x10\xdd\x01\x1a\x04\x90\xb5\x18\x01\x12.\n#MessageType_\
|
\x1a\x04\x90\xb5\x18\x01\x12+\n\x20MessageType_StellarChangeTrustOp\x10\
|
||||||
StellarManageBuyOfferOp\x10\xde\x01\x1a\x04\x90\xb5\x18\x01\x125\n*Messa\
|
\xd8\x01\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_StellarAllowTrust\
|
||||||
geType_StellarPathPaymentStrictSendOp\x10\xdf\x01\x1a\x04\x90\xb5\x18\
|
Op\x10\xd9\x01\x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType_StellarAccount\
|
||||||
|
MergeOp\x10\xda\x01\x1a\x04\x90\xb5\x18\x01\x12*\n\x1fMessageType_Stella\
|
||||||
|
rManageDataOp\x10\xdc\x01\x1a\x04\x90\xb5\x18\x01\x12,\n!MessageType_Ste\
|
||||||
|
llarBumpSequenceOp\x10\xdd\x01\x1a\x04\x90\xb5\x18\x01\x12.\n#MessageTyp\
|
||||||
|
e_StellarManageBuyOfferOp\x10\xde\x01\x1a\x04\x90\xb5\x18\x01\x125\n*Mes\
|
||||||
|
sageType_StellarPathPaymentStrictSendOp\x10\xdf\x01\x1a\x04\x90\xb5\x18\
|
||||||
\x01\x125\n*MessageType_StellarClaimClaimableBalanceOp\x10\xe1\x01\x1a\
|
\x01\x125\n*MessageType_StellarClaimClaimableBalanceOp\x10\xe1\x01\x1a\
|
||||||
\x04\x90\xb5\x18\x01\x12&\n\x1bMessageType_StellarSignedTx\x10\xe6\x01\
|
\x04\x90\xb5\x18\x01\x12&\n\x1bMessageType_StellarSignedTx\x10\xe6\x01\
|
||||||
\x1a\x04\x98\xb5\x18\x01\x12*\n\x1fMessageType_CardanoGetPublicKey\x10\
|
\x1a\x04\x98\xb5\x18\x01\x12*\n\x1fMessageType_CardanoGetPublicKey\x10\
|
||||||
|
1054
rust/trezor-client/src/protos/generated/messages_nostr.rs
generated
Normal file
1054
rust/trezor-client/src/protos/generated/messages_nostr.rs
generated
Normal file
File diff suppressed because it is too large
Load Diff
0
tests/device_tests/nostr/__init__.py
Normal file
0
tests/device_tests/nostr/__init__.py
Normal file
102
tests/device_tests/nostr/test_nostr.py
Normal file
102
tests/device_tests/nostr/test_nostr.py
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
# This file is part of the Trezor project.
|
||||||
|
#
|
||||||
|
# Copyright (C) 2012-2025 SatoshiLabs and contributors
|
||||||
|
#
|
||||||
|
# This library is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License version 3
|
||||||
|
# as published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the License along with this library.
|
||||||
|
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
|
||||||
|
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
from hashlib import sha256
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from ecdsa import SECP256k1, VerifyingKey
|
||||||
|
from six import b
|
||||||
|
|
||||||
|
from trezorlib import nostr
|
||||||
|
from trezorlib.debuglink import TrezorClientDebugLink as Client
|
||||||
|
from trezorlib.tools import parse_path
|
||||||
|
|
||||||
|
# test data from NIP-06: https://github.com/nostr-protocol/nips/blob/master/06.md
|
||||||
|
|
||||||
|
LEAD_MONKEY_MNEMONIC = (
|
||||||
|
"leader monkey parrot ring guide accident before fence cannon height naive bean"
|
||||||
|
)
|
||||||
|
LEAD_MONKEY_PK = "17162c921dc4d2518f9a101db33695df1afb56ab82f5ff3e5da6eec3ca5cd917"
|
||||||
|
|
||||||
|
WHAT_BLEAK_MNEMONIC = "what bleak badge arrange retreat wolf trade produce cricket blur garlic valid proud rude strong choose busy staff weather area salt hollow arm fade"
|
||||||
|
WHAT_BLEAK_PK = "d41b22899549e1f3d335a31002cfd382174006e166d3e658e3a5eecdb6463573"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.setup_client(mnemonic=LEAD_MONKEY_MNEMONIC)
|
||||||
|
def test_sign_event_lead_monkey(client: Client):
|
||||||
|
_test_sign_event(client, LEAD_MONKEY_PK)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.setup_client(mnemonic=WHAT_BLEAK_MNEMONIC)
|
||||||
|
def test_sign_event_what_bleak(client: Client):
|
||||||
|
_test_sign_event(client, WHAT_BLEAK_PK)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.setup_client(mnemonic=LEAD_MONKEY_MNEMONIC)
|
||||||
|
def test_get_pubkey_lead_monkey(client: Client):
|
||||||
|
_test_get_pubkey(client, LEAD_MONKEY_PK)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.setup_client(mnemonic=WHAT_BLEAK_MNEMONIC)
|
||||||
|
def test_get_pubkey_what_bleak(client: Client):
|
||||||
|
_test_get_pubkey(client, WHAT_BLEAK_PK)
|
||||||
|
|
||||||
|
|
||||||
|
def _test_get_pubkey(client, expected_pk):
|
||||||
|
response = nostr.get_pubkey(
|
||||||
|
client,
|
||||||
|
n=parse_path("m/44'/1237'/0'/0/0"),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert response.pubkey == bytes.fromhex(expected_pk)
|
||||||
|
|
||||||
|
|
||||||
|
def _test_sign_event(client, expected_pk):
|
||||||
|
created_at = int(time.time())
|
||||||
|
kind = 1
|
||||||
|
tags = []
|
||||||
|
content = "Hello, world!"
|
||||||
|
|
||||||
|
response = nostr.sign_event(
|
||||||
|
client,
|
||||||
|
event=json.dumps(
|
||||||
|
{"created_at": created_at, "kind": kind, "tags": tags, "content": content}
|
||||||
|
),
|
||||||
|
n=parse_path("m/44'/1237'/0'/0/0"),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert response.pubkey == bytes.fromhex(expected_pk)
|
||||||
|
|
||||||
|
expected_id = sha256(
|
||||||
|
json.dumps(
|
||||||
|
[0, expected_pk, created_at, kind, tags, content], separators=(",", ":")
|
||||||
|
).encode("utf-8")
|
||||||
|
).digest()
|
||||||
|
|
||||||
|
assert response.id == expected_id
|
||||||
|
|
||||||
|
vk = VerifyingKey.from_string(
|
||||||
|
b("\x03") + bytes.fromhex(expected_pk),
|
||||||
|
curve=SECP256k1,
|
||||||
|
# this is a pretty silly way to tell VerifyingKey
|
||||||
|
# that we do not want the message to be hashed
|
||||||
|
# when verifying the signature!
|
||||||
|
hashfunc=lambda x: type("h", (), {"digest": lambda: x}),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert vk.verify(response.signature, response.id)
|
Loading…
Reference in New Issue
Block a user