1 # vboot - Verified Boot Support
3 Google's verified boot support consists of:
6 * Special firmware layout
7 * Firmware verification
8 * Firmware measurements
9 * A firmware update mechanism
10 * Specific build flags
11 * Signing the coreboot image
13 Google's vboot verifies the firmware and places measurements within the TPM.
15 - [List of supported Devices](list_vboot.md)
21 When using vboot, the root-of-trust is basically the read-only portion of the
22 SPI flash. The following items factor into the trust equation:
24 * The GCC compiler must reliably translate the code into machine code
25 without inserting any additional code (virus, backdoor, etc.)
26 * The CPU must reliably execute the reset sequence and instructions as
27 documented by the CPU manufacturer.
28 * The SPI flash must provide only the code programmed into it to the CPU
29 without providing any alternative reset vector or code sequence.
30 * The SPI flash must honor the write-protect input and protect the specified
31 portion of the SPI flash from all erase and write accesses.
33 The firmware is typically protected using the write-protect pin on the SPI
34 flash part and setting some of the write-protect bits in the status register
35 during manufacturing. The protected area is platform specific and for x86
36 platforms is typically 1/4th of the SPI flash part size.
37 Because this portion of the SPI flash is hardware write protected, it is not
38 possible to update this portion of the SPI flash in the field, without altering
39 the system to eliminate the ground connection to the SPI flash write-protect pin.
40 Without hardware modifications, this portion of the SPI flash maintains the
41 manufactured state during the system's lifetime.
47 Several sections are added to the firmware layout to support vboot:
50 * Google Binary Blob (GBB) area
51 * Read/write section A
52 * Read/write section B
54 The following sections describe the various portions of the flash layout.
58 The read-only section contains a coreboot file system (CBFS) that contains all
59 of the boot firmware necessary to perform recovery for the system. This firmware
60 is typically protected using the write-protect pin on the SPI flash part and
61 setting some of the write-protect bits in the status register during
63 The protected area is typically 1/4th of the SPI flash part size and must cover
64 the entire read-only section which consists of:
66 * Vital Product Data (VPD) area
68 * Google Binary Blob (GBB) area
69 * coreboot file system containing read-only recovery firmware
71 ### Google Binary Blob (GBB) Area
73 The GBB area is part of the read-only section. This area contains a 4096 or 8192
74 bit public root RSA key that is used to verify the *VBLOCK* area to obtain the
79 The recovery firmware is contained within a coreboot file system and consists of:
90 * processor specific files:
95 The recovery firmware is written during manufacturing and typically contains
96 code to write the storage device (eMMC device or hard disk). The recovery image
97 is usually contained on a socketed device such as a USB flash drive or an
98 SD card. Depending upon the payload firmware doing the recovery, it may be
99 possible for the user to interact with the system to specify the recovery
100 image path. Part of the recovery is also to write the A and B areas of the SPI
101 flash device to boot the system.
103 ### Read/Write Section
105 The read/write sections contain an area which contains the firmware signing
106 key and signature and an area containing a coreboot file system with a subset
107 of the firmware. The firmware files in *FW_MAIN_A* and *FW_MAIN_B* are:
114 * processor specific files:
119 The firmware subset enables most issues to be fixed in the field with firmware
120 updates. The firmware files handle memory and most of silicon initialization.
121 These files also produce the tables which get passed to the operating system.
127 The read/write sections exist in one of three states:
131 * Successfully booted
134 Firmware updates are handled by the operating system by writing any read/write
135 section that is not in the "successfully booted" state. Upon the next reboot,
136 vboot determines the section to boot. If it finds one in the "ready to boot"
137 state then it attempts to boot using that section. If the boot fails then
138 vboot marks the section as invalid and attempts to fall back to a read/write
139 section in the "successfully booted" state. If vboot is not able to find a
140 section in the "successfully booted" state then vboot enters recovery mode.
142 Only the operating system is able to transition a section from the
143 "ready to boot" state to the "successfully booted" state.
144 The transition is typically done after the operating system has been running
145 for a while indicating that successful boot was possible and the operating
148 Note that as long as the SPI write protection is in place then the system
149 is always recoverable. If the flash update fails then the system will continue
150 to boot using the previous read/write area. The same is true if coreboot passes
151 control to the payload or the operating system and then the boot fails. In the
152 worst case, the SPI flash gets totally corrupted in which case vboot fails the
153 signature checks and enters recovery mode. There are no times where the SPI
154 flash is exposed and the reset vector or part of the recovery firmware gets
161 The following *Kconfig* values need to be selected to enable vboot:
166 The starting stage needs to be specified by selecting either
167 VBOOT_STARTS_IN_BOOTBLOCK or VBOOT_STARTS_IN_ROMSTAGE.
169 If vboot starts in bootblock then vboot may be built as a separate stage by
170 selecting `VBOOT_SEPARATE_VERSTAGE`. Additionally, if static RAM is too small
171 to fit both verstage and romstage then selecting `VBOOT_RETURN_FROM_VERSTAGE`
172 enables bootblock to reuse the RAM occupied by verstage for romstage.
174 Non-volatile flash is needed for vboot operation. This flash area may be in
175 CMOS, the EC, or in a read/write area of the SPI flash device.
176 Select one of the following:
181 More non-volatile storage features may be found in `security/vboot/Kconfig`.
183 A TPM is also required for vboot operation.
184 TPMs are available in `drivers/i2c/tpm` and `drivers/pc80/tpm`.
186 In addition to adding the coreboot files into the read-only region,
187 enabling vboot causes the build script to add the read/write files into
188 coreboot file systems in *FW_MAIN_A* and *FW_MAIN_B*.
192 The files added to this list will only be placed in the read-only region and
193 not into the read/write coreboot file systems in *FW_MAIN_A* and *FW_MAIN_B*.
195 **VBOOT_ENABLE_CBFS_FALLBACK**
197 Normally coreboot will use the active read/write coreboot file system for all
198 of it's file access when vboot is active and is not in recovery mode.
200 When the `VBOOT_ENABLE_CBFS_FALLBACK` option is enabled the cbfs file system will
201 first try to locate a file in the active read/write file system. If the file
202 doesn't exist here the file system will try to locate the file in the read-only
205 This option can be used to prevent duplication of static data. Files can be
206 removed from the read/write partitions by adding them to the `RO_REGION_ONLY`
207 config. If a file needs to be changed in a later stage simply remove it from
212 ## Signing the coreboot Image
214 The following command script is an example of how to sign the coreboot image
215 file. This script is used on the Intel Galileo board and creates the *GBB* area
216 and inserts it into the coreboot image. It also updates the *VBLOCK* areas with
217 the firmware signing key and the signature for the *FW_MAIN* firmware.
218 More details are available in `3rdparty/vboot/README`.
223 # The necessary tools were built and installed using the following commands:
225 # pushd 3rdparty/vboot
230 # The keys were made using the following command
232 # 3rdparty/vboot/scripts/keygeneration/create_new_keys.sh \
236 # The "magic" numbers below are derived from the GBB section in
237 # src/mainboard/intel/galileo/vboot.fmd.
239 # GBB Header Size: 0x80
240 # GBB Offset: 0x611000, 4KiB block number: 1553 (0x611)
241 # GBB Length: 0x7f000, 4KiB blocks: 127 (0x7f)
242 # COREBOOT Offset: 0x690000, 4KiB block number: 1680 (0x690)
243 # COREBOOT Length: 0x170000, 4KiB blocks: 368 (0x170)
245 # 0x7f000 (GBB Length) = 0x80 + 0x100 + 0x1000 + 0x7ce80 + 0x1000
247 # Create the GBB area blob
248 # Parameters: hwid_size,rootkey_size,bmpfv_size,recoverykey_size
250 gbb_utility -c 0x100,0x1000,0x7ce80,0x1000 gbb.blob
253 # Copy from the start of the flash to the GBB region into the signed flash
256 # 1553 * 4096 = 0x611 * 0x1000 = 0x611000, size of area before GBB
258 dd conv=fdatasync ibs=4096 obs=4096 count=1553 \
259 if=build/coreboot.rom of=build/coreboot.signed.rom
262 # Append the empty GBB area to the coreboot.rom image.
264 # 1553 * 4096 = 0x611 * 0x1000 = 0x611000, offset to GBB
266 dd conv=fdatasync obs=4096 obs=4096 seek=1553 if=gbb.blob \
267 of=build/coreboot.signed.rom
270 # Append the rest of the read-only region into the signed flash image.
272 # 1680 * 4096 = 0x690 * 0x1000 = 0x690000, offset to COREBOOT area
273 # 368 * 4096 = 0x170 * 0x1000 = 0x170000, length of COREBOOT area
275 dd conv=fdatasync ibs=4096 obs=4096 skip=1680 seek=1680 count=368 \
276 if=build/coreboot.rom of=build/coreboot.signed.rom
279 # Insert the HWID and public root and recovery RSA keys into the GBB area.
282 --set --hwid='Galileo' \
283 -r $PWD/keys/recovery_key.vbpubk \
284 -k $PWD/keys/root_key.vbpubk \
285 build/coreboot.signed.rom
288 # Sign the read/write firmware areas with the private signing key and update
289 # the VBLOCK_A and VBLOCK_B regions.
291 3rdparty/vboot/scripts/image_signing/sign_firmware.sh \
292 build/coreboot.signed.rom \
294 build/coreboot.signed.rom
301 The reset vector exist in the read-only area and points to the bootblock
302 entry point. The only copy of the bootblock exists in the read-only area
303 of the SPI flash. Verstage may be part of the bootblock or a separate stage.
304 If separate then the bootblock loads verstage from the read-only area and
305 transfers control to it.
307 Upon first boot, verstage attempts to verify the read/write section A.
308 It gets the public root key from the GBB area and uses that to verify the
309 *VBLOCK* area in read-write section A. If the *VBLOCK* area is valid then it
310 extracts the firmware signing key (1024-8192 bits) and uses that to verify
311 the *FW_MAIN_A* area of read/write section A. If the verification is successful
312 then verstage instructs coreboot to use the coreboot file system in read/write
313 section A for the contents of the remaining boot firmware (romstage, postcar,
314 ramstage and the payload).
316 If verification fails for the read/write area and the other read/write area is
317 not valid vboot falls back to the read-only area to boot into system recovery.
321 ## Chromebook Special Features
323 Google's Chromebooks have some special features:
326 * Write-protect screw
330 Developer mode allows the user to use coreboot to boot another operating system.
331 This may be a another (beta) version of ChromeOS, or another flavor of
332 GNU/Linux. Use of developer mode does not void the system warranty. Upon entry
333 into developer mode, all locally saved data on the system is lost.
334 This prevents someone from entering developer mode to subvert the system
335 security to access files on the local system or cloud.
337 ### Write Protect Screw
339 Chromebooks have a write-protect screw which provides the ground to the
340 write-protect pin of the SPI flash.
341 Google specifically did this to allow the manufacturing line and advanced
342 developers to re-write the entire SPI flash part. Once the screw is removed,
343 any firmware may be placed on the device.
344 However, accessing this screw requires opening the case and voids the