1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-02-16 17:42:02 +00:00

src/apps/common: implement passphrase_source and use it

This commit is contained in:
Pavol Rusnak 2018-03-12 15:27:30 +01:00
parent 6cf9bb1d93
commit e6bfd192e5
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D
7 changed files with 61 additions and 17 deletions

View File

@ -2,6 +2,7 @@ from trezor import ui, wire
from trezor.messages import ButtonRequestType, wire_types from trezor.messages import ButtonRequestType, wire_types
from trezor.messages.ButtonRequest import ButtonRequest from trezor.messages.ButtonRequest import ButtonRequest
from trezor.messages.FailureType import ActionCancelled, ProcessError from trezor.messages.FailureType import ActionCancelled, ProcessError
from trezor.messages import PassphraseSourceType
from trezor.messages.PassphraseRequest import PassphraseRequest from trezor.messages.PassphraseRequest import PassphraseRequest
from trezor.messages.PassphraseStateRequest import PassphraseStateRequest from trezor.messages.PassphraseStateRequest import PassphraseStateRequest
from trezor.ui.entry_select import DEVICE, EntrySelector from trezor.ui.entry_select import DEVICE, EntrySelector
@ -61,7 +62,10 @@ async def request_passphrase_ack(ctx, on_device):
async def request_passphrase(ctx): async def request_passphrase(ctx):
on_device = await request_passphrase_entry(ctx) == DEVICE if storage.get_passphrase_source() == PassphraseSourceType.ASK:
on_device = await request_passphrase_entry(ctx) == DEVICE
else:
on_device = storage.get_passphrase_source() == PassphraseSourceType.DEVICE
passphrase = await request_passphrase_ack(ctx, on_device) passphrase = await request_passphrase_ack(ctx, on_device)
return passphrase return passphrase

View File

@ -8,17 +8,18 @@ HOMESCREEN_MAXSIZE = 16384
_STORAGE_VERSION = b'\x01' _STORAGE_VERSION = b'\x01'
_APP = const(0x01) # app namespace _APP = const(0x01) # app namespace
_DEVICE_ID = const(0x00) # bytes _DEVICE_ID = const(0x00) # bytes
_VERSION = const(0x01) # int _VERSION = const(0x01) # int
_MNEMONIC = const(0x02) # str _MNEMONIC = const(0x02) # str
_LANGUAGE = const(0x03) # str _LANGUAGE = const(0x03) # str
_LABEL = const(0x04) # str _LABEL = const(0x04) # str
_USE_PASSPHRASE = const(0x05) # 0x01 or empty _USE_PASSPHRASE = const(0x05) # 0x01 or empty
_HOMESCREEN = const(0x06) # bytes _HOMESCREEN = const(0x06) # bytes
_NEEDS_BACKUP = const(0x07) # 0x01 or empty _NEEDS_BACKUP = const(0x07) # 0x01 or empty
_FLAGS = const(0x08) # int _FLAGS = const(0x08) # int
_U2F_COUNTER = const(0x09) # int _U2F_COUNTER = const(0x09) # int
_PASSPHRASE_SOURCE = const(0x0A) # int
def _new_device_id() -> str: def _new_device_id() -> str:
@ -70,7 +71,17 @@ def set_backed_up() -> None:
config.set(_APP, _NEEDS_BACKUP, b'') config.set(_APP, _NEEDS_BACKUP, b'')
def load_settings(label: str=None, use_passphrase: bool=None, homescreen: bytes=None) -> None: def get_passphrase_source() -> int:
b = config.get(_APP, _PASSPHRASE_SOURCE)
if b == b'\x01':
return 1
elif b == b'\x02':
return 2
else:
return 0
def load_settings(label: str=None, use_passphrase: bool=None, homescreen: bytes=None, passphrase_source: int=None) -> None:
if label is not None: if label is not None:
config.set(_APP, _LABEL, label.encode(), True) # public config.set(_APP, _LABEL, label.encode(), True) # public
if use_passphrase is True: if use_passphrase is True:
@ -83,6 +94,9 @@ def load_settings(label: str=None, use_passphrase: bool=None, homescreen: bytes=
config.set(_APP, _HOMESCREEN, homescreen, True) # public config.set(_APP, _HOMESCREEN, homescreen, True) # public
else: else:
config.set(_APP, _HOMESCREEN, b'', True) # public config.set(_APP, _HOMESCREEN, b'', True) # public
if passphrase_source is not None:
if passphrase_source in [0, 1, 2]:
config.set(_APP, _PASSPHRASE_SOURCE, bytes([passphrase_source]))
def get_flags() -> int: def get_flags() -> int:

View File

@ -1,5 +1,5 @@
from trezor import ui, wire from trezor import ui, wire
from trezor.messages import ButtonRequestType, FailureType from trezor.messages import ButtonRequestType, FailureType, PassphraseSourceType
from trezor.messages.Success import Success from trezor.messages.Success import Success
from trezor.ui.text import Text from trezor.ui.text import Text
from apps.common import storage from apps.common import storage
@ -7,7 +7,7 @@ from apps.common.confirm import require_confirm
async def apply_settings(ctx, msg): async def apply_settings(ctx, msg):
if msg.homescreen is None and msg.label is None and msg.use_passphrase is None: if msg.homescreen is None and msg.label is None and msg.use_passphrase is None and msg.passphrase_source is None:
raise wire.FailureError(FailureType.ProcessError, 'No setting provided') raise wire.FailureError(FailureType.ProcessError, 'No setting provided')
if msg.homescreen is not None: if msg.homescreen is not None:
@ -35,8 +35,22 @@ async def apply_settings(ctx, msg):
'encryption?'), 'encryption?'),
code=ButtonRequestType.ProtectCall) code=ButtonRequestType.ProtectCall)
if msg.passphrase_source is not None:
if msg.passphrase_source == PassphraseSourceType.DEVICE:
desc = 'ON DEVICE'
elif msg.passphrase_source == PassphraseSourceType.HOST:
desc = 'ON HOST'
else:
desc = 'ASK'
await require_confirm(ctx, Text(
'Passphrase source', ui.ICON_CONFIG,
'Do you really want to', 'change the passphrase', 'source to',
ui.BOLD, 'ALWAYS %s?' % desc),
code=ButtonRequestType.ProtectCall)
storage.load_settings(label=msg.label, storage.load_settings(label=msg.label,
use_passphrase=msg.use_passphrase, use_passphrase=msg.use_passphrase,
homescreen=msg.homescreen) homescreen=msg.homescreen,
passphrase_source=msg.passphrase_source)
return Success(message='Settings applied') return Success(message='Settings applied')

