From 4f8022c5cdde0416aa2df4d5722d95ab3b37d2a4 Mon Sep 17 00:00:00 2001 From: Tomas Susanka Date: Thu, 27 Jun 2019 13:34:52 +0200 Subject: [PATCH] core/slip39: remove partial persistance in Shamir recovery --- core/src/apps/common/mnemonic/bip39.py | 2 +- core/src/apps/common/mnemonic/slip39.py | 6 +++-- core/src/apps/management/recovery_device.py | 29 ++++++++------------- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/core/src/apps/common/mnemonic/bip39.py b/core/src/apps/common/mnemonic/bip39.py index 2bb437625..09426b285 100644 --- a/core/src/apps/common/mnemonic/bip39.py +++ b/core/src/apps/common/mnemonic/bip39.py @@ -34,7 +34,7 @@ def get_seed(secret: bytes, passphrase: str): return seed -def get_mnemonic_count(mnemonic: str) -> int: +def get_mnemonic_threshold(mnemonic: str) -> int: return 1 diff --git a/core/src/apps/common/mnemonic/slip39.py b/core/src/apps/common/mnemonic/slip39.py index b2a0bc704..e888fa7cf 100644 --- a/core/src/apps/common/mnemonic/slip39.py +++ b/core/src/apps/common/mnemonic/slip39.py @@ -66,7 +66,9 @@ def process_all(mnemonics: list) -> bytes: Receives all mnemonics and processes it into pre-master secret which is usually then stored in the storage. """ - _, _, secret = slip39.combine_mnemonics(mnemonics) + identifier, iteration_exponent, secret = slip39.combine_mnemonics(mnemonics) + storage.set_slip39_iteration_exponent(iteration_exponent) + storage.set_slip39_identifier(identifier) return secret @@ -86,6 +88,6 @@ def get_seed(encrypted_master_secret: bytes, passphrase: str): return master_secret -def get_mnemonic_count(mnemonic: str) -> int: +def get_mnemonic_threshold(mnemonic: str) -> int: _, _, _, _, _, _, threshold, _ = slip39.decode_mnemonic(mnemonic) return threshold diff --git a/core/src/apps/management/recovery_device.py b/core/src/apps/management/recovery_device.py index fa9122de0..f48f69174 100644 --- a/core/src/apps/management/recovery_device.py +++ b/core/src/apps/management/recovery_device.py @@ -60,9 +60,8 @@ async def recovery_device(ctx, msg): wordcount = storage.get_slip39_words_count() mnemonic_module = mnemonic.slip39 - if msg.dry_run: - dry_run_mnemonics = [] - dry_run_mnemonic_count = None + mnemonic_threshold = None + mnemonics = [] secret = None while secret is None: @@ -70,21 +69,15 @@ async def recovery_device(ctx, msg): words = await request_mnemonic( ctx, wordcount, mnemonic_module == mnemonic.slip39 ) - try: - if msg.dry_run: - if dry_run_mnemonic_count is None: - dry_run_mnemonic_count = mnemonic_module.get_mnemonic_count(words) - dry_run_mnemonics.append(words) - else: - secret = mnemonic_module.process_single(words) - except slip39.MnemonicError as e: - raise wire.ProcessError("Mnemonic is not valid: " + str(e)) - if msg.dry_run: - remaining = dry_run_mnemonic_count - len(dry_run_mnemonics) - if remaining == 0: - secret = mnemonic_module.process_all(dry_run_mnemonics) - else: - remaining = storage.get_slip39_remaining() + if mnemonic_threshold is None: + mnemonic_threshold = mnemonic_module.get_mnemonic_threshold(words) + mnemonics.append(words) + remaining = mnemonic_threshold - len(mnemonics) + if remaining == 0: + try: + secret = mnemonic_module.process_all(mnemonics) + except slip39.MnemonicError as e: + raise wire.ProcessError("Mnemonic is not valid: " + str(e)) # show a number of remaining mnemonics for SLIP39 if secret is None and mnemonic_module == mnemonic.slip39: await show_remaining_slip39_mnemonics(ctx, title, remaining)