You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
trezor-firmware/core/src/apps/eos/get_public_key.py

45 lines
1.5 KiB

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)