|
|
|
@ -14,26 +14,11 @@
|
|
|
|
|
# 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 functools
|
|
|
|
|
import logging
|
|
|
|
|
import sys
|
|
|
|
|
import warnings
|
|
|
|
|
|
|
|
|
|
from . import (
|
|
|
|
|
btc,
|
|
|
|
|
cosi,
|
|
|
|
|
device,
|
|
|
|
|
ethereum,
|
|
|
|
|
exceptions,
|
|
|
|
|
firmware,
|
|
|
|
|
lisk,
|
|
|
|
|
mapping,
|
|
|
|
|
messages as proto,
|
|
|
|
|
misc,
|
|
|
|
|
nem,
|
|
|
|
|
stellar,
|
|
|
|
|
tools,
|
|
|
|
|
)
|
|
|
|
|
from . import exceptions, messages as proto, tools
|
|
|
|
|
|
|
|
|
|
if sys.version_info.major < 3:
|
|
|
|
|
raise Exception("Trezorlib does not support Python 2 anymore.")
|
|
|
|
@ -44,6 +29,12 @@ LOG = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
PinException = exceptions.PinException
|
|
|
|
|
|
|
|
|
|
DEPRECATION_ERROR = """
|
|
|
|
|
Incompatible Trezor library detected.
|
|
|
|
|
|
|
|
|
|
(Original error: {})
|
|
|
|
|
""".strip()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_buttonrequest_value(code):
|
|
|
|
|
# Converts integer code to its string representation of ButtonRequestType
|
|
|
|
@ -54,29 +45,6 @@ def get_buttonrequest_value(code):
|
|
|
|
|
][0]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MovedTo:
|
|
|
|
|
"""Deprecation redirector for methods that were formerly part of TrezorClient"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, where):
|
|
|
|
|
self.where = where
|
|
|
|
|
self.name = where.__module__ + "." + where.__name__
|
|
|
|
|
|
|
|
|
|
def _deprecated_redirect(self, client, *args, **kwargs):
|
|
|
|
|
"""Redirector for a deprecated method on TrezorClient"""
|
|
|
|
|
warnings.warn(
|
|
|
|
|
"Function has been moved to %s" % self.name,
|
|
|
|
|
DeprecationWarning,
|
|
|
|
|
stacklevel=2,
|
|
|
|
|
)
|
|
|
|
|
return self.where(client, *args, **kwargs)
|
|
|
|
|
|
|
|
|
|
def __get__(self, instance, cls):
|
|
|
|
|
if instance is None:
|
|
|
|
|
return self._deprecated_redirect
|
|
|
|
|
else:
|
|
|
|
|
return functools.partial(self._deprecated_redirect, instance)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TrezorClient:
|
|
|
|
|
VENDORS = ("bitcointrezor.com", "trezor.io")
|
|
|
|
|
# Implements very basic layer of sending raw protobuf
|
|
|
|
@ -209,6 +177,14 @@ class TrezorClient:
|
|
|
|
|
return self.call_raw(proto.ClearSession())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def MovedTo(where):
|
|
|
|
|
def moved_to(*args, **kwargs):
|
|
|
|
|
msg = "Function has been moved to " + where
|
|
|
|
|
raise RuntimeError(DEPRECATION_ERROR.format(msg))
|
|
|
|
|
|
|
|
|
|
return moved_to
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProtocolMixin(object):
|
|
|
|
|
"""Fake mixin for old-style software that constructed TrezorClient class
|
|
|
|
|
from separate mixins.
|
|
|
|
@ -235,58 +211,63 @@ class ProtocolMixin(object):
|
|
|
|
|
return tools.parse_path(n)
|
|
|
|
|
|
|
|
|
|
# Device functionality
|
|
|
|
|
wipe_device = MovedTo(device.wipe)
|
|
|
|
|
recovery_device = MovedTo(device.recover)
|
|
|
|
|
reset_device = MovedTo(device.reset)
|
|
|
|
|
backup_device = MovedTo(device.backup)
|
|
|
|
|
wipe_device = MovedTo("device.wipe")
|
|
|
|
|
recovery_device = MovedTo("device.recover")
|
|
|
|
|
reset_device = MovedTo("device.reset")
|
|
|
|
|
backup_device = MovedTo("device.backup")
|
|
|
|
|
|
|
|
|
|
set_u2f_counter = MovedTo(device.set_u2f_counter)
|
|
|
|
|
set_u2f_counter = MovedTo("device.set_u2f_counter")
|
|
|
|
|
|
|
|
|
|
apply_settings = MovedTo(device.apply_settings)
|
|
|
|
|
apply_flags = MovedTo(device.apply_flags)
|
|
|
|
|
change_pin = MovedTo(device.change_pin)
|
|
|
|
|
apply_settings = MovedTo("device.apply_settings")
|
|
|
|
|
apply_flags = MovedTo("device.apply_flags")
|
|
|
|
|
change_pin = MovedTo("device.change_pin")
|
|
|
|
|
|
|
|
|
|
# Firmware functionality
|
|
|
|
|
firmware_update = MovedTo(firmware.update)
|
|
|
|
|
firmware_update = MovedTo("firmware.update")
|
|
|
|
|
|
|
|
|
|
# BTC-like functionality
|
|
|
|
|
get_public_node = MovedTo(btc.get_public_node)
|
|
|
|
|
get_address = MovedTo(btc.get_address)
|
|
|
|
|
sign_tx = MovedTo(btc.sign_tx)
|
|
|
|
|
sign_message = MovedTo(btc.sign_message)
|
|
|
|
|
verify_message = MovedTo(btc.verify_message)
|
|
|
|
|
get_public_node = MovedTo("btc.get_public_node")
|
|
|
|
|
get_address = MovedTo("btc.get_address")
|
|
|
|
|
sign_tx = MovedTo("btc.sign_tx")
|
|
|
|
|
sign_message = MovedTo("btc.sign_message")
|
|
|
|
|
verify_message = MovedTo("btc.verify_message")
|
|
|
|
|
|
|
|
|
|
# CoSi functionality
|
|
|
|
|
cosi_commit = MovedTo(cosi.commit)
|
|
|
|
|
cosi_sign = MovedTo(cosi.sign)
|
|
|
|
|
cosi_commit = MovedTo("cosi.commit")
|
|
|
|
|
cosi_sign = MovedTo("cosi.sign")
|
|
|
|
|
|
|
|
|
|
# Ethereum functionality
|
|
|
|
|
ethereum_get_address = MovedTo(ethereum.get_address)
|
|
|
|
|
ethereum_sign_tx = MovedTo(ethereum.sign_tx)
|
|
|
|
|
ethereum_sign_message = MovedTo(ethereum.sign_message)
|
|
|
|
|
ethereum_verify_message = MovedTo(ethereum.verify_message)
|
|
|
|
|
ethereum_get_address = MovedTo("ethereum.get_address")
|
|
|
|
|
ethereum_sign_tx = MovedTo("ethereum.sign_tx")
|
|
|
|
|
ethereum_sign_message = MovedTo("ethereum.sign_message")
|
|
|
|
|
ethereum_verify_message = MovedTo("ethereum.verify_message")
|
|
|
|
|
|
|
|
|
|
# Lisk functionality
|
|
|
|
|
lisk_get_address = MovedTo(lisk.get_address)
|
|
|
|
|
lisk_get_public_key = MovedTo(lisk.get_public_key)
|
|
|
|
|
lisk_sign_message = MovedTo(lisk.sign_message)
|
|
|
|
|
lisk_verify_message = MovedTo(lisk.verify_message)
|
|
|
|
|
lisk_sign_tx = MovedTo(lisk.sign_tx)
|
|
|
|
|
lisk_get_address = MovedTo("lisk.get_address")
|
|
|
|
|
lisk_get_public_key = MovedTo("lisk.get_public_key")
|
|
|
|
|
lisk_sign_message = MovedTo("lisk.sign_message")
|
|
|
|
|
lisk_verify_message = MovedTo("lisk.verify_message")
|
|
|
|
|
lisk_sign_tx = MovedTo("lisk.sign_tx")
|
|
|
|
|
|
|
|
|
|
# NEM functionality
|
|
|
|
|
nem_get_address = MovedTo(nem.get_address)
|
|
|
|
|
nem_sign_tx = MovedTo(nem.sign_tx)
|
|
|
|
|
nem_get_address = MovedTo("nem.get_address")
|
|
|
|
|
nem_sign_tx = MovedTo("nem.sign_tx")
|
|
|
|
|
|
|
|
|
|
# Stellar functionality
|
|
|
|
|
stellar_get_address = MovedTo(stellar.get_address)
|
|
|
|
|
stellar_sign_transaction = MovedTo(stellar.sign_tx)
|
|
|
|
|
stellar_get_address = MovedTo("stellar.get_address")
|
|
|
|
|
stellar_sign_transaction = MovedTo("stellar.sign_tx")
|
|
|
|
|
|
|
|
|
|
# Miscellaneous cryptographic functionality
|
|
|
|
|
get_entropy = MovedTo(misc.get_entropy)
|
|
|
|
|
sign_identity = MovedTo(misc.sign_identity)
|
|
|
|
|
get_ecdh_session_key = MovedTo(misc.get_ecdh_session_key)
|
|
|
|
|
encrypt_keyvalue = MovedTo(misc.encrypt_keyvalue)
|
|
|
|
|
decrypt_keyvalue = MovedTo(misc.decrypt_keyvalue)
|
|
|
|
|
get_entropy = MovedTo("misc.get_entropy")
|
|
|
|
|
sign_identity = MovedTo("misc.sign_identity")
|
|
|
|
|
get_ecdh_session_key = MovedTo("misc.get_ecdh_session_key")
|
|
|
|
|
encrypt_keyvalue = MovedTo("misc.encrypt_keyvalue")
|
|
|
|
|
decrypt_keyvalue = MovedTo("misc.decrypt_keyvalue")
|
|
|
|
|
|
|
|
|
|
# Debug device functionality
|
|
|
|
|
load_device_by_mnemonic = MovedTo("debuglink.load_device_by_mnemonic")
|
|
|
|
|
load_device_by_xprv = MovedTo("debuglink.load_device_by_xprv")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class BaseClient:
|
|
|
|
|
"""Compatibility proxy for original BaseClient class.
|
|
|
|
|