mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-18 05:28:40 +00:00
apps/management/recovery_device: adapt for new keyboard
This commit is contained in:
parent
cd0fa4df4a
commit
77b78e277a
@ -24,8 +24,8 @@ def dispatch_WipeDevice(*args, **kwargs):
|
||||
|
||||
@unimport
|
||||
def dispatch_RecoveryDevice(*args, **kwargs):
|
||||
from .recovery_device import layout_recovery_device
|
||||
return layout_recovery_device(*args, **kwargs)
|
||||
from .recovery_device import recovery_device
|
||||
return recovery_device(*args, **kwargs)
|
||||
|
||||
|
||||
@unimport
|
||||
|
@ -1,47 +1,55 @@
|
||||
from trezor import ui, wire
|
||||
from trezor.utils import unimport
|
||||
|
||||
|
||||
@unimport
|
||||
async def layout_recovery_device(ctx, msg):
|
||||
async def recovery_device(ctx, msg):
|
||||
'''
|
||||
Recover BIP39 seed into empty device.
|
||||
|
||||
1. Ask for the number of words in recovered seed.
|
||||
2. Let user type in the mnemonic words one by one.
|
||||
3. Optionally check the seed validity.
|
||||
4. Optionally ask for the PIN, with confirmation.
|
||||
5. Save into storage.
|
||||
'''
|
||||
from trezor import config
|
||||
from trezor.crypto import bip39
|
||||
from trezor.messages.FailureType import UnexpectedMessage, ProcessError
|
||||
from trezor.messages.Success import Success
|
||||
from trezor.ui.keyboard import KeyboardMultiTap
|
||||
from trezor.ui.text import Text
|
||||
from apps.common import storage
|
||||
from apps.common.confirm import require_confirm
|
||||
from apps.common.request_pin import request_pin
|
||||
from apps.common.request_words import request_words
|
||||
|
||||
if storage.is_initialized():
|
||||
raise wire.FailureError(UnexpectedMessage, 'Already initialized')
|
||||
|
||||
words = []
|
||||
wordcount = await request_words(ctx,
|
||||
Text('Device recovery', ui.ICON_RECOVERY,
|
||||
'Number of words?'))
|
||||
mnemonic = await request_mnemonic(wordcount, 'Type %s. word')
|
||||
|
||||
wc = await request_words(ctx, Text(
|
||||
'Device recovery', ui.ICON_RECOVERY, 'Number of words?'))
|
||||
msg.word_count = int(wc)
|
||||
ui.display.clear()
|
||||
kbd = KeyboardMultiTap()
|
||||
for i in range(0, msg.word_count):
|
||||
kbd.prompt = 'Type %s. word' % (i + 1)
|
||||
word = await kbd
|
||||
words.append(word)
|
||||
|
||||
# TODO: confirm words, start again?
|
||||
await require_confirm(ctx, Text(
|
||||
'Recovering seed', ui.ICON_RESET))
|
||||
|
||||
mnemonic = ' '.join(words)
|
||||
|
||||
if not msg.enforce_wordlist and not bip39.check(mnemonic):
|
||||
if msg.enforce_wordlist and not bip39.check(mnemonic):
|
||||
raise wire.FailureError(ProcessError, 'Mnemonic is not valid')
|
||||
|
||||
# TODO: request pin
|
||||
pin = ''
|
||||
if msg.pin_protection:
|
||||
curpin = ''
|
||||
newpin = await request_pin(ctx)
|
||||
config.change_pin(curpin, newpin)
|
||||
|
||||
storage.load_settings(label=msg.label,
|
||||
use_passphrase=msg.passphrase_protection)
|
||||
storage.load_mnemonic(mnemonic)
|
||||
storage.load_settings(pin=pin,
|
||||
passphrase_protection=msg.passphrase_protection,
|
||||
language=msg.language,
|
||||
label=msg.label)
|
||||
return Success()
|
||||
|
||||
|
||||
async def request_mnemonic(count: int, prompt: str) -> str:
|
||||
from trezor.ui.keyboard import MnemonicKeyboard
|
||||
|
||||
words = []
|
||||
board = MnemonicKeyboard()
|
||||
for i in range(0, count):
|
||||
board.prompt = prompt % (i + 1)
|
||||
word = await board
|
||||
words.append(word)
|
||||
|
||||
return ' '.join(words)
|
||||
|
Loading…
Reference in New Issue
Block a user