trezor-core/src/apps/common/request_passphrase.py

71 lines
2.4 KiB
Python
Raw Normal View History

from trezor import ui, wire
from trezor.messages import ButtonRequestType, wire_types
from trezor.messages.ButtonRequest import ButtonRequest
from trezor.messages.FailureType import ActionCancelled, ProcessError
from trezor.messages.PassphraseRequest import PassphraseRequest
from trezor.ui.entry_select import DEVICE, EntrySelector
from trezor.ui.passphrase import CANCELLED, PassphraseKeyboard
from trezor.ui.text import Text
from apps.common import storage
from apps.common.cache import get_state
2016-10-20 06:04:54 -07:00
@ui.layout
async def request_passphrase_entry(ctx):
text = Text(
'Enter passphrase', ui.ICON_DEFAULT,
'Where to enter your', 'passphrase?')
text.render()
ack = await ctx.call(
ButtonRequest(code=ButtonRequestType.Other),
wire_types.ButtonAck,
wire_types.Cancel)
if ack.MESSAGE_WIRE_TYPE == wire_types.Cancel:
raise wire.FailureError(ActionCancelled, 'Passphrase cancelled')
return await EntrySelector(text)
@ui.layout
async def request_passphrase_ack(ctx, on_device):
if not on_device:
text = Text(
'Passphrase entry', ui.ICON_DEFAULT,
'Please, type passphrase', 'on connected host.')
text.render()
2016-10-20 06:04:54 -07:00
req = PassphraseRequest(on_device=on_device)
ack = await ctx.call(req, wire_types.PassphraseAck, wire_types.Cancel)
if ack.MESSAGE_WIRE_TYPE == wire_types.Cancel:
raise wire.FailureError(ActionCancelled, 'Passphrase cancelled')
if on_device:
if ack.passphrase is not None:
raise wire.FailureError(ProcessError, 'Passphrase provided when it should not be')
passphrase = await PassphraseKeyboard('Enter passphrase')
if passphrase == CANCELLED:
raise wire.FailureError(ActionCancelled, 'Passphrase cancelled')
else:
if ack.passphrase is None:
raise wire.FailureError(ProcessError, 'Passphrase not provided')
passphrase = ack.passphrase
return ack.state, passphrase
2017-01-24 05:10:36 -08:00
async def request_passphrase(ctx):
on_device = await request_passphrase_entry(ctx) == DEVICE
state, passphrase = await request_passphrase_ack(ctx, on_device)
if state is not None:
if state != get_state(salt=state[:32], passphrase=passphrase):
raise wire.FailureError(ProcessError, 'Passphrase mismatch')
return passphrase
2017-01-24 05:10:36 -08:00
2017-08-15 06:09:09 -07:00
async def protect_by_passphrase(ctx):
2017-10-24 04:58:40 -07:00
if storage.has_passphrase():
2017-08-15 06:09:09 -07:00
return await request_passphrase(ctx)
2017-01-24 05:10:36 -08:00
else:
return ''