View File

@ -8,6 +8,7 @@ class ApplySettings(p.MessageType):
2: ('label', p.UnicodeType, 0), 2: ('label', p.UnicodeType, 0),
3: ('use_passphrase', p.BoolType, 0), 3: ('use_passphrase', p.BoolType, 0),
4: ('homescreen', p.BytesType, 0), 4: ('homescreen', p.BytesType, 0),
5: ('passphrase_source', p.UVarintType, 0),
} }
MESSAGE_WIRE_TYPE = 25 MESSAGE_WIRE_TYPE = 25
@ -17,10 +18,12 @@ class ApplySettings(p.MessageType):
label: str = None, label: str = None,
use_passphrase: bool = None, use_passphrase: bool = None,
homescreen: bytes = None, homescreen: bytes = None,
passphrase_source: int = None,
**kwargs, **kwargs,
): ):
self.language = language self.language = language
self.label = label self.label = label
self.use_passphrase = use_passphrase self.use_passphrase = use_passphrase
self.homescreen = homescreen self.homescreen = homescreen
self.passphrase_source = passphrase_source
p.MessageType.__init__(self, **kwargs) p.MessageType.__init__(self, **kwargs)

View File

@ -13,6 +13,7 @@ class EthereumSignTx(p.MessageType):
7: ('data_initial_chunk', p.BytesType, 0), 7: ('data_initial_chunk', p.BytesType, 0),
8: ('data_length', p.UVarintType, 0), 8: ('data_length', p.UVarintType, 0),
9: ('chain_id', p.UVarintType, 0), 9: ('chain_id', p.UVarintType, 0),
10: ('tx_type', p.UVarintType, 0),
} }
MESSAGE_WIRE_TYPE = 58 MESSAGE_WIRE_TYPE = 58
@ -27,6 +28,7 @@ class EthereumSignTx(p.MessageType):
data_initial_chunk: bytes = None, data_initial_chunk: bytes = None,
data_length: int = None, data_length: int = None,
chain_id: int = None, chain_id: int = None,
tx_type: int = None,
**kwargs, **kwargs,
): ):
self.address_n = [] if address_n is None else address_n self.address_n = [] if address_n is None else address_n
@ -38,4 +40,5 @@ class EthereumSignTx(p.MessageType):
self.data_initial_chunk = data_initial_chunk self.data_initial_chunk = data_initial_chunk
self.data_length = data_length self.data_length = data_length
self.chain_id = chain_id self.chain_id = chain_id
self.tx_type = tx_type
p.MessageType.__init__(self, **kwargs) p.MessageType.__init__(self, **kwargs)

View File

@ -0,0 +1,6 @@
# Automatically generated by pb2py
from micropython import const
ASK = const(0)
DEVICE = const(1)
HOST = const(2)

@ -1 +1 @@
Subproject commit 0924bd6826bb63f66010e2e511356d54ea733df3 Subproject commit 998eb4c7a76bdb5190f5f9f52bf8c53d795fbb25