parent
d693b0c196
commit
37c61c1381
@ -0,0 +1,47 @@
|
||||
from micropython import const
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from trezor import utils, wire, workflow
|
||||
from trezor.messages import FirmwareChunk, FirmwareChunkAck, GetFirmware, Success
|
||||
from trezor.ui.layouts import confirm_action, draw_simple_text
|
||||
|
||||
from .get_firmware_hash import _render_progress
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from trezor.wire import Context
|
||||
|
||||
CHUNK_SIZE = const(1024 * 4)
|
||||
# assuming that all sectors are of size 128 kB
|
||||
PROGRESS_TOTAL = utils.FIRMWARE_SECTORS_COUNT * 128 * 1024
|
||||
|
||||
|
||||
async def get_firmware(ctx: Context, _msg: GetFirmware) -> Success:
|
||||
await confirm_action(
|
||||
ctx,
|
||||
"dump_firmware",
|
||||
title="Extract firmware",
|
||||
action="Do you want to extract device firmware?",
|
||||
description="Your seed will not be revealed.",
|
||||
)
|
||||
if not utils.DISABLE_ANIMATION:
|
||||
workflow.close_others()
|
||||
draw_simple_text("Please wait")
|
||||
|
||||
sector_buffer = bytearray(CHUNK_SIZE)
|
||||
packet = FirmwareChunk(chunk=sector_buffer)
|
||||
progress = 0
|
||||
_render_progress(progress, PROGRESS_TOTAL)
|
||||
for i in range(utils.FIRMWARE_SECTORS_COUNT):
|
||||
size = utils.firmware_sector_size(i)
|
||||
try:
|
||||
for ofs in range(0, size, CHUNK_SIZE):
|
||||
utils.get_firmware_chunk(i, ofs, sector_buffer)
|
||||
await ctx.call(packet, FirmwareChunkAck)
|
||||
progress += CHUNK_SIZE
|
||||
_render_progress(progress, PROGRESS_TOTAL)
|
||||
# reset progress to known point, in case some sectors are not 128 kB
|
||||
progress = (i + 1) * 128 * 1024
|
||||
_render_progress(progress, PROGRESS_TOTAL)
|
||||
except ValueError:
|
||||
raise wire.DataError("Failed to dump firmware.")
|
||||
return Success(message="Firmware dumped.")
|
Loading…
Reference in new issue