From e6bfd192e5e25fe85a2e0bc3b9b05c28eea48006 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 12 Mar 2018 15:27:30 +0100 Subject: [PATCH] src/apps/common: implement passphrase_source and use it --- src/apps/common/request_passphrase.py | 6 +++- src/apps/common/storage.py | 38 ++++++++++++++------- src/apps/management/apply_settings.py | 20 +++++++++-- src/trezor/messages/ApplySettings.py | 3 ++ src/trezor/messages/EthereumSignTx.py | 3 ++ src/trezor/messages/PassphraseSourceType.py | 6 ++++ vendor/trezor-common | 2 +- 7 files changed, 61 insertions(+), 17 deletions(-) create mode 100644 src/trezor/messages/PassphraseSourceType.py diff --git a/src/apps/common/request_passphrase.py b/src/apps/common/request_passphrase.py index ec11622853..c347c65f79 100644 --- a/src/apps/common/request_passphrase.py +++ b/src/apps/common/request_passphrase.py @@ -2,6 +2,7 @@ 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 import PassphraseSourceType from trezor.messages.PassphraseRequest import PassphraseRequest from trezor.messages.PassphraseStateRequest import PassphraseStateRequest 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): - 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) return passphrase diff --git a/src/apps/common/storage.py b/src/apps/common/storage.py index cd56a0c689..3d51a6f333 100644 --- a/src/apps/common/storage.py +++ b/src/apps/common/storage.py @@ -8,17 +8,18 @@ HOMESCREEN_MAXSIZE = 16384 _STORAGE_VERSION = b'\x01' -_APP = const(0x01) # app namespace -_DEVICE_ID = const(0x00) # bytes -_VERSION = const(0x01) # int -_MNEMONIC = const(0x02) # str -_LANGUAGE = const(0x03) # str -_LABEL = const(0x04) # str -_USE_PASSPHRASE = const(0x05) # 0x01 or empty -_HOMESCREEN = const(0x06) # bytes -_NEEDS_BACKUP = const(0x07) # 0x01 or empty -_FLAGS = const(0x08) # int -_U2F_COUNTER = const(0x09) # int +_APP = const(0x01) # app namespace +_DEVICE_ID = const(0x00) # bytes +_VERSION = const(0x01) # int +_MNEMONIC = const(0x02) # str +_LANGUAGE = const(0x03) # str +_LABEL = const(0x04) # str +_USE_PASSPHRASE = const(0x05) # 0x01 or empty +_HOMESCREEN = const(0x06) # bytes +_NEEDS_BACKUP = const(0x07) # 0x01 or empty +_FLAGS = const(0x08) # int +_U2F_COUNTER = const(0x09) # int +_PASSPHRASE_SOURCE = const(0x0A) # int def _new_device_id() -> str: @@ -70,7 +71,17 @@ def set_backed_up() -> None: 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: config.set(_APP, _LABEL, label.encode(), True) # public 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 else: 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: diff --git a/src/apps/management/apply_settings.py b/src/apps/management/apply_settings.py index a19e85841b..4bf4616448 100644 --- a/src/apps/management/apply_settings.py +++ b/src/apps/management/apply_settings.py @@ -1,5 +1,5 @@ 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.ui.text import Text from apps.common import storage @@ -7,7 +7,7 @@ from apps.common.confirm import require_confirm 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') if msg.homescreen is not None: @@ -35,8 +35,22 @@ async def apply_settings(ctx, msg): 'encryption?'), 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, use_passphrase=msg.use_passphrase, - homescreen=msg.homescreen) + homescreen=msg.homescreen, + passphrase_source=msg.passphrase_source) return Success(message='Settings applied') diff --git a/src/trezor/messages/ApplySettings.py b/src/trezor/messages/ApplySettings.py index b9c888e3b6..c71136ca89 100644 --- a/src/trezor/messages/ApplySettings.py +++ b/src/trezor/messages/ApplySettings.py @@ -8,6 +8,7 @@ class ApplySettings(p.MessageType): 2: ('label', p.UnicodeType, 0), 3: ('use_passphrase', p.BoolType, 0), 4: ('homescreen', p.BytesType, 0), + 5: ('passphrase_source', p.UVarintType, 0), } MESSAGE_WIRE_TYPE = 25 @@ -17,10 +18,12 @@ class ApplySettings(p.MessageType): label: str = None, use_passphrase: bool = None, homescreen: bytes = None, + passphrase_source: int = None, **kwargs, ): self.language = language self.label = label self.use_passphrase = use_passphrase self.homescreen = homescreen + self.passphrase_source = passphrase_source p.MessageType.__init__(self, **kwargs) diff --git a/src/trezor/messages/EthereumSignTx.py b/src/trezor/messages/EthereumSignTx.py index 452c83b157..c3e1d444c1 100644 --- a/src/trezor/messages/EthereumSignTx.py +++ b/src/trezor/messages/EthereumSignTx.py @@ -13,6 +13,7 @@ class EthereumSignTx(p.MessageType): 7: ('data_initial_chunk', p.BytesType, 0), 8: ('data_length', p.UVarintType, 0), 9: ('chain_id', p.UVarintType, 0), + 10: ('tx_type', p.UVarintType, 0), } MESSAGE_WIRE_TYPE = 58 @@ -27,6 +28,7 @@ class EthereumSignTx(p.MessageType): data_initial_chunk: bytes = None, data_length: int = None, chain_id: int = None, + tx_type: int = None, **kwargs, ): 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_length = data_length self.chain_id = chain_id + self.tx_type = tx_type p.MessageType.__init__(self, **kwargs) diff --git a/src/trezor/messages/PassphraseSourceType.py b/src/trezor/messages/PassphraseSourceType.py new file mode 100644 index 0000000000..7baafe57a7 --- /dev/null +++ b/src/trezor/messages/PassphraseSourceType.py @@ -0,0 +1,6 @@ +# Automatically generated by pb2py +from micropython import const + +ASK = const(0) +DEVICE = const(1) +HOST = const(2) diff --git a/vendor/trezor-common b/vendor/trezor-common index 0924bd6826..998eb4c7a7 160000 --- a/vendor/trezor-common +++ b/vendor/trezor-common @@ -1 +1 @@ -Subproject commit 0924bd6826bb63f66010e2e511356d54ea733df3 +Subproject commit 998eb4c7a76bdb5190f5f9f52bf8c53d795fbb25