From 5a5842111b44c38ffb144cd5d664bd77be4df128 Mon Sep 17 00:00:00 2001 From: Jan Pochyla Date: Mon, 5 Feb 2018 14:54:46 +0100 Subject: [PATCH] apps/management/reset_device: allow to skip backup --- src/apps/common/storage.py | 9 ++++++-- src/apps/management/reset_device.py | 32 ++++++++++++++++------------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/apps/common/storage.py b/src/apps/common/storage.py index 22d23ea1..0cb8d79a 100644 --- a/src/apps/common/storage.py +++ b/src/apps/common/storage.py @@ -12,6 +12,7 @@ _LANGUAGE = const(0x03) # str _LABEL = const(0x04) # str _USE_PASSPHRASE = const(0x05) # 0x01 or empty _HOMESCREEN = const(0x06) # bytes +_NEEDS_BACKUP = const(0x07) # 0x01 or empty def get_device_id() -> str: @@ -42,9 +43,13 @@ def get_homescreen() -> bytes: return config.get(_APP, _HOMESCREEN, True) # public -def load_mnemonic(mnemonic: str): - config.set(_APP, _VERSION, _STORAGE_VERSION) +def load_mnemonic(mnemonic: str, needs_backup: bool): config.set(_APP, _MNEMONIC, mnemonic.encode()) + config.set(_APP, _VERSION, _STORAGE_VERSION) + if needs_backup: + config.set(_APP, _NEEDS_BACKUP, b'\x01') + else: + config.set(_APP, _NEEDS_BACKUP, b'') def load_settings(label: str=None, use_passphrase: bool=None, homescreen: bytes=None): diff --git a/src/apps/management/reset_device.py b/src/apps/management/reset_device.py index 779e6bdf..b56dd2b5 100644 --- a/src/apps/management/reset_device.py +++ b/src/apps/management/reset_device.py @@ -37,10 +37,11 @@ async def reset_device(ctx, msg): FailureType.UnexpectedMessage, 'Already initialized') - # request new PIN if msg.pin_protection: + # request new PIN newpin = await request_pin_confirm(ctx) else: + # new PIN is empty newpin = '' # generate and display internal entropy @@ -49,20 +50,22 @@ async def reset_device(ctx, msg): await show_entropy(ctx, internal_entropy) # request external entropy and compute mnemonic - ext_ack = await ctx.call(EntropyRequest(), wire_types.EntropyAck) + ack = await ctx.call(EntropyRequest(), wire_types.EntropyAck) mnemonic = generate_mnemonic( - msg.strength, - internal_entropy, - ext_ack.entropy) + msg.strength, internal_entropy, ack.entropy) - # warn user about mnemonic safety - await show_warning(ctx) - while True: - # show mnemonic and make user to confirm a random word - await show_mnemonic(ctx, mnemonic) - if await check_mnemonic(ctx, mnemonic): - break - await show_wrong_entry(ctx) + if msg.skip_backup: + # let user backup the mnemonic later + pass + else: + # warn user about mnemonic safety + await show_warning(ctx) + while True: + # show mnemonic and require confirmation of a random word + await show_mnemonic(ctx, mnemonic) + if await check_mnemonic(ctx, mnemonic): + break + await show_wrong_entry(ctx) # write PIN into storage if not config.change_pin('', newpin): @@ -72,7 +75,8 @@ async def reset_device(ctx, msg): # write settings and mnemonic into storage storage.load_settings( label=msg.label, use_passphrase=msg.passphrase_protection) - storage.load_mnemonic(mnemonic) + storage.load_mnemonic( + mnemonic=mnemonic, needs_backup=msg.skip_backup) # show success message await show_success(ctx)