mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-07-27 08:58:28 +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
|
@unimport
|
||||||
def dispatch_RecoveryDevice(*args, **kwargs):
|
def dispatch_RecoveryDevice(*args, **kwargs):
|
||||||
from .recovery_device import layout_recovery_device
|
from .recovery_device import recovery_device
|
||||||
return layout_recovery_device(*args, **kwargs)
|
return recovery_device(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
@unimport
|
@unimport
|
||||||
|
@ -1,47 +1,55 @@
|
|||||||
from trezor import ui, wire
|
from trezor import ui, wire
|
||||||
from trezor.utils import unimport
|
|
||||||
|
|
||||||
|
|
||||||
@unimport
|
async def recovery_device(ctx, msg):
|
||||||
async def layout_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.crypto import bip39
|
||||||
from trezor.messages.FailureType import UnexpectedMessage, ProcessError
|
from trezor.messages.FailureType import UnexpectedMessage, ProcessError
|
||||||
from trezor.messages.Success import Success
|
from trezor.messages.Success import Success
|
||||||
from trezor.ui.keyboard import KeyboardMultiTap
|
|
||||||
from trezor.ui.text import Text
|
from trezor.ui.text import Text
|
||||||
from apps.common import storage
|
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
|
from apps.common.request_words import request_words
|
||||||
|
|
||||||
if storage.is_initialized():
|
if storage.is_initialized():
|
||||||
raise wire.FailureError(UnexpectedMessage, 'Already 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(
|
if msg.enforce_wordlist and not bip39.check(mnemonic):
|
||||||
'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):
|
|
||||||
raise wire.FailureError(ProcessError, 'Mnemonic is not valid')
|
raise wire.FailureError(ProcessError, 'Mnemonic is not valid')
|
||||||
|
|
||||||
# TODO: request pin
|
if msg.pin_protection:
|
||||||
pin = ''
|
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_mnemonic(mnemonic)
|
||||||
storage.load_settings(pin=pin,
|
return Success()
|
||||||
passphrase_protection=msg.passphrase_protection,
|
|
||||||
language=msg.language,
|
|
||||||
label=msg.label)
|
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