mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-07-09 16:18:10 +00:00
45 lines
1.5 KiB
Python
Executable File
45 lines
1.5 KiB
Python
Executable File
from trezor import wire
|
|
from trezor.crypto.curve import secp256k1
|
|
from trezor.messages.EosGetPublicKey import EosGetPublicKey
|
|
from trezor.messages.EosPublicKey import EosPublicKey
|
|
|
|
from apps.common import paths
|
|
from apps.eos import CURVE
|
|
from apps.eos.helpers import base58_encode, validate_full_path
|
|
from apps.eos.layout import require_get_public_key
|
|
|
|
if False:
|
|
from typing import Tuple
|
|
from trezor.crypto import bip32
|
|
from apps.common import seed
|
|
|
|
|
|
def _public_key_to_wif(pub_key: bytes) -> str:
|
|
if pub_key[0] == 0x04 and len(pub_key) == 65:
|
|
head = b"\x03" if pub_key[64] & 0x01 else b"\x02"
|
|
compressed_pub_key = head + pub_key[1:33]
|
|
elif pub_key[0] in [0x02, 0x03] and len(pub_key) == 33:
|
|
compressed_pub_key = pub_key
|
|
else:
|
|
raise wire.DataError("invalid public key")
|
|
return base58_encode("EOS", "", compressed_pub_key)
|
|
|
|
|
|
def _get_public_key(node: bip32.HDNode) -> Tuple[str, bytes]:
|
|
seckey = node.private_key()
|
|
public_key = secp256k1.publickey(seckey, True)
|
|
wif = _public_key_to_wif(public_key)
|
|
return wif, public_key
|
|
|
|
|
|
async def get_public_key(
|
|
ctx: wire.Context, msg: EosGetPublicKey, keychain: seed.Keychain
|
|
) -> EosPublicKey:
|
|
await paths.validate_path(ctx, validate_full_path, keychain, msg.address_n, CURVE)
|
|
|
|
node = keychain.derive(msg.address_n)
|
|
wif, public_key = _get_public_key(node)
|
|
if msg.show_display:
|
|
await require_get_public_key(ctx, wif)
|
|
return EosPublicKey(wif, public_key)
|