core/headertool: support generating vendor headers with explicit size

pull/830/head
matejcik 4 years ago
parent 3c7806aaf6
commit d28e33ef02

@ -1,4 +1,5 @@
{
"header_len": 4608,
"text": "SatoshiLabs",
"expiry": 0,
"version": {

@ -1,4 +1,5 @@
{
"header_len": 2560,
"text": "UNSAFE, DO NOT USE!",
"expiry": 0,
"version": {

@ -6,6 +6,15 @@ import click
from trezorlib import firmware
def minimum_header_len(spec):
spec = spec.copy()
spec["header_len"] = 512000
reparsed = firmware.VendorHeader.parse(firmware.VendorHeader.build(spec))
data_length = reparsed._end_offset - reparsed._start_offset
# data length + 65 for signatures, rounded up to nearest multiple of 512
return (data_length + 65 + 511) // 512 * 512
@click.command()
@click.argument("specfile", type=click.File("r"))
@click.argument("image", type=click.File("rb"))
@ -16,6 +25,19 @@ def build_vendorheader(specfile, image, outfile):
spec["image"] = firmware.Toif.parse(image.read())
spec["sigmask"] = 0
spec["signature"] = b"\x00" * 64
min_length = minimum_header_len(spec)
if "header_len" not in spec:
spec["header_len"] = min_length
elif spec["header_len"] < min_length:
raise click.ClickException(
f"Specified header_len {spec['header_len']} too low. "
f"Minimum allowable value is {min_length}."
)
if spec["header_len"] % 512 != 0:
raise click.ClickException("Invalid header_len: must be a multiple of 512")
outfile.write(firmware.VendorHeader.build(spec))

@ -146,7 +146,7 @@ VendorTrust = c.Transformed(c.BitStruct(
VendorHeader = c.Struct(
"_start_offset" / c.Tell,
"magic" / c.Const(b"TRZV"),
"_header_len" / c.Padding(4),
"header_len" / c.Int32ul,
"expiry" / c.Int32ul,
"version" / c.Struct(
"major" / c.Int8ul,
@ -159,17 +159,14 @@ VendorHeader = c.Struct(
"pubkeys" / c.Bytes(32)[c.this.sig_n],
"text" / c.Aligned(4, c.PascalString(c.Int8ul, "utf-8")),
"image" / Toif,
"_data_end_offset" / c.Tell,
"_end_offset" / c.Tell,
"_min_header_len" / c.Check(c.this.header_len > (c.this._end_offset - c.this._start_offset) + 65),
"_header_len_aligned" / c.Check(c.this.header_len % 512 == 0),
c.Padding(-(c.this._data_end_offset + 65) % 512),
c.Padding(c.this.header_len - c.this._end_offset + c.this._start_offset - 65),
"sigmask" / c.Byte,
"signature" / c.Bytes(64),
"_end_offset" / c.Tell,
"header_len" / c.Pointer(
c.this._start_offset + 4,
c.Rebuild(c.Int32ul, c.this._end_offset - c.this._start_offset)
),
)

Loading…
Cancel
Save