mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 12:08:19 +00:00 
			
		
		
		
	Bring these files into the documentation. Fix 'wtih' and 'it' typos and repeated 'could' while we are here. Signed-off-by: Simon Glass <sjg@chromium.org>
		
			
				
	
	
		
			108 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| .. SPDX-License-Identifier: GPL-2.0+
 | |
| 
 | |
| U-Boot Verified Boot
 | |
| ====================
 | |
| 
 | |
| Introduction
 | |
| ------------
 | |
| 
 | |
| Verified boot here means the verification of all software loaded into a
 | |
| machine during the boot process to ensure that it is authorised and correct
 | |
| for that machine.
 | |
| 
 | |
| Verified boot extends from the moment of system reset to as far as you wish
 | |
| into the boot process. An example might be loading U-Boot from read-only
 | |
| memory, then loading a signed kernel, then using the kernel's dm-verity
 | |
| driver to mount a signed root filesystem.
 | |
| 
 | |
| A key point is that it is possible to field-upgrade the software on machines
 | |
| which use verified boot. Since the machine will only run software that has
 | |
| been correctly signed, it is safe to read software from an updatable medium.
 | |
| It is also possible to add a secondary signed firmware image, in read-write
 | |
| memory, so that firmware can easily be upgraded in a secure manner.
 | |
| 
 | |
| 
 | |
| Signing
 | |
| -------
 | |
| 
 | |
| Verified boot uses cryptographic algorithms to 'sign' software images.
 | |
| Images are signed using a private key known only to the signer, but can
 | |
| be verified using a public key. As its name suggests the public key can be
 | |
| made available without risk to the verification process. The private and
 | |
| public keys are mathematically related. For more information on how this
 | |
| works look up "public key cryptography" and "RSA" (a particular algorithm).
 | |
| 
 | |
| The signing and verification process looks something like this::
 | |
| 
 | |
| 
 | |
|           Signing                                      Verification
 | |
|           =======                                      ============
 | |
| 
 | |
|       +--------------+                 *
 | |
|       | RSA key pair |                 *             +---------------+
 | |
|       | .key  .crt   |                 *             | Public key in |
 | |
|       +--------------+     +------> public key ----->| trusted place |
 | |
|             |              |           *             +---------------+
 | |
|             |              |           *                    |
 | |
|             v              |           *                    v
 | |
|        +---------+         |           *             +--------------+
 | |
|        |         |---------+           *             |              |
 | |
|        | signer  |                     *             |    U-Boot    |
 | |
|        |         |---------+           *             |  signature   |--> yes/no
 | |
|        +---------+         |           *             | verification |
 | |
|             ^              |           *             |              |
 | |
|             |              |           *             +--------------+
 | |
|             |              |           *                    ^
 | |
|        +----------+        |           *                    |
 | |
|        | Software |        +----> signed image -------------+
 | |
|        |  image   |                    *
 | |
|        +----------+                    *
 | |
| 
 | |
| 
 | |
| The signature algorithm relies only on the public key to do its work. Using
 | |
| this key it checks the signature that it finds in the image. If it verifies
 | |
| then we know that the image is OK.
 | |
| 
 | |
| The public key from the signer allows us to verify and therefore trust
 | |
| software from updatable memory.
 | |
| 
 | |
| It is critical that the public key be secure and cannot be tampered with.
 | |
| It can be stored in read-only memory, or perhaps protected by other on-chip
 | |
| crypto provided by some modern SOCs. If the public key can be changed, then
 | |
| the verification is worthless.
 | |
| 
 | |
| 
 | |
| Chaining Images
 | |
| ---------------
 | |
| 
 | |
| The above method works for a signer providing images to a run-time U-Boot.
 | |
| It is also possible to extend this scheme to a second level, like this:
 | |
| 
 | |
| #. Master private key is used by the signer to sign a first-stage image.
 | |
| #. Master public key is placed in read-only memory.
 | |
| #. Secondary private key is created and used to sign second-stage images.
 | |
| #. Secondary public key is placed in first stage images
 | |
| #. We use the master public key to verify the first-stage image. We then
 | |
|    use the secondary public key in the first-stage image to verify the second-
 | |
|    state image.
 | |
| #. This chaining process can go on indefinitely. It is recommended to use a
 | |
|    different key at each stage, so that a compromise in one place will not
 | |
|    affect the whole change.
 | |
| 
 | |
| 
 | |
| Flattened Image Tree (FIT)
 | |
| --------------------------
 | |
| 
 | |
| The FIT format is already widely used in U-Boot. It is a flattened device
 | |
| tree (FDT) in a particular format, with images contained within. FITs
 | |
| include hashes to verify images, so it is relatively straightforward to
 | |
| add signatures as well.
 | |
| 
 | |
| The public key can be stored in U-Boot's CONFIG_OF_CONTROL device tree in
 | |
| a standard place. Then when a FIT is loaded it can be verified using that
 | |
| public key. Multiple keys and multiple signatures are supported.
 | |
| 
 | |
| See :doc:`signature` for more information.
 | |
| 
 | |
| .. sectionauthor:: Simon Glass <sjg@chromium.org> 1-1-13
 |