Commit 6caf50cfd02b139e5c1217fd0deff849a3fd0af5

Authored by Tim Gover
1 parent 4d7adfd3

secure-boot: Update example to use the raspberrypi-secure-boot buildroot example

Readme.md
@@ -128,9 +128,7 @@ Be careful not to overwrite `bootcode.bin` or `bootcode4.bin` with the executabl @@ -128,9 +128,7 @@ Be careful not to overwrite `bootcode.bin` or `bootcode4.bin` with the executabl
128 128
129 <a name="secure-boot"></a> 129 <a name="secure-boot"></a>
130 ## Secure Boot 130 ## Secure Boot
131 -Secure Boot requires the latest stable bootloader image.  
132 -WARNING: If the `revoke_devkey` option is used to revoke the ROM development key then it will  
133 -not be possible to downgrade to a bootloader older than 2022-01-06 OR disable secure-boot mode. 131 +Secure Boot requires a recent bootloader stable image e.g. the version in this repository.
134 132
135 ### Tutorial 133 ### Tutorial
136 Creating a secure boot system from scratch can be quite complex. The [secure boot tutorial](secure-boot-example/README.md) uses a minimal example OS image to demonstrate how the Raspberry Pi-specific aspects of secure boot work. 134 Creating a secure boot system from scratch can be quite complex. The [secure boot tutorial](secure-boot-example/README.md) uses a minimal example OS image to demonstrate how the Raspberry Pi-specific aspects of secure boot work.
@@ -156,57 +154,58 @@ openssl genrsa 2048 &gt; private.pem @@ -156,57 +154,58 @@ openssl genrsa 2048 &gt; private.pem
156 * Please see the [secure boot MSD guide](secure-boot-msd/README.md) for instructions about to mount the EMMC via USB mass-storage once secure-boot has been enabled. 154 * Please see the [secure boot MSD guide](secure-boot-msd/README.md) for instructions about to mount the EMMC via USB mass-storage once secure-boot has been enabled.
157 155
158 ## Secure Boot - image creation 156 ## Secure Boot - image creation
159 -Secure boot requires a `boot.img` FAT image to be created. This plus a signature file (boot.sig)  
160 -must be placed in the boot partition of the Raspberry Pi. 157 +Secure Boot requires self-contained ramdisk (`boot.img`) FAT image to be created containing the GPU
  158 +firmware, kernel and any other dependencies that would normally be loaded from the boot partition.
161 159
162 -The contents of the `boot.img` are the files normally present in the Raspberry Pi OS boot  
163 -partition i.e. firmware, DTBs and kernel image. However, in order to reduce boot time  
164 -it is advisable to remove unused files e.g. firmware or kernel images for Pi models. 160 +This plus a signature file (boot.sig) must be placed in the boot partition of the Raspberry Pi
  161 +or network download location.
165 162
166 -The firmware must be new enough to support secure boot. The latest firmware APT  
167 -package supports secure boot. To download the firmware files directly.  
168 -  
169 -`git clone --depth 1 --branch stable https://github.com/raspberrypi/firmware`  
170 -  
171 -A helper script (`make-boot-image`) is provided to automate the image creation process. This  
172 -script depends upon the `mkfs.fat` and `losetup` tools and only runs on Linux. 163 +The `boot.img` file should contain:-
  164 +* The kernel
  165 +* Device tree overlays
  166 +* GPU firmware (start.elf and fixup.dat)
  167 +* Linux initramfs containing the application OR scripts to mount/create an encrypted file-system.
