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:
parent
6cf9bb1d93
commit
e6bfd192e5
@ -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
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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')
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
6
src/trezor/messages/PassphraseSourceType.py
Normal file
6
src/trezor/messages/PassphraseSourceType.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Automatically generated by pb2py
|
||||||
|
from micropython import const
|
||||||
|
|
||||||
|
ASK = const(0)
|
||||||
|
DEVICE = const(1)
|
||||||
|
HOST = const(2)
|
2
vendor/trezor-common
vendored
2
vendor/trezor-common
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 0924bd6826bb63f66010e2e511356d54ea733df3
|
Subproject commit 998eb4c7a76bdb5190f5f9f52bf8c53d795fbb25
|
Loading…
Reference in New Issue
Block a user