trezor: implement support for Shamir recovery
This commit is contained in:
@@ -28,19 +28,29 @@ try:
|
||||
from .clientbase import TrezorClientBase
|
||||
|
||||
from trezorlib.messages import (
|
||||
RecoveryDeviceType, HDNodeType, HDNodePathType,
|
||||
Capability, BackupType, RecoveryDeviceType, HDNodeType, HDNodePathType,
|
||||
InputScriptType, OutputScriptType, MultisigRedeemScriptType,
|
||||
TxInputType, TxOutputType, TxOutputBinType, TransactionType, SignTx)
|
||||
|
||||
RECOVERY_TYPE_SCRAMBLED_WORDS = RecoveryDeviceType.ScrambledWords
|
||||
RECOVERY_TYPE_MATRIX = RecoveryDeviceType.Matrix
|
||||
|
||||
TREZORLIB = True
|
||||
except Exception as e:
|
||||
_logger.exception('error importing trezorlib')
|
||||
TREZORLIB = False
|
||||
|
||||
RECOVERY_TYPE_SCRAMBLED_WORDS, RECOVERY_TYPE_MATRIX = range(2)
|
||||
class _EnumMissing:
|
||||
def __init__(self):
|
||||
self.counter = 0
|
||||
self.values = {}
|
||||
|
||||
def __getattr__(self, key):
|
||||
if key not in self.values:
|
||||
self.values[key] = self.counter
|
||||
self.counter += 1
|
||||
return self.values[key]
|
||||
|
||||
Capability = _EnumMissing()
|
||||
BackupType = _EnumMissing()
|
||||
RecoveryDeviceType = _EnumMissing()
|
||||
|
||||
|
||||
# Trezor initialization methods
|
||||
@@ -87,6 +97,7 @@ class TrezorInitSettings(NamedTuple):
|
||||
pin_enabled: bool
|
||||
passphrase_enabled: bool
|
||||
recovery_type: Any = None
|
||||
backup_type: int = BackupType.Bip39
|
||||
no_backup: bool = False
|
||||
|
||||
|
||||
@@ -211,7 +222,7 @@ class TrezorPlugin(HW_PluginBase):
|
||||
wizard.loop.exit(exit_code)
|
||||
|
||||
def _initialize_device(self, settings: TrezorInitSettings, method, device_id, wizard, handler):
|
||||
if method == TIM_RECOVER and settings.recovery_type == RECOVERY_TYPE_SCRAMBLED_WORDS:
|
||||
if method == TIM_RECOVER and settings.recovery_type == RecoveryDeviceType.ScrambledWords:
|
||||
handler.show_error(_(
|
||||
"You will be asked to enter 24 words regardless of your "
|
||||
"seed's actual length. If you enter a word incorrectly or "
|
||||
@@ -226,12 +237,13 @@ class TrezorPlugin(HW_PluginBase):
|
||||
raise Exception(_("The device was disconnected."))
|
||||
|
||||
if method == TIM_NEW:
|
||||
strength_from_word_count = {12: 128, 18: 192, 24: 256}
|
||||
strength_from_word_count = {12: 128, 18: 192, 20: 128, 24: 256, 33: 256}
|
||||
client.reset_device(
|
||||
strength=strength_from_word_count[settings.word_count],
|
||||
passphrase_protection=settings.passphrase_enabled,
|
||||
pin_protection=settings.pin_enabled,
|
||||
label=settings.label,
|
||||
backup_type=settings.backup_type,
|
||||
no_backup=settings.no_backup)
|
||||
elif method == TIM_RECOVER:
|
||||
client.recover_device(
|
||||
@@ -240,7 +252,7 @@ class TrezorPlugin(HW_PluginBase):
|
||||
passphrase_protection=settings.passphrase_enabled,
|
||||
pin_protection=settings.pin_enabled,
|
||||
label=settings.label)
|
||||
if settings.recovery_type == RECOVERY_TYPE_MATRIX:
|
||||
if settings.recovery_type == RecoveryDeviceType.Matrix:
|
||||
handler.close_matrix_dialog()
|
||||
else:
|
||||
raise RuntimeError("Unsupported recovery method")
|
||||
|
||||
Reference in New Issue
Block a user