[U-Boot] Unable to boot the new FIT image
Simon Glass
sjg at chromium.org
Tue Jun 3 06:46:44 CEST 2014
Hi Harsha,
On 31 May 2014 07:45, Harsha Kiran <harshakiran443 at gmail.com> wrote:
> Hi Simon,
>
> I started working on the secure u-boot loading the FIT images and there are
> some of the issues i observed.
>
> I took the latest U-Boot 2014.07-rc2 and applied the below mentioned
> patches..
>
> (..http://patchwork.ozlabs.org/patch/339609/)
> (..http://patchwork.ozlabs.org/patch/339610/)
> (..http://patchwork.ozlabs.org/patch/339611/) I had to do a work around to
> apply this patch. if i apply the patched directly to the latest u-boot it
> failed in the fit_image.c file.
> I searched online and found fit_image.c from
> (..https://kernel.googlesource.com/pub/scm/linux/kernel/git/maz/u-boot/+/eb63218b9b95a59baa8b241f3a88e4415dabf833/tools/fit_image.c)
> and applied the patch and it was perfect.
> Then i applied http://patchwork.ozlabs.org/patch/350541/
>
> With these patches and removing CONFIG_OF_CONTROL in am335x_evm.h, i was
> able to load my FIT image successfully. if i include CONFIG_OF_CONTROL, i
> get the following error
> No valid FDT found - please append one to U-Boot binary, use u-boot-dtb.bin
> or define CONFIG_OF_EMBED. For sandbox, use -d <file.dtb> ### ERROR ###
> Please RESET the board ###.
This is likely another missing patch.
I just sent out a new series (available in u-boot-x86.git branch
'bone') which adds some step-by-step documentation. It also collects
all the fixes in one place.
>
> Now for the secure u-boot i added the CONFIG_FIT_SIGNATURE and CONFIG_RSA. i
> modified the doc/uImage.FIT/kernel_fdt.its file to include the signature
> content.
> Here is the file..
>
> /*
> * Simple U-boot uImage source file containing a single kernel and FDT blob
> */
>
> /*
> * Simple U-boot uImage source file containing a single kernel and FDT blob
> */
>
> /dts-v1/;
>
> / {
> description = "Simple image with single Linux kernel and FDT blob";
> #address-cells = <1>;
>
> images {
> kernel at 1 {
> description = "3.12 Kernel RT";
> data = /incbin/("./zImage");
> type = "kernel";
> arch = "arm";
> os = "linux";
> compression = "none";
> load = <0x80008000>;
> entry = <0x80008000>;
> hash at 1 {
> algo = "sha1";
> };
> signature at 1 {
> algo = "sha1,rsa2048";
> key-name-hint = "dev";
> };
> };
> fdt at 1 {
> description = "Flattened Device Tree blob";
> data = /incbin/("./am335x-evmsk.dtb");
> type = "flat_dt";
> arch = "arm";
> compression = "none";
> hash at 1 {
> algo = "sha1";
> };
> signature at 1 {
> algo = "sha1,rsa2048";
> key-name-hint = "dev";
> };
> };
> };
>
> configurations {
> default = "conf at 1";
> conf at 1 {
> description = "Boot Linux kernel with FDT blob";
> kernel = "kernel at 1";
> fdt = "fdt at 1";
> };
> };
> };
>
> Then, i signed my images with the keys generated from openssl,
>
>
> DTC_OPS="-I dts -O dtb -p 2000"
> sudo mkimage -D "${DTC_OPS}" -f kernel_fdt.its -k dev-keys -K
> u-boot-pubkey.dtb -r kernel_fdt.itb
>
> build the u-boot again with the signed binary..
>
> harsha at harshakiran_kasha:/abb/Experiment_Secure/u-boot$ sudo make ARCH=arm
> CROSS_COMPILE=/abb/compilers/gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/bin/arm-linux-gnueabihf-
> -j8 DEV_TREE_BIN=./u-boot-pubkey.dtb
>
>
> Now, while booting, i was able to load the u-boot-dtb.bin file from the
> u-boot prompt and it loaded the FIT image.
>
> U-Boot# fatload mmc 0 0x82000000 u-boot-dtb.bin
> reading u-boot-dtb.bin
> 466611 bytes read in 36 ms (12.4 MiB/s)
> U-Boot# go 0x82000000
> ## Starting application at 0x82000000 ...
>
>
> U-Boot 2014.07-rc2 (May 31 2014 - 02:16:18)
>
> I2C: ready
> DRAM: 256 MiB
> NAND: 0 MiB
> MMC: OMAP SD/MMC: 0, OMAP SD/MMC: 1
> *** Warning - readenv() failed, using default environment
>
> Net: <ethaddr> not set. Validating first E-fuse MAC
> cpsw, usb_ether
> Hit any key to stop autoboot: 0
> mmc0 is current device
> SD/MMC found on device 0
> reading uEnv.txt
> 2481 bytes read in 7 ms (345.7 KiB/s)
> Loaded environment from uEnv.txt
> Importing environment from mmc ...
> Running uenvcmd ...
> reading kernel_fdt.itb
> 4157190 bytes read in 267 ms (14.8 MiB/s)
> ## Loading kernel from FIT Image at 82000000 ...
> Using 'conf at 1' configuration
> Verifying Hash Integrity ... OK
> Trying 'kernel at 1' kernel subimage
> Description: 3.12 Kernel RT
> Type: Kernel Image
> Compression: uncompressed
> Data Start: 0x820000e4
> Data Size: 4117728 Bytes = 3.9 MiB
> Architecture: ARM
> OS: Linux
> Load Address: 0x80008000
> Entry Point: 0x80008000
> Hash algo: sha1
> Hash value: 3d72bc90b8afb5464cb03de2952d1bba90cd542e
> Sign algo: sha1,rsa2048:dev
> Sign value: unavailable
> Verifying Hash Integrity ... sha1+ sha1,rsa2048:dev- OK
> ## Loading fdt from FIT Image at 82000000 ...
> Using 'conf at 1' configuration
> Trying 'fdt at 1' fdt subimage
> Description: Flattened Device Tree blob
> Type: Flat Device Tree
> Compression: uncompressed
> Data Start: 0x823ed6f8
> Data Size: 38048 Bytes = 37.2 KiB
> Architecture: ARM
> Hash algo: sha1
> Hash value: 01d8a7481ac4ae281e68383776287a94bd5f2d78
> Sign algo: sha1,rsa2048:dev
> Sign value: unavailable
> Verifying Hash Integrity ... sha1+ sha1,rsa2048:dev- OK
> Booting using the fdt blob at 0x823ed6f8
> Loading Kernel Image ... OK
> Loading Device Tree to 8f611000, end 8f61d49f ... OK
>
> Starting kernel ...
>
I worry that you are loading a zImage to 80008000 which is the
intended load address of the kernel itself. Does the zImage wrapper
handle that?
In my example, I use the Image rather than zImage, so that U-Boot can
decompress it.
>
> it says that the hash integrity is verified but when i tried with an
> unsigned kernel_fdt.bin with signed u-boot-dtb.bin i was still able to load
> the FIT and the logs are the same.
Yes but you didn't use the -r flag for mkimage, so the verification is optional.
> I not really sure if the veification part is done correctly. Am i following
> the correct procedure or missing something??
Mostly I think. See my documentation in the series mentioned above -
hopefully it will help.
Regards,
Simon
More information about the U-Boot
mailing list