device: import device-specific `defs` module lazily

It may fail on unsupported platforms (e.g. keepkeylib does not supoprt Python 3)
nistp521
Roman Zeyde 8 years ago
parent 604b2b7e99
commit cad2ec1239
No known key found for this signature in database
GPG Key ID: 87CAE5FA46917CBB

@ -20,7 +20,10 @@ def _verify_support(identity, ecdh):
class KeepKey(trezor.Trezor): class KeepKey(trezor.Trezor):
"""Connection to KeepKey device.""" """Connection to KeepKey device."""
from . import keepkey_defs as defs @property
def _defs(self):
from . import keepkey_defs
return keepkey_defs
required_version = '>=1.0.4' required_version = '>=1.0.4'

@ -12,19 +12,22 @@ log = logging.getLogger(__name__)
class Trezor(interface.Device): class Trezor(interface.Device):
"""Connection to TREZOR device.""" """Connection to TREZOR device."""
from . import trezor_defs as defs @property
def _defs(self):
from . import trezor_defs
return trezor_defs
required_version = '>=1.4.0' required_version = '>=1.4.0'
def connect(self): def connect(self):
"""Enumerate and connect to the first USB HID interface.""" """Enumerate and connect to the first USB HID interface."""
def empty_passphrase_handler(_): def empty_passphrase_handler(_):
return self.defs.PassphraseAck(passphrase='') return self._defs.PassphraseAck(passphrase='')
for d in self.defs.HidTransport.enumerate(): for d in self._defs.HidTransport.enumerate():
log.debug('endpoint: %s', d) log.debug('endpoint: %s', d)
transport = self.defs.HidTransport(d) transport = self._defs.HidTransport(d)
connection = self.defs.Client(transport) connection = self._defs.Client(transport)
connection.callback_PassphraseRequest = empty_passphrase_handler connection.callback_PassphraseRequest = empty_passphrase_handler
f = connection.features f = connection.features
log.debug('connected to %s %s', self, f.device_id) log.debug('connected to %s %s', self, f.device_id)
@ -60,7 +63,7 @@ class Trezor(interface.Device):
return result.node.public_key return result.node.public_key
def _identity_proto(self, identity): def _identity_proto(self, identity):
result = self.defs.IdentityType() result = self._defs.IdentityType()
for name, value in identity.items(): for name, value in identity.items():
setattr(result, name, value) setattr(result, name, value)
return result return result
@ -80,7 +83,7 @@ class Trezor(interface.Device):
assert len(result.signature) == 65 assert len(result.signature) == 65
assert result.signature[:1] == b'\x00' assert result.signature[:1] == b'\x00'
return result.signature[1:] return result.signature[1:]
except self.defs.CallException as e: except self._defs.CallException as e:
msg = '{} error: {}'.format(self, e) msg = '{} error: {}'.format(self, e)
log.debug(msg, exc_info=True) log.debug(msg, exc_info=True)
raise interface.DeviceError(msg) raise interface.DeviceError(msg)
@ -99,7 +102,7 @@ class Trezor(interface.Device):
assert len(result.session_key) in {65, 33} # NIST256 or Curve25519 assert len(result.session_key) in {65, 33} # NIST256 or Curve25519
assert result.session_key[:1] == b'\x04' assert result.session_key[:1] == b'\x04'
return result.session_key return result.session_key
except self.defs.CallException as e: except self._defs.CallException as e:
msg = '{} error: {}'.format(self, e) msg = '{} error: {}'.format(self, e)
log.debug(msg, exc_info=True) log.debug(msg, exc_info=True)
raise interface.DeviceError(msg) raise interface.DeviceError(msg)

Loading…
Cancel
Save