Files
trezor-agent/libagent/device/trezor_defs.py

82 lines
2.6 KiB
Python

"""TREZOR-related definitions."""
# pylint: disable=unused-import,import-error
import os
import logging
import mnemonic
import semver
import trezorlib
log = logging.getLogger(__name__)
if semver.match(trezorlib.__version__, ">=0.11.0"):
from trezorlib.client import TrezorClient as Client
from trezorlib.exceptions import TrezorFailure, PinException
from trezorlib.transport import get_transport
from trezorlib.messages import IdentityType
from trezorlib.btc import get_public_node
from trezorlib.misc import sign_identity, get_ecdh_session_key
else:
from trezorlib.client import (TrezorClient, CallException as TrezorFailure,
PinException)
from trezorlib.messages import IdentityType
from trezorlib import messages
from trezorlib.transport import get_transport
get_public_node = TrezorClient.get_public_node
sign_identity = TrezorClient.sign_identity
get_ecdh_session_key = TrezorClient.get_ecdh_session_key
class Client(TrezorClient):
def __init__(self, transport, ui, state=None):
super().__init__(transport, state=state)
self.ui = ui
def callback_PinMatrixRequest(self, msg):
try:
pin = self.ui.get_pin(msg.type)
if not pin.isdigit():
raise PinException(
None, 'Invalid scrambled PIN: {!r}'.format(pin))
return messages.PinMatrixAck(pin=pin)
except: # noqa
self.init_device()
raise
def callback_PassphraseRequest(self, msg):
try:
if msg.on_device is True:
return messages.PassphraseAck()
passphrase = self.ui.get_passphrase()
passphrase = mnemonic.Mnemonic.normalize_string(passphrase)
length = len(passphrase)
if length > 50:
msg = 'Too long passphrase ({} chars)'.format(length)
raise ValueError(msg)
return messages.PassphraseAck(passphrase=passphrase)
except: # noqa
self.init_device()
raise
def callback_PassphraseStateRequest(self, msg):
self.state = msg.state
return messages.PassphraseStateAck()
def find_device():
"""Selects a transport based on `TREZOR_PATH` environment variable.
If unset, picks first connected device.
"""
try:
return get_transport(os.environ.get("TREZOR_PATH"))
except Exception as e: # pylint: disable=broad-except
log.debug("Failed to find a Trezor device: %s", e)