doc: update UEFI document for usage of mkeficapsule

Now we can use mkeficapsule command instead of EDK-II's script
to create a signed capsule file. So update the instruction for
capsule authentication.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
AKASHI Takahiro 2022-02-09 19:10:37 +09:00 committed by Heinrich Schuchardt
parent 118a0ecd6d
commit a62eb06f7c

View File

@ -284,37 +284,56 @@ Support has been added for the UEFI capsule update feature which
enables updating the U-Boot image using the UEFI firmware management
protocol (FMP). The capsules are not passed to the firmware through
the UpdateCapsule runtime service. Instead, capsule-on-disk
functionality is used for fetching the capsule from the EFI System
Partition (ESP) by placing the capsule file under the
\EFI\UpdateCapsule directory.
functionality is used for fetching capsules from the EFI System
Partition (ESP) by placing capsule files under the directory::
The directory \EFI\UpdateCapsule is checked for capsules only within the
EFI system partition on the device specified in the active boot option
determined by reference to BootNext variable or BootOrder variable processing.
The active Boot Variable is the variable with highest priority BootNext or
within BootOrder that refers to a device found to be present. Boot variables
in BootOrder but referring to devices not present are ignored when determining
active boot variable.
Before starting a capsule update make sure your capsules are installed in the
correct ESP partition or set BootNext.
\EFI\UpdateCapsule
The directory is checked for capsules only within the
EFI system partition on the device specified in the active boot option,
which is determined by BootXXXX variable in BootNext, or if not, the highest
priority one within BootOrder. Any BootXXXX variables referring to devices
not present are ignored when determining the active boot option.
Please note that capsules will be applied in the alphabetic order of
capsule file names.
Creating a capsule file
***********************
A capsule file can be created by using tools/mkeficapsule.
To build this tool, enable::
CONFIG_TOOLS_MKEFICAPSULE=y
CONFIG_TOOLS_LIBCRYPTO=y
Run the following command
.. code-block:: console
$ mkeficapsule \
--index 1 --instance 0 \
[--fit <FIT image> | --raw <raw image>] \
<capsule_file_name>
Performing the update
*********************
Since U-boot doesn't currently support SetVariable at runtime there's a Kconfig
option (CONFIG_EFI_IGNORE_OSINDICATIONS) to disable the OsIndications variable
check. If that option is enabled just copy your capsule to \EFI\UpdateCapsule.
Put capsule files under the directory mentioned above.
Then, following the UEFI specification, you'll need to set
the EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED
bit in OsIndications variable with
If that option is disabled, you'll need to set the OsIndications variable with::
.. code-block:: console
=> setenv -e -nv -bs -rt -v OsIndications =0x04
Finally, the capsule update can be initiated either by rebooting the board,
which is the preferred method, or by issuing the following command::
Since U-boot doesn't currently support SetVariable at runtime, its value
won't be taken over across the reboot. If this is the case, you can skip
this feature check with the Kconfig option (CONFIG_EFI_IGNORE_OSINDICATIONS)
set.
=> efidebug capsule disk-update
**The efidebug command is should only be used during debugging/development.**
Finally, the capsule update can be initiated by rebooting the board.
Enabling Capsule Authentication
*******************************
@ -324,82 +343,64 @@ be updated by verifying the capsule signature. The capsule signature
is computed and prepended to the capsule payload at the time of
capsule generation. This signature is then verified by using the
public key stored as part of the X509 certificate. This certificate is
in the form of an efi signature list (esl) file, which is embedded as
part of U-Boot.
in the form of an efi signature list (esl) file, which is embedded in
a device tree.
The capsule authentication feature can be enabled through the
following config, in addition to the configs listed above for capsule
update::
CONFIG_EFI_CAPSULE_AUTHENTICATE=y
CONFIG_EFI_CAPSULE_KEY_PATH=<path to .esl cert>
The public and private keys used for the signing process are generated
and used by the steps highlighted below::
and used by the steps highlighted below.
1. Install utility commands on your host
* OPENSSL
1. Install utility commands on your host
* openssl
* efitools
2. Create signing keys and certificate files on your host
2. Create signing keys and certificate files on your host
$ openssl req -x509 -sha256 -newkey rsa:2048 -subj /CN=CRT/ \
-keyout CRT.key -out CRT.crt -nodes -days 365
$ cert-to-efi-sig-list CRT.crt CRT.esl
.. code-block:: console
$ openssl x509 -in CRT.crt -out CRT.cer -outform DER
$ openssl x509 -inform DER -in CRT.cer -outform PEM -out CRT.pub.pem
$ openssl req -x509 -sha256 -newkey rsa:2048 -subj /CN=CRT/ \
-keyout CRT.key -out CRT.crt -nodes -days 365
$ cert-to-efi-sig-list CRT.crt CRT.esl
$ openssl pkcs12 -export -out CRT.pfx -inkey CRT.key -in CRT.crt
$ openssl pkcs12 -in CRT.pfx -nodes -out CRT.pem
3. Run the following command to create and sign the capsule file
The capsule file can be generated by using the GenerateCapsule.py
script in EDKII::
.. code-block:: console
$ ./BaseTools/BinWrappers/PosixLike/GenerateCapsule -e -o \
<capsule_file_name> --monotonic-count <val> --fw-version \
<val> --lsv <val> --guid \
e2bb9c06-70e9-4b14-97a3-5a7913176e3f --verbose \
--update-image-index <val> --signer-private-cert \
/path/to/CRT.pem --trusted-public-cert \
/path/to/CRT.pub.pem --other-public-cert /path/to/CRT.pub.pem \
<u-boot.bin>
$ mkeficapsule --monotonic-count 1 \
--private-key CRT.key \
--certificate CRT.crt \
--index 1 --instance 0 \
[--fit <FIT image> | --raw <raw image>] \
<capsule_file_name>
Place the capsule generated in the above step on the EFI System
Partition under the EFI/UpdateCapsule directory
4. Insert the signature list into a device tree in the following format::
Testing on QEMU
***************
{
signature {
capsule-key = [ <binary of signature list> ];
}
...
}
Currently, support has been added on the QEMU ARM64 virt platform for
updating the U-Boot binary as a raw image when the platform is booted
in non-secure mode, i.e. with CONFIG_TFABOOT disabled. For this
configuration, the QEMU platform needs to be booted with
'secure=off'. The U-Boot binary placed on the first bank of the NOR
flash at offset 0x0. The U-Boot environment is placed on the second
NOR flash bank at offset 0x4000000.
You can do step-4 manually with
The capsule update feature is enabled with the following configuration
settings::
.. code-block:: console
CONFIG_MTD=y
CONFIG_FLASH_CFI_MTD=y
CONFIG_CMD_MTDPARTS=y
CONFIG_CMD_DFU=y
CONFIG_DFU_MTD=y
CONFIG_PCI_INIT_R=y
CONFIG_EFI_CAPSULE_ON_DISK=y
CONFIG_EFI_CAPSULE_FIRMWARE_MANAGEMENT=y
CONFIG_EFI_CAPSULE_FIRMWARE=y
CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y
$ dtc -@ -I dts -O dtb -o signature.dtbo signature.dts
$ fdtoverlay -i orig.dtb -o new.dtb -v signature.dtbo
In addition, the following config needs to be disabled(QEMU ARM specific)::
where signature.dts looks like::
CONFIG_TFABOOT
The capsule file can be generated by using the tools/mkeficapsule::
$ mkeficapsule --raw <u-boot.bin> --index 1 <capsule_file_name>
&{/} {
signature {
capsule-key = /incbin/("CRT.esl");
};
};
Executing the boot manager
~~~~~~~~~~~~~~~~~~~~~~~~~~