173 168
174 -### Root File System  
175 -Normally, the Kernel modules and overlays for a secure-boot system would be provided  
176 -in an [initramfs](https://www.raspberrypi.com/documentation/computers/config_txt.html#initramfs)  
177 -and built with [buildroot](https://buildroot.org/) or [yocto](https://www.yoctoproject.org/). 169 +Secure boot is only responsible for loading a verified Linux kernel and initramfs. It does NOT
  170 +verify the integrity of other file-systems or provide file-system encryption. This would normally be
  171 +implemented using standard Linux tools such as [LUKS](https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup).
  172 +and controlled by scripts / systemd services in an initramfs.
178 173
179 -This ensures that all of the kernel modules and device tree dependencies are covered  
180 -by the secure-boot signature. 174 +### Building `boot.img` using buildroot
181 175
182 -Since the `initramfs` is part of the `boot.img` it is possible to replace GPU firmware,  
183 -kernel and dependencies in a single file update. 176 +The `secure-boot-example` directory contains a simple `boot.img` example with working HDMI,
  177 +network, UART console and common tools in an initramfs.
184 178
185 -Alternatively, for test/development the following instructions explain how a normal  
186 -Raspberry Pi OS install can be modified to be booted with the secure-boot loader. 179 +This was generated from the [raspberrypi-signed-boot](https://github.com/raspberrypi/buildroot/blob/raspberrypi-signed-boot/README.md)
  180 +buildroot config. Whilst not a generic fully featured configuration it should be relatively
  181 +straightforward to cherry-pick the `raspberrypi-secure-boot` package and helper scripts into
  182 +other buildroot configurations.
187 183
188 -#### Clone the Raspberry Pi OS boot files  
189 -Copy the contents of `/boot` to a local directory called `secure-boot-files` 184 +### Manual boot image creation
  185 +For other systems or manual image creation a helper script `make-boot-image` in the tools
  186 +directory is provided.
190 187
191 -#### Set the kernel root device  
192 -Since the boot file-system for the firmware is now in a signed disk image the OS cannot write to this.  
193 -Therefore, any changes to `cmdline.txt` must be made before the `boot.img` file is signed. 188 +To run:-
  189 +* Copy the source firmware + other files into a temporary directory (`temp`)
  190 +* Run `make-boot-image -d temp -O boot.img`
  191 +* Run `rpi-eeprom-digest -i boot.img -o boot.sig -k private-key.PEM`
194 192
195 -* Verify that `cmdline.txt` in `secure-boot-files` points to the correct UUID for the root file-system.  
196 - Alternatively, for testing, you can specify the root device name e.g. `root=/dev/mmcblk0p2`.  
197 -  
198 -* Remove `init-resize.sh` from `cmdline.txt` 193 +`make-boot-image` depends upon the `mkfs.fat` and `losetup` Linux tools.
199 194
  195 +#### Minimum firmware version
  196 +The firmware must be new enough to support secure boot. The latest firmware APT
  197 +package supports secure boot. To download the firmware files directly.
200 198
201 -#### Create the boot image  
202 -The `-b` product argument (pi4,pi400,cm4) tells the script to discard files which are not required by that product. This makes the image smaller and reduces the time taken to calculate the hash of the image file thereby reducing the boot time.  
203 ```bash 199 ```bash
204 -sudo ../tools/make-boot-image -d secure-boot-files -o boot.img -b pi4 200 +git clone --depth 1 --branch stable https://github.com/raspberrypi/firmware
205 ``` 201 ```
206 202
207 -The maximum supported size for boot.img is currently 96 megabytes. 203 +To check the version information within a `start4.elf` firmware file run
  204 +```bash
  205 +strings start4.elf | grep VC_BUILD_
  206 +```
208 207
209 -#### Verify the boot image 208 +#### Verifying a boot image
210 To verify that the boot image has been created correctly use losetup to mount the .img file. 209 To verify that the boot image has been created correctly use losetup to mount the .img file.
211 210
212 ```bash 211 ```bash
@@ -224,7 +223,7 @@ losetup -d ${LOOP} @@ -224,7 +223,7 @@ losetup -d ${LOOP}
224 rmdir boot-mount 223 rmdir boot-mount
225 ``` 224 ```
226 225
227 -#### Sign the boot image 226 +#### Signing the boot image
228 For secure-boot, `rpi-eeprom-digest` extends the current `.sig` format of 227 For secure-boot, `rpi-eeprom-digest` extends the current `.sig` format of
229 sha256 + timestamp to include an hex format RSA bit PKCS#1 v1.5 signature. The key length 228 sha256 + timestamp to include an hex format RSA bit PKCS#1 v1.5 signature. The key length
230 must be 2048 bits. 229 must be 2048 bits.
@@ -232,6 +231,15 @@ must be 2048 bits. @@ -232,6 +231,15 @@ must be 2048 bits.
232 ```bash 231 ```bash
233 ../tools/rpi-eeprom-digest -i boot.img -o boot.sig -k "${KEY_FILE}" 232 ../tools/rpi-eeprom-digest -i boot.img -o boot.sig -k "${KEY_FILE}"
234 ``` 233 ```
  234 +
  235 +To verify the signature of an existing image set the `PUBLIC_KEY_FILE` environment variable
  236 +to the path of the public key file in PEM format.
  237 +
  238 +```bash
  239 +../tools/rpi-eeprom-digest -i boot.img -k "${PUBLIC_KEY_FILE}" -v boot.sig
  240 +```
  241 +
  242 +
235 #### Hardware security modules 243 #### Hardware security modules
236 `rpi-eeprom-digest` is a shell script that wraps a call to `openssl dgst -sign`. 244 `rpi-eeprom-digest` is a shell script that wraps a call to `openssl dgst -sign`.
237 If the private key is stored within a hardware security module instead of 245 If the private key is stored within a hardware security module instead of
secure-boot-example/README.md
@@ -28,7 +28,7 @@ more information. @@ -28,7 +28,7 @@ more information.
28 * A Raspberry Pi Compute Module 4 28 * A Raspberry Pi Compute Module 4
29 * Micro USB cable for `rpiboot` connection 29 * Micro USB cable for `rpiboot` connection
30 * USB serial cable (for debug logs) 30 * USB serial cable (for debug logs)
31 -* Linux or Cygwin (Windows 10) 31 +* Linux, WSL or Cygwin (Windows 10)
32 * OpenSSL 32 * OpenSSL
33 * Python3 33 * Python3
34 * Python `cryptodomex` 34 * Python `cryptodomex`
@@ -101,7 +101,7 @@ cd .. @@ -101,7 +101,7 @@ cd ..
101 ``` 101 ```
102 102
103 At this stage OTP has not been modified and the signed image requirement can be reverted by flashing a default, unsigned image. 103 At this stage OTP has not been modified and the signed image requirement can be reverted by flashing a default, unsigned image.
104 -However, once the [OTP secure-boot flags](../secure-boot-recovery/README.md#locking-secure-boot-mode) are set then `SIGNED_BOOT` is permenantely enabled and cannot be overriden via the EEPROM config. 104 +However, once the [OTP secure-boot flags](../secure-boot-recovery/README.md#locking-secure-boot-mode) are set then `SIGNED_BOOT` is permanently enabled and cannot be overridden via the EEPROM config.
105 105
106 106
107 ### Update the signature for the example OS image 107 ### Update the signature for the example OS image
@@ -154,5 +154,5 @@ For example: @@ -154,5 +154,5 @@ For example:
154 * Power cycle the CM4 IO board. 154 * Power cycle the CM4 IO board.
155 * The system should now boot into the OS. 155 * The system should now boot into the OS.
156 156
157 -N.B. The example image is currently the same as the `mass storage-gadget`, so the EMMC/SD will appear as block devices on the host PC if the micro USB cable is still connected. 157 +The secure-boot example image can be rebuilt and modified using buildroot. See [raspberrypi-signed-boot buildroot](https://github.com/raspberrypi/buildroot/blob/raspberrypi-signed-boot/README.md)
158 158