mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-06-09 09:38:46 +00:00
refactor(core): convert apps.common to layouts
This commit is contained in:
parent
875cc0cb1a
commit
574dcbc8a3
@ -3,7 +3,6 @@ from trezor.ui.layouts import show_address
|
|||||||
|
|
||||||
from apps.common import paths
|
from apps.common import paths
|
||||||
from apps.common.keychain import Keychain, auto_keychain
|
from apps.common.keychain import Keychain, auto_keychain
|
||||||
from apps.common.layout import address_n_to_str
|
|
||||||
|
|
||||||
from .helpers import address_from_public_key
|
from .helpers import address_from_public_key
|
||||||
|
|
||||||
@ -18,7 +17,7 @@ async def get_address(ctx, msg: BinanceGetAddress, keychain: Keychain):
|
|||||||
pubkey = node.public_key()
|
pubkey = node.public_key()
|
||||||
address = address_from_public_key(pubkey, HRP)
|
address = address_from_public_key(pubkey, HRP)
|
||||||
if msg.show_display:
|
if msg.show_display:
|
||||||
title = address_n_to_str(msg.address_n)
|
title = paths.address_n_to_str(msg.address_n)
|
||||||
await show_address(ctx, address=address, address_qr=address, title=title)
|
await show_address(ctx, address=address, address_qr=address, title=title)
|
||||||
|
|
||||||
return BinanceAddress(address=address)
|
return BinanceAddress(address=address)
|
||||||
|
@ -3,8 +3,7 @@ from trezor.enums import InputScriptType
|
|||||||
from trezor.messages import Address
|
from trezor.messages import Address
|
||||||
from trezor.ui.layouts import show_address
|
from trezor.ui.layouts import show_address
|
||||||
|
|
||||||
from apps.common.layout import address_n_to_str
|
from apps.common.paths import address_n_to_str, validate_path
|
||||||
from apps.common.paths import validate_path
|
|
||||||
|
|
||||||
from . import addresses
|
from . import addresses
|
||||||
from .keychain import validate_path_against_script_type, with_keychain
|
from .keychain import validate_path_against_script_type, with_keychain
|
||||||
|
@ -3,7 +3,6 @@ from trezor.messages import CardanoAddress
|
|||||||
from trezor.ui.layouts import show_address
|
from trezor.ui.layouts import show_address
|
||||||
|
|
||||||
from apps.common import paths
|
from apps.common import paths
|
||||||
from apps.common.layout import address_n_to_str
|
|
||||||
|
|
||||||
from . import seed
|
from . import seed
|
||||||
from .address import derive_human_readable_address, validate_address_parameters
|
from .address import derive_human_readable_address, validate_address_parameters
|
||||||
@ -71,7 +70,7 @@ async def _display_address(
|
|||||||
if not protocol_magics.is_mainnet(protocol_magic):
|
if not protocol_magics.is_mainnet(protocol_magic):
|
||||||
network_name = protocol_magics.to_ui_string(protocol_magic)
|
network_name = protocol_magics.to_ui_string(protocol_magic)
|
||||||
|
|
||||||
address_n = address_n_to_str(address_parameters.address_n)
|
address_n = paths.address_n_to_str(address_parameters.address_n)
|
||||||
await show_address(
|
await show_address(
|
||||||
ctx,
|
ctx,
|
||||||
address=address,
|
address=address,
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
from micropython import const
|
from micropython import const
|
||||||
|
|
||||||
from apps.common import HARDENED
|
from apps.common.paths import HARDENED, PathSchema
|
||||||
from apps.common.paths import PathSchema
|
|
||||||
|
|
||||||
SLIP44_ID = 1815
|
SLIP44_ID = 1815
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ from trezor.ui.layouts import (
|
|||||||
confirm_properties,
|
confirm_properties,
|
||||||
)
|
)
|
||||||
|
|
||||||
from apps.common.layout import address_n_to_str
|
from apps.common.paths import address_n_to_str
|
||||||
|
|
||||||
from . import seed
|
from . import seed
|
||||||
from .address import (
|
from .address import (
|
||||||
|
@ -1,17 +0,0 @@
|
|||||||
from micropython import const
|
|
||||||
|
|
||||||
from trezor import workflow
|
|
||||||
from trezor.enums import ButtonRequestType
|
|
||||||
from trezor.messages import ButtonAck, ButtonRequest
|
|
||||||
|
|
||||||
if False:
|
|
||||||
from trezor import wire
|
|
||||||
|
|
||||||
HARDENED = const(0x8000_0000)
|
|
||||||
|
|
||||||
|
|
||||||
async def button_request(
|
|
||||||
ctx: wire.GenericContext, code: ButtonRequestType = ButtonRequestType.Other
|
|
||||||
) -> None:
|
|
||||||
workflow.close_others()
|
|
||||||
await ctx.call(ButtonRequest(code=code), ButtonAck)
|
|
@ -7,8 +7,7 @@ from trezor.ui.components.tt.confirm import (
|
|||||||
HoldToConfirm,
|
HoldToConfirm,
|
||||||
InfoConfirm,
|
InfoConfirm,
|
||||||
)
|
)
|
||||||
|
from trezor.ui.layouts.common import button_request
|
||||||
from . import button_request
|
|
||||||
|
|
||||||
if __debug__:
|
if __debug__:
|
||||||
from trezor.ui.components.tt.scroll import Paginated
|
from trezor.ui.components.tt.scroll import Paginated
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
from trezor.utils import chunks
|
|
||||||
|
|
||||||
from apps.common import HARDENED
|
|
||||||
|
|
||||||
if False:
|
|
||||||
from typing import Iterable, Iterator
|
|
||||||
|
|
||||||
|
|
||||||
def split_address(address: str) -> Iterator[str]:
|
|
||||||
return chunks(address, 17)
|
|
||||||
|
|
||||||
|
|
||||||
def address_n_to_str(address_n: Iterable[int]) -> str:
|
|
||||||
def path_item(i: int) -> str:
|
|
||||||
if i & HARDENED:
|
|
||||||
return str(i ^ HARDENED) + "'"
|
|
||||||
else:
|
|
||||||
return str(i)
|
|
||||||
|
|
||||||
if not address_n:
|
|
||||||
return "m"
|
|
||||||
|
|
||||||
return "m/" + "/".join([path_item(i) for i in address_n])
|
|
@ -3,7 +3,7 @@ from trezor import ui, utils, workflow
|
|||||||
from trezor.enums import BackupType
|
from trezor.enums import BackupType
|
||||||
|
|
||||||
|
|
||||||
def get() -> tuple[bytes | None, int]:
|
def get() -> tuple[bytes | None, BackupType]:
|
||||||
return get_secret(), get_type()
|
return get_secret(), get_type()
|
||||||
|
|
||||||
|
|
||||||
@ -54,13 +54,12 @@ def get_seed(passphrase: str = "", progress_bar: bool = True) -> bytes:
|
|||||||
|
|
||||||
|
|
||||||
def _start_progress() -> None:
|
def _start_progress() -> None:
|
||||||
from trezor.ui.components.tt.text import Text
|
from trezor.ui.layouts import draw_simple_text
|
||||||
|
|
||||||
# Because we are drawing to the screen manually, without a layout, we
|
# Because we are drawing to the screen manually, without a layout, we
|
||||||
# should make sure that no other layout is running.
|
# should make sure that no other layout is running.
|
||||||
workflow.close_others()
|
workflow.close_others()
|
||||||
t = Text("Please wait", ui.ICON_CONFIG)
|
draw_simple_text("Please wait")
|
||||||
ui.draw_simple(t)
|
|
||||||
|
|
||||||
|
|
||||||
def _render_progress(progress: int, total: int) -> None:
|
def _render_progress(progress: int, total: int) -> None:
|
||||||
|
@ -2,9 +2,6 @@ from micropython import const
|
|||||||
|
|
||||||
import storage.device
|
import storage.device
|
||||||
from trezor import wire, workflow
|
from trezor import wire, workflow
|
||||||
from trezor.enums import ButtonRequestType
|
|
||||||
|
|
||||||
from . import button_request
|
|
||||||
|
|
||||||
_MAX_PASSPHRASE_LEN = const(50)
|
_MAX_PASSPHRASE_LEN = const(50)
|
||||||
|
|
||||||
@ -23,7 +20,9 @@ async def get(ctx: wire.Context) -> str:
|
|||||||
async def _request_from_user(ctx: wire.Context) -> str:
|
async def _request_from_user(ctx: wire.Context) -> str:
|
||||||
workflow.close_others() # request exclusive UI access
|
workflow.close_others() # request exclusive UI access
|
||||||
if storage.device.get_passphrase_always_on_device():
|
if storage.device.get_passphrase_always_on_device():
|
||||||
passphrase = await _request_on_device(ctx)
|
from trezor.ui.layouts import request_passphrase_on_device
|
||||||
|
|
||||||
|
passphrase = await request_passphrase_on_device(ctx, _MAX_PASSPHRASE_LEN)
|
||||||
else:
|
else:
|
||||||
passphrase = await _request_on_host(ctx)
|
passphrase = await _request_on_host(ctx)
|
||||||
if len(passphrase.encode()) > _MAX_PASSPHRASE_LEN:
|
if len(passphrase.encode()) > _MAX_PASSPHRASE_LEN:
|
||||||
@ -36,19 +35,17 @@ async def _request_from_user(ctx: wire.Context) -> str:
|
|||||||
|
|
||||||
async def _request_on_host(ctx: wire.Context) -> str:
|
async def _request_on_host(ctx: wire.Context) -> str:
|
||||||
from trezor.messages import PassphraseAck, PassphraseRequest
|
from trezor.messages import PassphraseAck, PassphraseRequest
|
||||||
from trezor.ui import ICON_CONFIG
|
|
||||||
from trezor.ui.components.tt.text import Text
|
|
||||||
|
|
||||||
from .confirm import require_confirm
|
|
||||||
|
|
||||||
_entry_dialog()
|
_entry_dialog()
|
||||||
|
|
||||||
request = PassphraseRequest()
|
request = PassphraseRequest()
|
||||||
ack = await ctx.call(request, PassphraseAck)
|
ack = await ctx.call(request, PassphraseAck)
|
||||||
if ack.on_device:
|
if ack.on_device:
|
||||||
|
from trezor.ui.layouts import request_passphrase_on_device
|
||||||
|
|
||||||
if ack.passphrase is not None:
|
if ack.passphrase is not None:
|
||||||
raise wire.DataError("Passphrase provided when it should not be")
|
raise wire.DataError("Passphrase provided when it should not be")
|
||||||
return await _request_on_device(ctx)
|
return await request_passphrase_on_device(ctx, _MAX_PASSPHRASE_LEN)
|
||||||
|
|
||||||
if ack.passphrase is None:
|
if ack.passphrase is None:
|
||||||
raise wire.DataError(
|
raise wire.DataError(
|
||||||
@ -57,41 +54,33 @@ async def _request_on_host(ctx: wire.Context) -> str:
|
|||||||
|
|
||||||
# non-empty passphrase
|
# non-empty passphrase
|
||||||
if ack.passphrase:
|
if ack.passphrase:
|
||||||
text = Text("Hidden wallet", ICON_CONFIG)
|
from trezor import ui
|
||||||
text.normal("Access hidden wallet?")
|
from trezor.ui.layouts import confirm_action, confirm_blob
|
||||||
text.br()
|
|
||||||
text.normal("Next screen will show")
|
|
||||||
text.normal("the passphrase!")
|
|
||||||
await require_confirm(ctx, text, ButtonRequestType.Other)
|
|
||||||
|
|
||||||
text = Text("Hidden wallet", ICON_CONFIG, break_words=True)
|
await confirm_action(
|
||||||
text.normal("Use this passphrase?")
|
ctx,
|
||||||
text.br()
|
"passphrase_host1",
|
||||||
text.mono(ack.passphrase)
|
title="Hidden wallet",
|
||||||
await require_confirm(ctx, text, ButtonRequestType.Other)
|
description="Access hidden wallet?\n\nNext screen will show\nthe passphrase!",
|
||||||
|
icon=ui.ICON_CONFIG,
|
||||||
|
)
|
||||||
|
|
||||||
|
await confirm_blob(
|
||||||
|
ctx,
|
||||||
|
"passphrase_host2",
|
||||||
|
title="Hidden wallet",
|
||||||
|
description="Use this passphrase?\n",
|
||||||
|
data=ack.passphrase,
|
||||||
|
icon=ui.ICON_CONFIG,
|
||||||
|
icon_color=ui.ORANGE_ICON,
|
||||||
|
)
|
||||||
|
|
||||||
return ack.passphrase
|
return ack.passphrase
|
||||||
|
|
||||||
|
|
||||||
async def _request_on_device(ctx: wire.Context) -> str:
|
|
||||||
from trezor.ui.components.tt.passphrase import CANCELLED, PassphraseKeyboard
|
|
||||||
|
|
||||||
await button_request(ctx, code=ButtonRequestType.PassphraseEntry)
|
|
||||||
|
|
||||||
keyboard = PassphraseKeyboard("Enter passphrase", _MAX_PASSPHRASE_LEN)
|
|
||||||
passphrase = await ctx.wait(keyboard)
|
|
||||||
if passphrase is CANCELLED:
|
|
||||||
raise wire.ActionCancelled("Passphrase entry cancelled")
|
|
||||||
|
|
||||||
assert isinstance(passphrase, str)
|
|
||||||
|
|
||||||
return passphrase
|
|
||||||
|
|
||||||
|
|
||||||
def _entry_dialog() -> None:
|
def _entry_dialog() -> None:
|
||||||
from trezor.ui import ICON_CONFIG, draw_simple
|
from trezor.ui.layouts import draw_simple_text
|
||||||
from trezor.ui.components.tt.text import Text
|
|
||||||
|
|
||||||
text = Text("Passphrase entry", ICON_CONFIG)
|
draw_simple_text(
|
||||||
text.normal("Please type your", "passphrase on the", "connected host.")
|
"Passphrase entry", "Please type your\npassphrase on the\nconnected host."
|
||||||
draw_simple(text)
|
)
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
from . import HARDENED
|
from micropython import const
|
||||||
|
|
||||||
|
HARDENED = const(0x8000_0000)
|
||||||
|
|
||||||
if False:
|
if False:
|
||||||
from typing import (
|
from typing import (
|
||||||
@ -325,7 +327,6 @@ async def validate_path(
|
|||||||
|
|
||||||
async def show_path_warning(ctx: wire.Context, path: Bip32Path) -> None:
|
async def show_path_warning(ctx: wire.Context, path: Bip32Path) -> None:
|
||||||
from trezor.ui.layouts import confirm_path_warning
|
from trezor.ui.layouts import confirm_path_warning
|
||||||
from .layout import address_n_to_str
|
|
||||||
|
|
||||||
await confirm_path_warning(ctx, address_n_to_str(path))
|
await confirm_path_warning(ctx, address_n_to_str(path))
|
||||||
|
|
||||||
@ -336,3 +337,16 @@ def is_hardened(i: int) -> bool:
|
|||||||
|
|
||||||
def path_is_hardened(address_n: Bip32Path) -> bool:
|
def path_is_hardened(address_n: Bip32Path) -> bool:
|
||||||
return all(is_hardened(n) for n in address_n)
|
return all(is_hardened(n) for n in address_n)
|
||||||
|
|
||||||
|
|
||||||
|
def address_n_to_str(address_n: Iterable[int]) -> str:
|
||||||
|
def path_item(i: int) -> str:
|
||||||
|
if i & HARDENED:
|
||||||
|
return str(i ^ HARDENED) + "'"
|
||||||
|
else:
|
||||||
|
return str(i)
|
||||||
|
|
||||||
|
if not address_n:
|
||||||
|
return "m"
|
||||||
|
|
||||||
|
return "m/" + "/".join(path_item(i) for i in address_n)
|
||||||
|
@ -2,11 +2,8 @@ import utime
|
|||||||
|
|
||||||
import storage.cache
|
import storage.cache
|
||||||
import storage.sd_salt
|
import storage.sd_salt
|
||||||
from trezor import config, ui, wire
|
from trezor import config, wire
|
||||||
from trezor.enums import ButtonRequestType
|
|
||||||
from trezor.ui.popup import Popup
|
|
||||||
|
|
||||||
from . import button_request
|
|
||||||
from .sdcard import SdCardUnavailable, request_sd_salt
|
from .sdcard import SdCardUnavailable, request_sd_salt
|
||||||
|
|
||||||
if False:
|
if False:
|
||||||
@ -24,25 +21,9 @@ async def request_pin(
|
|||||||
attempts_remaining: int | None = None,
|
attempts_remaining: int | None = None,
|
||||||
allow_cancel: bool = True,
|
allow_cancel: bool = True,
|
||||||
) -> str:
|
) -> str:
|
||||||
from trezor.ui.components.tt.pin import CANCELLED, PinDialog
|
from trezor.ui.layouts import request_pin_on_device
|
||||||
|
|
||||||
await button_request(ctx, code=ButtonRequestType.PinEntry)
|
return await request_pin_on_device(ctx, prompt, attempts_remaining, allow_cancel)
|
||||||
|
|
||||||
if attempts_remaining is None:
|
|
||||||
subprompt = None
|
|
||||||
elif attempts_remaining == 1:
|
|
||||||
subprompt = "This is your last attempt"
|
|
||||||
else:
|
|
||||||
subprompt = "%s attempts remaining" % attempts_remaining
|
|
||||||
|
|
||||||
dialog = PinDialog(prompt, subprompt, allow_cancel)
|
|
||||||
|
|
||||||
while True:
|
|
||||||
pin = await ctx.wait(dialog)
|
|
||||||
if pin is CANCELLED:
|
|
||||||
raise wire.PinCancelled
|
|
||||||
assert isinstance(pin, str)
|
|
||||||
return pin
|
|
||||||
|
|
||||||
|
|
||||||
async def request_pin_confirm(ctx: wire.Context, *args: Any, **kwargs: Any) -> str:
|
async def request_pin_confirm(ctx: wire.Context, *args: Any, **kwargs: Any) -> str:
|
||||||
@ -55,14 +36,12 @@ async def request_pin_confirm(ctx: wire.Context, *args: Any, **kwargs: Any) -> s
|
|||||||
|
|
||||||
|
|
||||||
async def pin_mismatch() -> None:
|
async def pin_mismatch() -> None:
|
||||||
from trezor.ui.components.tt.text import Text
|
from trezor.ui.layouts import show_popup
|
||||||
|
|
||||||
text = Text("PIN mismatch", ui.ICON_WRONG, ui.RED)
|
await show_popup(
|
||||||
text.normal("The PINs you entered", "do not match.")
|
title="PIN mismatch",
|
||||||
text.normal("")
|
description="The PINs you entered\ndo not match.\n\nPlease try again.",
|
||||||
text.normal("Please try again.")
|
)
|
||||||
popup = Popup(text, 3000) # show for 3 seconds
|
|
||||||
await popup
|
|
||||||
|
|
||||||
|
|
||||||
async def request_pin_and_sd_salt(
|
async def request_pin_and_sd_salt(
|
||||||
@ -109,7 +88,11 @@ async def verify_user_pin(
|
|||||||
return
|
return
|
||||||
|
|
||||||
if config.has_pin():
|
if config.has_pin():
|
||||||
pin = await request_pin(ctx, prompt, config.get_pin_rem(), allow_cancel)
|
from trezor.ui.layouts import request_pin_on_device
|
||||||
|
|
||||||
|
pin = await request_pin_on_device(
|
||||||
|
ctx, prompt, config.get_pin_rem(), allow_cancel
|
||||||
|
)
|
||||||
config.ensure_not_wipe_code(pin)
|
config.ensure_not_wipe_code(pin)
|
||||||
else:
|
else:
|
||||||
pin = ""
|
pin = ""
|
||||||
@ -125,7 +108,7 @@ async def verify_user_pin(
|
|||||||
raise RuntimeError
|
raise RuntimeError
|
||||||
|
|
||||||
while retry:
|
while retry:
|
||||||
pin = await request_pin(
|
pin = await request_pin_on_device(
|
||||||
ctx, "Wrong PIN, enter again", config.get_pin_rem(), allow_cancel
|
ctx, "Wrong PIN, enter again", config.get_pin_rem(), allow_cancel
|
||||||
)
|
)
|
||||||
if config.unlock(pin, salt):
|
if config.unlock(pin, salt):
|
||||||
|
@ -4,7 +4,6 @@ from trezor.messages import EthereumAddress
|
|||||||
from trezor.ui.layouts import show_address
|
from trezor.ui.layouts import show_address
|
||||||
|
|
||||||
from apps.common import paths
|
from apps.common import paths
|
||||||
from apps.common.layout import address_n_to_str
|
|
||||||
|
|
||||||
from . import networks
|
from . import networks
|
||||||
from .address import address_from_bytes
|
from .address import address_from_bytes
|
||||||
@ -27,7 +26,7 @@ async def get_address(ctx, msg, keychain):
|
|||||||
address = address_from_bytes(address_bytes, network)
|
address = address_from_bytes(address_bytes, network)
|
||||||
|
|
||||||
if msg.show_display:
|
if msg.show_display:
|
||||||
title = address_n_to_str(msg.address_n)
|
title = paths.address_n_to_str(msg.address_n)
|
||||||
await show_address(ctx, address=address, address_qr=address, title=title)
|
await show_address(ctx, address=address, address_qr=address, title=title)
|
||||||
|
|
||||||
return EthereumAddress(address=address)
|
return EthereumAddress(address=address)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from trezor import wire
|
from trezor import wire
|
||||||
|
|
||||||
from apps.common import HARDENED, paths
|
from apps.common import paths
|
||||||
from apps.common.keychain import get_keychain
|
from apps.common.keychain import get_keychain
|
||||||
|
|
||||||
from . import CURVE, networks
|
from . import CURVE, networks
|
||||||
@ -37,10 +37,10 @@ def _schemas_from_address_n(
|
|||||||
if slip44_hardened not in networks.all_slip44_ids_hardened():
|
if slip44_hardened not in networks.all_slip44_ids_hardened():
|
||||||
return ()
|
return ()
|
||||||
|
|
||||||
if not slip44_hardened & HARDENED:
|
if not slip44_hardened & paths.HARDENED:
|
||||||
return ()
|
return ()
|
||||||
|
|
||||||
slip44_id = slip44_hardened - HARDENED
|
slip44_id = slip44_hardened - paths.HARDENED
|
||||||
schemas = [paths.PathSchema.parse(pattern, slip44_id) for pattern in patterns]
|
schemas = [paths.PathSchema.parse(pattern, slip44_id) for pattern in patterns]
|
||||||
return [s.copy() for s in schemas]
|
return [s.copy() for s in schemas]
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
from micropython import const
|
from micropython import const
|
||||||
|
|
||||||
from apps.common import HARDENED
|
from apps.common.paths import HARDENED
|
||||||
|
|
||||||
SLIP44_WANCHAIN = const(5718350)
|
SLIP44_WANCHAIN = const(5718350)
|
||||||
SLIP44_ETHEREUM = const(60)
|
SLIP44_ETHEREUM = const(60)
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
from micropython import const
|
from micropython import const
|
||||||
|
|
||||||
from apps.common import HARDENED
|
from apps.common.paths import HARDENED
|
||||||
|
|
||||||
SLIP44_WANCHAIN = const(5718350)
|
SLIP44_WANCHAIN = const(5718350)
|
||||||
SLIP44_ETHEREUM = const(60)
|
SLIP44_ETHEREUM = const(60)
|
||||||
|
@ -3,7 +3,6 @@ from trezor.ui.layouts import show_address
|
|||||||
|
|
||||||
from apps.common import paths
|
from apps.common import paths
|
||||||
from apps.common.keychain import auto_keychain
|
from apps.common.keychain import auto_keychain
|
||||||
from apps.common.layout import address_n_to_str
|
|
||||||
|
|
||||||
from .helpers import get_address_from_public_key
|
from .helpers import get_address_from_public_key
|
||||||
|
|
||||||
@ -18,7 +17,7 @@ async def get_address(ctx, msg, keychain):
|
|||||||
address = get_address_from_public_key(pubkey)
|
address = get_address_from_public_key(pubkey)
|
||||||
|
|
||||||
if msg.show_display:
|
if msg.show_display:
|
||||||
title = address_n_to_str(msg.address_n)
|
title = paths.address_n_to_str(msg.address_n)
|
||||||
await show_address(ctx, address=address, address_qr=address, title=title)
|
await show_address(ctx, address=address, address_qr=address, title=title)
|
||||||
|
|
||||||
return LiskAddress(address=address)
|
return LiskAddress(address=address)
|
||||||
|
@ -6,8 +6,8 @@ from trezor.ui.components.tt.scroll import Paginated
|
|||||||
from trezor.ui.components.tt.text import Text
|
from trezor.ui.components.tt.text import Text
|
||||||
from trezor.ui.components.tt.word_select import WordSelector
|
from trezor.ui.components.tt.word_select import WordSelector
|
||||||
from trezor.ui.layouts import confirm_action, show_success, show_warning
|
from trezor.ui.layouts import confirm_action, show_success, show_warning
|
||||||
|
from trezor.ui.layouts.common import button_request
|
||||||
|
|
||||||
from apps.common import button_request
|
|
||||||
from apps.common.confirm import confirm, info_confirm, require_confirm
|
from apps.common.confirm import confirm, info_confirm, require_confirm
|
||||||
|
|
||||||
from .. import backup_types
|
from .. import backup_types
|
||||||
|
@ -5,9 +5,8 @@ from trezor.crypto.hashlib import sha256
|
|||||||
from trezor.messages import ECDHSessionKey
|
from trezor.messages import ECDHSessionKey
|
||||||
from trezor.ui.layouts import confirm_address
|
from trezor.ui.layouts import confirm_address
|
||||||
|
|
||||||
from apps.common import HARDENED
|
|
||||||
from apps.common.keychain import get_keychain
|
from apps.common.keychain import get_keychain
|
||||||
from apps.common.paths import AlwaysMatchingSchema
|
from apps.common.paths import HARDENED, AlwaysMatchingSchema
|
||||||
|
|
||||||
from .sign_identity import serialize_identity, serialize_identity_without_proto
|
from .sign_identity import serialize_identity, serialize_identity_without_proto
|
||||||
|
|
||||||
|
@ -5,9 +5,9 @@ from trezor.crypto.hashlib import sha256
|
|||||||
from trezor.messages import SignedIdentity
|
from trezor.messages import SignedIdentity
|
||||||
from trezor.ui.layouts import confirm_sign_identity
|
from trezor.ui.layouts import confirm_sign_identity
|
||||||
|
|
||||||
from apps.common import HARDENED, coininfo
|
from apps.common import coininfo
|
||||||
from apps.common.keychain import get_keychain
|
from apps.common.keychain import get_keychain
|
||||||
from apps.common.paths import AlwaysMatchingSchema
|
from apps.common.paths import HARDENED, AlwaysMatchingSchema
|
||||||
|
|
||||||
if False:
|
if False:
|
||||||
from trezor.messages import IdentityType, SignIdentity
|
from trezor.messages import IdentityType, SignIdentity
|
||||||
|
@ -3,7 +3,6 @@ from trezor.ui.layouts import show_address
|
|||||||
|
|
||||||
from apps.common import paths
|
from apps.common import paths
|
||||||
from apps.common.keychain import auto_keychain
|
from apps.common.keychain import auto_keychain
|
||||||
from apps.common.layout import address_n_to_str
|
|
||||||
from apps.monero import misc
|
from apps.monero import misc
|
||||||
from apps.monero.xmr import addresses, crypto, monero
|
from apps.monero.xmr import addresses, crypto, monero
|
||||||
from apps.monero.xmr.networks import net_version
|
from apps.monero.xmr.networks import net_version
|
||||||
@ -41,7 +40,7 @@ async def get_address(ctx, msg, keychain):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if msg.show_display:
|
if msg.show_display:
|
||||||
title = address_n_to_str(msg.address_n)
|
title = paths.address_n_to_str(msg.address_n)
|
||||||
await show_address(
|
await show_address(
|
||||||
ctx,
|
ctx,
|
||||||
address=addr.decode(),
|
address=addr.decode(),
|
||||||
|
@ -2,8 +2,7 @@ from trezor.messages import NEMAddress
|
|||||||
from trezor.ui.layouts import show_address
|
from trezor.ui.layouts import show_address
|
||||||
|
|
||||||
from apps.common.keychain import with_slip44_keychain
|
from apps.common.keychain import with_slip44_keychain
|
||||||
from apps.common.layout import address_n_to_str
|
from apps.common.paths import address_n_to_str, validate_path
|
||||||
from apps.common.paths import validate_path
|
|
||||||
|
|
||||||
from . import CURVE, PATTERNS, SLIP44_ID
|
from . import CURVE, PATTERNS, SLIP44_ID
|
||||||
from .helpers import check_path, get_network_str
|
from .helpers import check_path, get_network_str
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from micropython import const
|
from micropython import const
|
||||||
|
|
||||||
from apps.common import HARDENED, paths
|
from apps.common import paths
|
||||||
|
|
||||||
from . import SLIP44_ID
|
from . import SLIP44_ID
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ def check_path(path: paths.Bip32Path, network: int) -> bool:
|
|||||||
if len(path) < 2:
|
if len(path) < 2:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
coin_type = path[1] - HARDENED
|
coin_type = path[1] - paths.HARDENED
|
||||||
|
|
||||||
if network == NEM_NETWORK_TESTNET:
|
if network == NEM_NETWORK_TESTNET:
|
||||||
return coin_type == 1
|
return coin_type == 1
|
||||||
|
@ -3,7 +3,6 @@ from trezor.ui.layouts import show_address
|
|||||||
|
|
||||||
from apps.common import paths
|
from apps.common import paths
|
||||||
from apps.common.keychain import auto_keychain
|
from apps.common.keychain import auto_keychain
|
||||||
from apps.common.layout import address_n_to_str
|
|
||||||
|
|
||||||
from .helpers import address_from_public_key
|
from .helpers import address_from_public_key
|
||||||
|
|
||||||
@ -17,7 +16,7 @@ async def get_address(ctx, msg: RippleGetAddress, keychain):
|
|||||||
address = address_from_public_key(pubkey)
|
address = address_from_public_key(pubkey)
|
||||||
|
|
||||||
if msg.show_display:
|
if msg.show_display:
|
||||||
title = address_n_to_str(msg.address_n)
|
title = paths.address_n_to_str(msg.address_n)
|
||||||
await show_address(ctx, address=address, address_qr=address, title=title)
|
await show_address(ctx, address=address, address_qr=address, title=title)
|
||||||
|
|
||||||
return RippleAddress(address=address)
|
return RippleAddress(address=address)
|
||||||
|
@ -3,7 +3,6 @@ from trezor.ui.layouts import show_address
|
|||||||
|
|
||||||
from apps.common import paths, seed
|
from apps.common import paths, seed
|
||||||
from apps.common.keychain import auto_keychain
|
from apps.common.keychain import auto_keychain
|
||||||
from apps.common.layout import address_n_to_str
|
|
||||||
|
|
||||||
from . import helpers
|
from . import helpers
|
||||||
|
|
||||||
@ -17,7 +16,7 @@ async def get_address(ctx, msg: StellarGetAddress, keychain):
|
|||||||
address = helpers.address_from_public_key(pubkey)
|
address = helpers.address_from_public_key(pubkey)
|
||||||
|
|
||||||
if msg.show_display:
|
if msg.show_display:
|
||||||
title = address_n_to_str(msg.address_n)
|
title = paths.address_n_to_str(msg.address_n)
|
||||||
await show_address(
|
await show_address(
|
||||||
ctx, address=address, address_qr=address.upper(), title=title
|
ctx, address=address, address_qr=address.upper(), title=title
|
||||||
)
|
)
|
||||||
|
@ -4,7 +4,6 @@ from trezor.ui.layouts import show_address
|
|||||||
|
|
||||||
from apps.common import paths, seed
|
from apps.common import paths, seed
|
||||||
from apps.common.keychain import with_slip44_keychain
|
from apps.common.keychain import with_slip44_keychain
|
||||||
from apps.common.layout import address_n_to_str
|
|
||||||
|
|
||||||
from . import CURVE, PATTERNS, SLIP44_ID, helpers
|
from . import CURVE, PATTERNS, SLIP44_ID, helpers
|
||||||
|
|
||||||
@ -22,7 +21,7 @@ async def get_address(ctx, msg, keychain):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if msg.show_display:
|
if msg.show_display:
|
||||||
title = address_n_to_str(msg.address_n)
|
title = paths.address_n_to_str(msg.address_n)
|
||||||
await show_address(ctx, address=address, address_qr=address, title=title)
|
await show_address(ctx, address=address, address_qr=address, title=title)
|
||||||
|
|
||||||
return TezosAddress(address=address)
|
return TezosAddress(address=address)
|
||||||
|
@ -7,7 +7,8 @@ from trezor import log, utils
|
|||||||
from trezor.crypto import bip32, chacha20poly1305, der, hashlib, hmac, random
|
from trezor.crypto import bip32, chacha20poly1305, der, hashlib, hmac, random
|
||||||
from trezor.crypto.curve import ed25519, nist256p1
|
from trezor.crypto.curve import ed25519, nist256p1
|
||||||
|
|
||||||
from apps.common import HARDENED, cbor, seed
|
from apps.common import cbor, seed
|
||||||
|
from apps.common.paths import HARDENED
|
||||||
|
|
||||||
from . import common
|
from . import common
|
||||||
|
|
||||||
|
@ -14,17 +14,25 @@ if __debug__:
|
|||||||
from ..components.tt.scroll import Paginated
|
from ..components.tt.scroll import Paginated
|
||||||
|
|
||||||
|
|
||||||
|
async def button_request(
|
||||||
|
ctx: wire.GenericContext,
|
||||||
|
br_type: str,
|
||||||
|
code: ButtonRequestType = ButtonRequestType.Other,
|
||||||
|
) -> None:
|
||||||
|
log.debug(__name__, "ButtonRequest.type={}".format(br_type))
|
||||||
|
workflow.close_others()
|
||||||
|
await ctx.call(ButtonRequest(code=code), ButtonAck)
|
||||||
|
|
||||||
|
|
||||||
async def interact(
|
async def interact(
|
||||||
ctx: wire.GenericContext,
|
ctx: wire.GenericContext,
|
||||||
layout: LayoutType,
|
layout: LayoutType,
|
||||||
brtype: str,
|
br_type: str,
|
||||||
brcode: ButtonRequestType = ButtonRequestType.Other,
|
br_code: ButtonRequestType = ButtonRequestType.Other,
|
||||||
) -> Any:
|
) -> Any:
|
||||||
log.debug(__name__, "ButtonRequest.type={}".format(brtype))
|
|
||||||
if layout.__class__.__name__ == "Paginated":
|
if layout.__class__.__name__ == "Paginated":
|
||||||
assert isinstance(layout, Paginated)
|
assert isinstance(layout, Paginated)
|
||||||
return await layout.interact(ctx, code=brcode)
|
return await layout.interact(ctx, code=br_code)
|
||||||
else:
|
else:
|
||||||
workflow.close_others()
|
await button_request(ctx, br_type, br_code)
|
||||||
await ctx.call(ButtonRequest(code=brcode), ButtonAck)
|
|
||||||
return await ctx.wait(layout)
|
return await ctx.wait(layout)
|
||||||
|
@ -12,6 +12,7 @@ from trezor.utils import chunks, chunks_intersperse
|
|||||||
from ..components.common import break_path_to_lines
|
from ..components.common import break_path_to_lines
|
||||||
from ..components.common.confirm import is_confirmed, raise_if_cancelled
|
from ..components.common.confirm import is_confirmed, raise_if_cancelled
|
||||||
from ..components.common.webauthn import ConfirmInfo
|
from ..components.common.webauthn import ConfirmInfo
|
||||||
|
from ..components.tt import passphrase, pin
|
||||||
from ..components.tt.button import ButtonCancel, ButtonDefault
|
from ..components.tt.button import ButtonCancel, ButtonDefault
|
||||||
from ..components.tt.confirm import Confirm, ConfirmPageable, HoldToConfirm, Pageable
|
from ..components.tt.confirm import Confirm, ConfirmPageable, HoldToConfirm, Pageable
|
||||||
from ..components.tt.scroll import (
|
from ..components.tt.scroll import (
|
||||||
@ -30,7 +31,7 @@ from ..constants.tt import (
|
|||||||
QR_Y,
|
QR_Y,
|
||||||
TEXT_MAX_LINES,
|
TEXT_MAX_LINES,
|
||||||
)
|
)
|
||||||
from .common import interact
|
from .common import button_request, interact
|
||||||
|
|
||||||
if False:
|
if False:
|
||||||
from typing import (
|
from typing import (
|
||||||
@ -78,6 +79,9 @@ __all__ = (
|
|||||||
"show_popup",
|
"show_popup",
|
||||||
"confirm_webauthn",
|
"confirm_webauthn",
|
||||||
"confirm_webauthn_reset",
|
"confirm_webauthn_reset",
|
||||||
|
"draw_simple_text",
|
||||||
|
"request_passphrase_on_device",
|
||||||
|
"request_pin_on_device",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -1055,3 +1059,47 @@ async def confirm_webauthn_reset() -> bool:
|
|||||||
text.normal("Do you really want to")
|
text.normal("Do you really want to")
|
||||||
text.bold("erase all credentials?")
|
text.bold("erase all credentials?")
|
||||||
return is_confirmed(await Confirm(text))
|
return is_confirmed(await Confirm(text))
|
||||||
|
|
||||||
|
|
||||||
|
def draw_simple_text(title: str, description: str = "") -> None:
|
||||||
|
text = Text(title, ui.ICON_CONFIG, new_lines=False)
|
||||||
|
text.normal(description)
|
||||||
|
ui.draw_simple(text)
|
||||||
|
|
||||||
|
|
||||||
|
async def request_passphrase_on_device(ctx: wire.GenericContext, max_len: int) -> str:
|
||||||
|
await button_request(
|
||||||
|
ctx, "passphrase_device", code=ButtonRequestType.PassphraseEntry
|
||||||
|
)
|
||||||
|
|
||||||
|
keyboard = passphrase.PassphraseKeyboard("Enter passphrase", max_len)
|
||||||
|
result = await ctx.wait(keyboard)
|
||||||
|
if result is passphrase.CANCELLED:
|
||||||
|
raise wire.ActionCancelled("Passphrase entry cancelled")
|
||||||
|
|
||||||
|
assert isinstance(result, str)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
async def request_pin_on_device(
|
||||||
|
ctx: wire.GenericContext,
|
||||||
|
prompt: str,
|
||||||
|
attempts_remaining: int,
|
||||||
|
allow_cancel: bool,
|
||||||
|
) -> str:
|
||||||
|
await button_request(ctx, "pin_device", code=ButtonRequestType.PinEntry)
|
||||||
|
|
||||||
|
if attempts_remaining is None:
|
||||||
|
subprompt = None
|
||||||
|
elif attempts_remaining == 1:
|
||||||
|
subprompt = "This is your last attempt"
|
||||||
|
else:
|
||||||
|
subprompt = "%s attempts remaining" % attempts_remaining
|
||||||
|
|
||||||
|
dialog = pin.PinDialog(prompt, subprompt, allow_cancel)
|
||||||
|
while True:
|
||||||
|
result = await ctx.wait(dialog)
|
||||||
|
if result is pin.CANCELLED:
|
||||||
|
raise wire.PinCancelled
|
||||||
|
assert isinstance(result, str)
|
||||||
|
return result
|
||||||
|
@ -7,7 +7,7 @@ from ubinascii import hexlify, unhexlify # noqa: F401
|
|||||||
import unittest # noqa: F401
|
import unittest # noqa: F401
|
||||||
|
|
||||||
from trezor import utils # noqa: F401
|
from trezor import utils # noqa: F401
|
||||||
from apps.common import HARDENED
|
from apps.common.paths import HARDENED
|
||||||
|
|
||||||
|
|
||||||
def H_(x: int) -> int:
|
def H_(x: int) -> int:
|
||||||
|
@ -5,7 +5,8 @@ from trezor.enums import CardanoAddressType
|
|||||||
from trezor.messages import CardanoAddressParametersType
|
from trezor.messages import CardanoAddressParametersType
|
||||||
from trezor.messages import CardanoBlockchainPointerType
|
from trezor.messages import CardanoBlockchainPointerType
|
||||||
|
|
||||||
from apps.common import HARDENED, seed
|
from apps.common import seed
|
||||||
|
from apps.common.paths import HARDENED
|
||||||
|
|
||||||
if not utils.BITCOIN_ONLY:
|
if not utils.BITCOIN_ONLY:
|
||||||
from apps.cardano.address import derive_human_readable_address, validate_address_parameters
|
from apps.cardano.address import derive_human_readable_address, validate_address_parameters
|
||||||
|
@ -2,7 +2,8 @@ from common import *
|
|||||||
from trezor import wire
|
from trezor import wire
|
||||||
from trezor.crypto import bip32, slip39
|
from trezor.crypto import bip32, slip39
|
||||||
|
|
||||||
from apps.common import HARDENED, seed
|
from apps.common import seed
|
||||||
|
from apps.common.paths import HARDENED
|
||||||
|
|
||||||
if not utils.BITCOIN_ONLY:
|
if not utils.BITCOIN_ONLY:
|
||||||
from apps.cardano.seed import Keychain
|
from apps.cardano.seed import Keychain
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from common import *
|
from common import *
|
||||||
from apps.common import HARDENED
|
from apps.common.paths import HARDENED
|
||||||
from trezor.messages import CardanoTxInputType
|
from trezor.messages import CardanoTxInputType
|
||||||
|
|
||||||
if not utils.BITCOIN_ONLY:
|
if not utils.BITCOIN_ONLY:
|
||||||
|
@ -2,7 +2,7 @@ from ubinascii import unhexlify
|
|||||||
|
|
||||||
from common import *
|
from common import *
|
||||||
|
|
||||||
from apps.common import HARDENED
|
from apps.common.paths import HARDENED
|
||||||
from trezor.crypto import bip32
|
from trezor.crypto import bip32
|
||||||
from trezor.enums import CardanoAddressType
|
from trezor.enums import CardanoAddressType
|
||||||
from trezor.messages import CardanoAddressParametersType
|
from trezor.messages import CardanoAddressParametersType
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
from common import *
|
from common import *
|
||||||
from trezor.utils import ensure
|
from trezor.utils import ensure
|
||||||
from apps.common.layout import address_n_to_str
|
|
||||||
from apps.common.paths import *
|
from apps.common.paths import *
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from common import *
|
from common import *
|
||||||
from apps.common import HARDENED
|
from apps.common.paths import HARDENED
|
||||||
|
|
||||||
if not utils.BITCOIN_ONLY:
|
if not utils.BITCOIN_ONLY:
|
||||||
from trezor.crypto import nem
|
from trezor.crypto import nem
|
||||||
|
@ -347,7 +347,7 @@
|
|||||||
"test_msg_loaddevice.py-test_load_device_2": "dc13c8486d8a59c5062e19139d8b3cea4ece1a3bc93592be7dc226f83ba54477",
|
"test_msg_loaddevice.py-test_load_device_2": "dc13c8486d8a59c5062e19139d8b3cea4ece1a3bc93592be7dc226f83ba54477",
|
||||||
"test_msg_loaddevice.py-test_load_device_slip39_advanced": "1c6db0d592b1d22b3c9fce3ddab8a9fd138f11d83e5d4e64431a02bf4ffed605",
|
"test_msg_loaddevice.py-test_load_device_slip39_advanced": "1c6db0d592b1d22b3c9fce3ddab8a9fd138f11d83e5d4e64431a02bf4ffed605",
|
||||||
"test_msg_loaddevice.py-test_load_device_slip39_basic": "1c6db0d592b1d22b3c9fce3ddab8a9fd138f11d83e5d4e64431a02bf4ffed605",
|
"test_msg_loaddevice.py-test_load_device_slip39_basic": "1c6db0d592b1d22b3c9fce3ddab8a9fd138f11d83e5d4e64431a02bf4ffed605",
|
||||||
"test_msg_loaddevice.py-test_load_device_utf": "ad7c162c76a13a161166aba78c461ad5525a9a5da846e8d99854248d521e6979",
|
"test_msg_loaddevice.py-test_load_device_utf": "b51beeb07c60e8c803b5bf81e4470db785dc46006374b15df21a7810d659b2b6",
|
||||||
"test_msg_monero_getaddress.py-test_monero_getaddress": "0ba9bba02378d62c8f9f76aac5181ab94b25dcbed0f58d006c1f7d4eb1ecd03e",
|
"test_msg_monero_getaddress.py-test_monero_getaddress": "0ba9bba02378d62c8f9f76aac5181ab94b25dcbed0f58d006c1f7d4eb1ecd03e",
|
||||||
"test_msg_monero_getwatchkey.py-test_monero_getwatchkey": "d77fa4d4322e145c41f1ce07526ff59f8b58d8854aeffaa5266e14cd572350e7",
|
"test_msg_monero_getwatchkey.py-test_monero_getwatchkey": "d77fa4d4322e145c41f1ce07526ff59f8b58d8854aeffaa5266e14cd572350e7",
|
||||||
"test_msg_nem_getaddress.py-test_nem_getaddress": "d3ac0e389d139c79abeff96cd05b9c9f94c3372086096d5eb85759ab3a37b0b8",
|
"test_msg_nem_getaddress.py-test_nem_getaddress": "d3ac0e389d139c79abeff96cd05b9c9f94c3372086096d5eb85759ab3a37b0b8",
|
||||||
@ -714,7 +714,7 @@
|
|||||||
"test_session_id_and_passphrase.py::test_multiple_sessions": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586",
|
"test_session_id_and_passphrase.py::test_multiple_sessions": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586",
|
||||||
"test_session_id_and_passphrase.py::test_passphrase_ack_mismatch": "612dad8ab8762162a186ec9279d7de0bdfc589c52b4e4f4eba0545a00f21c3f0",
|
"test_session_id_and_passphrase.py::test_passphrase_ack_mismatch": "612dad8ab8762162a186ec9279d7de0bdfc589c52b4e4f4eba0545a00f21c3f0",
|
||||||
"test_session_id_and_passphrase.py::test_passphrase_always_on_device": "524d90c68c6f091c2145f571a884a8a168e8af101513966f5e0fbb3859035129",
|
"test_session_id_and_passphrase.py::test_passphrase_always_on_device": "524d90c68c6f091c2145f571a884a8a168e8af101513966f5e0fbb3859035129",
|
||||||
"test_session_id_and_passphrase.py::test_passphrase_length": "a8858d89288f2160148860fee8938d261c4960732db3b2c874b9899395b9ddc6",
|
"test_session_id_and_passphrase.py::test_passphrase_length": "6c9063e65e113d7c67624392b1bedae600ae02d4576375a11b399b3c3dd15987",
|
||||||
"test_session_id_and_passphrase.py::test_passphrase_missing": "3a92115b6bfb2d53f2445a67c9c5df6b6b5ff97769de98e3fac9e1bf424c5669",
|
"test_session_id_and_passphrase.py::test_passphrase_missing": "3a92115b6bfb2d53f2445a67c9c5df6b6b5ff97769de98e3fac9e1bf424c5669",
|
||||||
"test_session_id_and_passphrase.py::test_passphrase_on_device": "c9ca2c9cf6dd416dad4de311266690ec2266b551d74f9d3619301305b3dbe81e",
|
"test_session_id_and_passphrase.py::test_passphrase_on_device": "c9ca2c9cf6dd416dad4de311266690ec2266b551d74f9d3619301305b3dbe81e",
|
||||||
"test_session_id_and_passphrase.py::test_session_enable_passphrase": "b27321ed372b8ade7c4941a80f1f945851046b039a1b43c43a6953106bd1619e",
|
"test_session_id_and_passphrase.py::test_session_enable_passphrase": "b27321ed372b8ade7c4941a80f1f945851046b039a1b43c43a6953106bd1619e",
|
||||||
|
Loading…
Reference in New Issue
Block a user