From bc7c16c5628dd40210378b652a14c60fbaea4553 Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 24 Jul 2019 15:36:33 +0200 Subject: [PATCH] python: support for multi-mnemonic load_device --- python/trezorctl | 38 +++++++++++++++++------------------ python/trezorlib/debuglink.py | 18 ++++------------- 2 files changed, 23 insertions(+), 33 deletions(-) diff --git a/python/trezorctl b/python/trezorctl index 21f9d05b8..fc02de1cc 100755 --- a/python/trezorctl +++ b/python/trezorctl @@ -417,7 +417,7 @@ def wipe_device(connect, bootloader): @cli.command(help="Load custom configuration to the device.") -@click.option("-m", "--mnemonic") +@click.option("-m", "--mnemonic", multiple=True) @click.option("-e", "--expand", is_flag=True) @click.option("-x", "--xprv") @click.option("-p", "--pin", default="") @@ -437,31 +437,31 @@ def load_device( ignore_checksum, slip0014, ): - if not mnemonic and not xprv and not slip0014: - raise tools.CallException( - proto.FailureType.DataError, "Please provide mnemonic or xprv" - ) + n_args = sum(bool(a) for a in (mnemonic, xprv, slip0014)) + if n_args == 0: + raise click.ClickException("Please provide a mnemonic or xprv") + if n_args > 1: + raise click.ClickException("Cannot use mnemonic and xprv together") client = connect() - if mnemonic: - return debuglink.load_device_by_mnemonic( - client, - mnemonic, - pin, - passphrase_protection, - label, - "english", - ignore_checksum, - expand, - ) + if xprv: return debuglink.load_device_by_xprv( client, xprv, pin, passphrase_protection, label, "english" ) + if slip0014: - return debuglink.load_device_by_mnemonic( - client, " ".join(["all"] * 12), pin, passphrase_protection, "SLIP-0014" - ) + mnemonic = [" ".join(["all"] * 12)] + + return debuglink.load_device_by_mnemonic( + client, + list(mnemonic), + pin, + passphrase_protection, + label, + "english", + ignore_checksum, + ) @cli.command(help="Start safe recovery workflow.") diff --git a/python/trezorlib/debuglink.py b/python/trezorlib/debuglink.py index 2a737d3f8..a7fb4897f 100644 --- a/python/trezorlib/debuglink.py +++ b/python/trezorlib/debuglink.py @@ -408,21 +408,11 @@ def load_device_by_mnemonic( label, language="english", skip_checksum=False, - expand=False, ): - # Convert mnemonic to UTF8 NKFD - mnemonic = Mnemonic.normalize_string(mnemonic) + if not isinstance(mnemonic, (list, tuple)): + mnemonic = [mnemonic] - # Convert mnemonic to ASCII stream - mnemonic = mnemonic.encode() - - m = Mnemonic("english") - - if expand: - mnemonic = m.expand(mnemonic) - - if not skip_checksum and not m.check(mnemonic): - raise ValueError("Invalid mnemonic checksum") + mnemonics = [Mnemonic.normalize_string(m) for m in mnemonic] if client.features.initialized: raise RuntimeError( @@ -431,7 +421,7 @@ def load_device_by_mnemonic( resp = client.call( proto.LoadDevice( - mnemonic=mnemonic, + mnemonics=mnemonics, pin=pin, passphrase_protection=passphrase_protection, language=language,