blob: 8c18fc90f34d6b42a6dfa8d7bf35e06facb87314 [file] [log] [blame] [view]
# Introduction
[OpenTitan Secure Boot][rom-ext-manifest] process consists of several stages.
On power-on reset, or wake-up from a deep sleep the execution enters the Mask
ROM, which is baked into the OpenTitan metal masks. This means that the Mask
ROM, once manufactured, cannot be updated. To add a degree of flexibility, in
particular to allow for a manufacturer specific configuration and facilities to
deliver security updates - OpenTitan design provisions the Extension ROM
(ROM_EXT) that lives in the flash memory.
ROM_EXT consists of a [manifest][rom-ext-manifest] and the image itself. When
the image is generated - the manifest data is "blank". The responsibility of
ROM_EXT signer is to update the manifest, sign the image and add the
signature to it.
## Tooling
ROM_EXT signer is a host side tool that is written in Rust.
## Why Rust?
Rust has been chosen for the reach language and standard library features, as
well as incredible and versatile infrastructure. Rust's Cargo (build/packaging
system) and mature community driven database (crates.io), makes it easy and
cheap (in terms of effort) to find, integrate and use relevant functionality.
** This makes rust great for host side tooling **
# Design
This tool consist of four major parts:
- Configuration file and parsing/deserealisation
- Image manipulation (updating the manifest)
- Image signing
- "Receipt" production
## Configuration file and parsing/deserialisation
The configuration file is in `.hjson` format, which is deserialised (turned
into Rust structures) using `hjson_serde` and `serde` crates.
Configuration file contains data for all of the fields that need updating in
the manifest before signing.
Please note that signature key modulus and signature key public exponent are
extracted separately. The configuration file has a link to the private key,
and public key is extracted from it via `ring` library.
Generic (u32 or u64) integers are defines as an array. This is done to make
updating the manifest easier. Complex fields such as "Peripheral Lockdown
Info" have a separate data structure, and are spliced into the image separately.
## Image manipulation (updating the manifest)
Reads the binary image of the disk. It uses the parsed configuration to
update the manifest before signing, and is responsible for generating the signed
file.
## Image signing
TODO
## "Receipt" production
TODO
<!-- Links -->
[csm-secure-boot]: {{< relref "doc/security/specs/secure_boot" >}}
[rom-ext-manifest]: {{< relref "sw/device/rom_exts/docs/manifest" >}}