Commit 4a21a619f229327c43f658b82c7afae6b927bed0

Authored by Tim Gover
1 parent 1ae3d7ec

docs: Update mass-storage gadget + secure-boot

* Remove the reference to LEDs flashing with mass-storage-gadget
  because this code was removed.
* Mention LUKS / rpi-otp-private-key in the secure-boot section.
* Add a link to the PIP
* Drop reference to make-boot-image - just use buildroot.
Readme.md
... ... @@ -91,6 +91,9 @@ the minimal set of files required from the boot partition.
91 91  
92 92 This section describes how to diagnose common `rpiboot` failures for Compute Modules. Whilst `rpiboot` is tested on every Compute Module during manufacture the system relies on multiple hardware and software elements. The aim of this guide is to make it easier to identify which component is failing.
93 93  
  94 +### Product Information Portal
  95 +The [Product Information Portal](https://pip.raspberrypi.com/) contains the official documentation for hardware revision changes for Raspberry Pi computers.
  96 +
94 97 ### Hardware
95 98 * Inspect the Compute Module pins and connector for signs of damage and verify that the socket is free from debris.
96 99 * Check that the Compute Module is fully inserted.
... ... @@ -157,7 +160,7 @@ openssl genrsa 2048 > private.pem
157 160 Secure Boot requires self-contained ramdisk (`boot.img`) FAT image to be created containing the GPU
158 161 firmware, kernel and any other dependencies that would normally be loaded from the boot partition.
159 162  
160   -This plus a signature file (boot.sig) must be placed in the boot partition of the Raspberry Pi
  163 +This plus a signature file (`boot.sig`) must be placed in the boot partition of the Raspberry Pi
161 164 or network download location.
162 165  
163 166 The `boot.img` file should contain:-
... ... @@ -166,10 +169,39 @@ The `boot.img` file should contain:-
166 169 * GPU firmware (start.elf and fixup.dat)
167 170 * Linux initramfs containing the application OR scripts to mount/create an encrypted file-system.
168 171  
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.
  172 +
  173 +### Disk encryption
  174 +Secure-boot loads the `boot.img` from an unencrypted FAT / EFI boot partition and is responsible for
  175 +loading the Kernel + initramfs. There is no support in the firmware or ROM for full-disk encryption.
  176 +
  177 +If a custom OS image needs to use an encrypted file-system then this would normally be implement
  178 +via scripts within the initramfs.
  179 +
  180 +Raspberry Pi computers do not have a secure enclave, however, it's possible to store a 256 bit
  181 +[device specific private key](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#device-specific-private-key)
  182 +in OTP. The key is accessible to any process with access to `/dev/vcio` (`vcmailbox`) so the
  183 +secure-boot OS must ensure that access to this interface is restricted.
  184 +
  185 +**It's not possible to prevent code kernel code from accessing OTP directly**
  186 +
  187 +See also:-
  188 +* [LUKS](https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup)
  189 +* [cryptsetup FAQ](https://gitlab.com/cryptsetup/cryptsetup/-/wikis/FrequentlyAskedQuestions)
  190 +* [rpi-otp-private-key](../tools/rpi-otp-private-key)
  191 +
  192 +Example script which uses a device-specific private key to create/mount an encrypted file-system.
  193 +```bash
  194 +export BLK_DEV=/dev/mmcblk0p3
  195 +export KEY_FILE=$(mktemp -d)/key.bin
  196 +rpi-otp-private-key -b > "${KEY_FILE}"
  197 +cryptsetup luksFormat --key-file="${KEY_FILE}" --key-size=256 --type=luks2 ${BLK_DEV}
  198 +
  199 +cryptsetup luksOpen ${BLK_DEV} encrypted-disk --key-file="${KEY_FILE}"
  200 +mkfs /dev/mapper/encrypted-disk
  201 +mkdir -p /mnt/application-data
  202 +mount /dev/mapper/encrypted-disk /mnt/application-data
  203 +rm "${KEY_FILE}"
  204 +```
173 205  
174 206 ### Building `boot.img` using buildroot
175 207  
... ... @@ -181,17 +213,6 @@ buildroot config. Whilst not a generic fully featured configuration it should be
181 213 straightforward to cherry-pick the `raspberrypi-secure-boot` package and helper scripts into
182 214 other buildroot configurations.
183 215  
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.
187   -
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`
192   -
193   -`make-boot-image` depends upon the `mkfs.fat` and `losetup` Linux tools.
194   -
195 216 #### Minimum firmware version
196 217 The firmware must be new enough to support secure boot. The latest firmware APT
197 218 package supports secure boot. To download the firmware files directly.
... ... @@ -205,7 +226,7 @@ To check the version information within a `start4.elf` firmware file run
205 226 strings start4.elf | grep VC_BUILD_
206 227 ```
207 228  
208   -#### Verifying a boot image
  229 +#### Verifying the contents of a `boot.img` file
209 230 To verify that the boot image has been created correctly use losetup to mount the .img file.
210 231  
211 232 ```bash
... ...
mass-storage-gadget/README.md
... ... @@ -7,6 +7,21 @@ USB mass storage devices using the Linux gadget-fs drivers.
7 7 This allows Raspberry Pi Imager to be run on the host computer
8 8 and write OS images to the Compute Module block devices.
9 9  
  10 +## Running
  11 +To run load the USB MSD device drivers via RPIBOOT run
  12 +```bash
  13 +cd mass-storage-gadget
  14 +../rpiboot -d .
  15 +
  16 +```
  17 +N.B. This takes a few seconds longer to initialise than the
  18 +previous mass storage implementation. However, the write speed
  19 +should be much faster now that all of the file-system code
  20 +is running on the ARM processors.
  21 +
  22 +### Debug
  23 +The mass-storage-gadget image automatically enables a UART console for debugging (user `root` empty password).
  24 +
10 25 ## secure-boot
11 26 If secure-boot mode has been locked (via OTP) then both the
12 27 bootloader and rpiboot `bootcode4.bin` will only load `boot.img`
... ... @@ -25,24 +40,6 @@ KEY_FILE=$HOME/private.pem
25 40 ../tools/rpi-eeprom-digest -i boot.img -o boot.sig -k "${KEY_FILE}"
26 41 ```
27 42  
28   -## Running
29   -To run load the USB MSD device drivers via RPIBOOT run
30   -```bash
31   -../rpiboot -d .
32   -```
33   -
34   -The activity LED will flash three times once the USB MSD
35   -devices have been initialised. A message will also be printed
36   -to the HDMI console.
37   -
38   -The UART console is also enabled (user 'root' no password)
39   -so that the user can login and debug the Compute Module.
40   -
41   -N.B. This takes a few seconds longer to initialise than the
42   -previous mass storage implementation. However, the write speed
43   -should be much faster now that all of the file-system code
44   -is running on the ARM processors.
45   -
46 43 ## Source code
47 44 The buildroot configuration and supporting patches is available on
48 45 the [mass-storage-gadget](https://github.com/raspberrypi/buildroot/tree/mass-storage-gadget)
... ... @@ -58,18 +55,3 @@ make
58 55  
59 56 The output is written to `output/target/images/sdcard.img` and can be copied
60 57 to `boot.img`
61   -
62   -Optional:
63   -Load time can be reduced by optmizing the size of the sdcard.img as
64   -follows (run as root).
65   -
66   -```bash
67   -mkdir -p source-files
68   -kpartx -av sdcard.img
69   -mount /dev/mapper/loop0p1 source-files/
70   -usbboot/tools/make-boot-image -d source-files/ -o boot.img
71   -umount source-files
72   -kpartx -dv sdcard.img
73   -dmsetup remove /dev/mapper/loop0p1
74   -losetup -D
75   -```
... ...
secure-boot-example/README.md
1 1 # Secure Boot Quickstart
2 2  
3 3 ## Overview
4   -Secure boot is a mechanism for verifying the integrity of the kernel image and
  4 +Secure boot is a mechanism for verifying the integrity of the kernel+initramfs and
5 5 other files required during boot by storing them in a signed ramdisk image.
6 6 These files include the GPU firmware (start.elf etc), kernel, initrd, Device Tree
7 7 and overlays.
  8 +
8 9 Secure boot does not depend on a particular OS, nor does it provide services
9   -to the OS after startup. However, since secure boot will only load trusted
10   -kernel and initrd images, the kernel/initrd can safely verify or mount an
11   -an encrypted file system e.g. by using a TPM.
  10 +to the OS after the Kernel + initramfs has started.
12 11  
13 12 N.B. The memory for the secure ramdisk is reclaimed as soon as the CPU is started.
14 13  
... ... @@ -100,7 +99,7 @@ cd ..
100 99 ./rpiboot -d secure-boot-recovery
101 100 ```
102 101  
103   -At this stage OTP has not been modified and the signed image requirement can be reverted by flashing a default, unsigned image.
  102 +At this stage OTP has not been modified and the signed image requirement can be reverted by flashing a default, unsigned image.
104 103 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 104  
106 105  
... ... @@ -123,9 +122,9 @@ load the OS.
123 122 This example OS image is minimal Linux ramdisk image. Login as `root` with the empty password.
124 123  
125 124 ### Mount the CM4 SD/EMMC after enabling secure-boot
126   -Now that `SIGNED_BOOT` is enabled the bootloader will only load images signed with private key generated earlier.
127   -To boot the Compute Module in mass storage mode a signed version of this code must be generated.
128   -
  125 +Now that `SIGNED_BOOT` is enabled the bootloader will only load images signed with private key generated earlier.
  126 +To boot the Compute Module in mass storage mode a signed version of this code must be generated.
  127 +
129 128 **This signed image should not be made available for download because it gives access to the EMMC as a block device.**
130 129  
131 130  
... ... @@ -155,4 +154,3 @@ For example:
155 154 * The system should now boot into the OS.
156 155  
157 156 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   -
... ...