Skip to content

Commit 0fa9ce4

Browse files
committed
feat(core): reimplement THP event loop restarts
[no changelog]
1 parent d5bcc55 commit 0fa9ce4

File tree

12 files changed

+205
-443
lines changed

12 files changed

+205
-443
lines changed

core/embed/upymod/qstrdefsport.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,6 @@ Q(session_manager)
421421
Q(storage.cache_thp)
422422
Q(storage.cache_thp_keys)
423423
Q(thp)
424-
Q(transmission_loop)
425424
Q(trezor.enums.ThpMessageType)
426425
Q(trezor.enums.ThpPairingMethod)
427426
Q(trezor.wire.thp)
@@ -438,7 +437,6 @@ Q(trezor.wire.thp.pairing_context)
438437
Q(trezor.wire.thp.received_message_handler)
439438
Q(trezor.wire.thp.session_context)
440439
Q(trezor.wire.thp.session_manager)
441-
Q(trezor.wire.thp.transmission_loop)
442440
Q(trezor.wire.thp.ui)
443441
Q(trezor.wire.thp.writer)
444442
Q(ui)

core/src/apps/base.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ async def handle_ThpCreateNewSession(
231231
232232
Returns an appropriate `Failure` message if session creation fails.
233233
"""
234-
from trezor import log, loop
234+
from trezor import log
235235
from trezor.enums import FailureType
236236
from trezor.messages import Failure
237237
from trezor.wire import NotInitialized
@@ -281,9 +281,6 @@ async def handle_ThpCreateNewSession(
281281
message.passphrase if message.passphrase is not None else "",
282282
)
283283

284-
channel.sessions[new_session.session_id] = new_session
285-
loop.schedule(new_session.handle())
286-
287284
return Success(message="New session created.")
288285

289286
async def handle_ThpCredentialRequest(

core/src/apps/management/reboot_to_bootloader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ async def reboot_to_bootloader(msg: RebootToBootloader) -> NoReturn:
9494
boot_args = None
9595

9696
ctx = get_context()
97-
await ctx.write_force(Success(message="Rebooting"))
97+
await ctx.write(Success(message="Rebooting"))
9898
# make sure the outgoing USB buffer is flushed
9999
await loop.wait(ctx.iface.iface_num() | io.POLL_WRITE)
100100

core/src/apps/management/wipe_device.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
async def wipe_device(msg: WipeDevice) -> NoReturn:
1515
import storage
16-
from trezor import TR, config, loop, translations
16+
from trezor import TR, config, translations
1717
from trezor.enums import ButtonRequestType
1818
from trezor.messages import Success
1919
from trezor.pin import render_empty_loader
@@ -49,7 +49,7 @@ async def wipe_device(msg: WipeDevice) -> NoReturn:
4949
translations.deinit()
5050
translations.erase()
5151
try:
52-
await get_context().write_force(Success(message="Device wiped"))
52+
await get_context().write(Success(message="Device wiped"))
5353
except Exception:
5454
if __debug__:
5555
log.debug(__name__, "Failed to send Success message after wipe.")
@@ -58,6 +58,5 @@ async def wipe_device(msg: WipeDevice) -> NoReturn:
5858

5959
# reload settings
6060
reload_settings_from_storage()
61-
loop.clear()
6261
if __debug__:
6362
log.debug(__name__, "Device wipe - finished")

core/src/apps/thp/pairing.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ async def _handle_code_entry_is_selected(ctx: PairingContext) -> None:
216216
if ctx.code_entry_secret is None:
217217
await _handle_code_entry_is_selected_first_time(ctx)
218218
else:
219-
await ctx.write_force(ThpPairingPreparationsFinished())
219+
await ctx.write(ThpPairingPreparationsFinished())
220220

221221

222222
async def _handle_code_entry_is_selected_first_time(ctx: PairingContext) -> None:
@@ -246,15 +246,15 @@ async def _handle_code_entry_is_selected_first_time(ctx: PairingContext) -> None
246246
)
247247
assert ctx.code_code_entry is not None
248248
ctx.cpace.generate_keys(f"{ctx.code_code_entry:06}".encode("ascii"))
249-
await ctx.write_force(
249+
await ctx.write(
250250
ThpCodeEntryCpaceTrezor(cpace_trezor_public_key=ctx.cpace.trezor_public_key)
251251
)
252252

253253

254254
@check_state_and_log(ChannelState.TP1)
255255
async def _handle_nfc_is_selected(ctx: PairingContext) -> None:
256256
ctx.nfc_secret = random.bytes(16)
257-
await ctx.write_force(ThpPairingPreparationsFinished())
257+
await ctx.write(ThpPairingPreparationsFinished())
258258

259259

260260
@check_state_and_log(ChannelState.TP1)
@@ -266,7 +266,7 @@ async def _handle_qr_code_is_selected(ctx: PairingContext) -> None:
266266
sha_ctx.update(ctx.qr_code_secret)
267267

268268
ctx.code_qr_code = sha_ctx.digest()[:16]
269-
await ctx.write_force(ThpPairingPreparationsFinished())
269+
await ctx.write(ThpPairingPreparationsFinished())
270270

271271

272272
@check_state_and_log(ChannelState.TP3)

core/src/trezor/wire/__init__.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,9 @@ async def handle_session(iface: WireInterface) -> None:
103103
if __debug__:
104104
_THP_CHANNELS.append(ctx._channels)
105105

106-
while True:
107-
try:
108-
channel = await ctx.get_next_message()
109-
message = channel.reassembler.message
110-
assert message is not None
111-
await received_message_handler.handle_received_message(channel, message)
112-
except Exception:
113-
loop.clear() # restart event loop in case of error
114-
raise # the traceback will be printed by `loop._step()`
106+
channel = await ctx.get_next_message()
107+
await received_message_handler.handle_received_message(channel)
108+
loop.clear()
115109

116110
else:
117111

core/src/trezor/wire/protocol_common.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,10 @@ async def read(
7474
"""
7575
...
7676

77-
async def write(self, msg: protobuf.MessageType) -> None:
77+
def write(self, msg: protobuf.MessageType) -> Awaitable[None]:
7878
"""Write a message to the wire."""
7979
...
8080

81-
def write_force(self, msg: protobuf.MessageType) -> Awaitable[None]:
82-
return self.write(msg)
83-
8481
async def call(
8582
self,
8683
msg: protobuf.MessageType,

0 commit comments

Comments
 (0)