mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-23 07:58:09 +00:00
src/apps/management/recovery_device: dry_run, pin confirm
This commit is contained in:
parent
76590c44ad
commit
fcd712a0b0
@ -1,29 +0,0 @@
|
|||||||
from trezor import wire, ui, loop
|
|
||||||
from apps.common import cache
|
|
||||||
|
|
||||||
# used to confirm/cancel the dialogs from outside of this module (i.e.
|
|
||||||
# through debug link)
|
|
||||||
if __debug__:
|
|
||||||
signal = cache.memory.setdefault('request_words_signal', loop.signal())
|
|
||||||
|
|
||||||
|
|
||||||
@ui.layout
|
|
||||||
async def request_words(ctx, content, code=None, *args, **kwargs):
|
|
||||||
from trezor.ui.word_select import WordSelector
|
|
||||||
from trezor.messages.ButtonRequest import ButtonRequest
|
|
||||||
from trezor.messages.ButtonRequestType import Other
|
|
||||||
from trezor.messages.wire_types import ButtonAck
|
|
||||||
|
|
||||||
ui.display.clear()
|
|
||||||
dialog = WordSelector(content, *args, **kwargs)
|
|
||||||
dialog.render()
|
|
||||||
|
|
||||||
if code is None:
|
|
||||||
code = Other
|
|
||||||
await ctx.call(ButtonRequest(code=code), ButtonAck)
|
|
||||||
|
|
||||||
if __debug__:
|
|
||||||
waiter = loop.wait(signal, dialog)
|
|
||||||
else:
|
|
||||||
waiter = dialog
|
|
||||||
return await waiter
|
|
@ -1,4 +1,16 @@
|
|||||||
from trezor import ui, wire
|
from trezor import config, ui, wire
|
||||||
|
from trezor.crypto import bip39
|
||||||
|
from trezor.messages.ButtonRequest import ButtonRequest
|
||||||
|
from trezor.messages.ButtonRequestType import Other
|
||||||
|
from trezor.messages.FailureType import ProcessError, UnexpectedMessage
|
||||||
|
from trezor.messages.Success import Success
|
||||||
|
from trezor.messages.wire_types import ButtonAck
|
||||||
|
from trezor.pin import pin_to_int
|
||||||
|
from trezor.ui.keyboard import MnemonicKeyboard
|
||||||
|
from trezor.ui.text import Text
|
||||||
|
from trezor.ui.word_select import WordSelector
|
||||||
|
from apps.common import storage
|
||||||
|
from apps.management.change_pin import request_pin_confirm
|
||||||
|
|
||||||
|
|
||||||
async def recovery_device(ctx, msg):
|
async def recovery_device(ctx, msg):
|
||||||
@ -11,44 +23,56 @@ async def recovery_device(ctx, msg):
|
|||||||
4. Optionally ask for the PIN, with confirmation.
|
4. Optionally ask for the PIN, with confirmation.
|
||||||
5. Save into storage.
|
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.text import Text
|
|
||||||
from apps.common import storage
|
|
||||||
from apps.common.request_pin import request_pin
|
|
||||||
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')
|
||||||
|
|
||||||
wordcount = await request_words(ctx,
|
# ask for the number of words
|
||||||
Text('Device recovery', ui.ICON_RECOVERY,
|
wordcount = await request_wordcount(ctx)
|
||||||
'Number of words?'))
|
|
||||||
mnemonic = await request_mnemonic(wordcount, 'Type %s. word')
|
|
||||||
|
|
||||||
if msg.enforce_wordlist and not bip39.check(mnemonic):
|
# ask for mnemonic words one by one
|
||||||
raise wire.FailureError(ProcessError, 'Mnemonic is not valid')
|
mnemonic = await request_mnemonic(ctx, wordcount)
|
||||||
|
|
||||||
|
# check mnemonic validity
|
||||||
|
if msg.enforce_wordlist:
|
||||||
|
if not bip39.check(mnemonic):
|
||||||
|
raise wire.FailureError(ProcessError, 'Mnemonic is not valid')
|
||||||
|
|
||||||
|
# ask for pin repeatedly
|
||||||
if msg.pin_protection:
|
if msg.pin_protection:
|
||||||
curpin = ''
|
newpin = await request_pin_confirm(ctx, cancellable=False)
|
||||||
newpin = await request_pin(ctx)
|
|
||||||
config.change_pin(curpin, newpin)
|
# save into storage
|
||||||
|
if not msg.dry_run:
|
||||||
|
if msg.pin_protection:
|
||||||
|
config.change_pin(pin_to_int(''), pin_to_int(newpin), None)
|
||||||
|
storage.load_settings(
|
||||||
|
label=msg.label, use_passphrase=msg.passphrase_protection)
|
||||||
|
storage.load_mnemonic(
|
||||||
|
mnemonic=mnemonic, needs_backup=False)
|
||||||
|
|
||||||
storage.load_settings(label=msg.label,
|
|
||||||
use_passphrase=msg.passphrase_protection)
|
|
||||||
storage.load_mnemonic(mnemonic)
|
|
||||||
return Success()
|
return Success()
|
||||||
|
|
||||||
|
|
||||||
async def request_mnemonic(count: int, prompt: str) -> str:
|
@ui.layout
|
||||||
from trezor.ui.keyboard import MnemonicKeyboard
|
async def request_wordcount(ctx):
|
||||||
|
await ctx.call(ButtonRequest(code=Other), ButtonAck)
|
||||||
|
|
||||||
|
ui.display.clear()
|
||||||
|
content = Text('Device recovery', ui.ICON_RECOVERY, 'Number of words?')
|
||||||
|
select = WordSelector(content)
|
||||||
|
count = await select
|
||||||
|
|
||||||
|
return count
|
||||||
|
|
||||||
|
|
||||||
|
@ui.layout
|
||||||
|
async def request_mnemonic(ctx, count: int) -> str:
|
||||||
|
await ctx.call(ButtonRequest(code=Other), ButtonAck)
|
||||||
|
|
||||||
words = []
|
words = []
|
||||||
board = MnemonicKeyboard()
|
board = MnemonicKeyboard()
|
||||||
for i in range(0, count):
|
for i in range(0, count):
|
||||||
board.prompt = prompt % (i + 1)
|
board.prompt = 'Type %s. word' % (i + 1)
|
||||||
word = await board
|
word = await board
|
||||||
words.append(word)
|
words.append(word)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user