diff options
author | Luo Ji <ji.luo@nxp.com> | 2018-07-20 10:23:17 +0800 |
---|---|---|
committer | Neal Ostrem <nealo@google.com> | 2018-07-31 01:09:33 +0000 |
commit | 88a74bf624f8872e34a1e5873c9e6c92fbdfff5a (patch) | |
tree | 44e17b4fcabbcecb121cd10324766b8982bccba6 | |
parent | 239efa63ab18740b56f776e744cd01ac7171299d (diff) | |
download | uboot-imx-88a74bf624f8872e34a1e5873c9e6c92fbdfff5a.tar.gz |
Add AVB verify for oem_bootloader
The oem_bootloader partition is critical and should be verified. All
necessary verify data has been added (hash footer in oem_bootloader
and descriptors in vbmeta), verify the oem_bootloader by libavb at
u-boot stage.
Since the oem_bootloader will be loaded by libavb, use it directly
instead of loading it from disk again.
Test: oem_bootloader verify ok and boot ok for both imx7d and imx8m.
Change-Id: Ic37d2555f800385a982f6664b3858b9c83b9c484
Signed-off-by: Luo Ji <ji.luo@nxp.com>
-rwxr-xr-x | drivers/usb/gadget/f_fastboot.c | 102 |
1 files changed, 50 insertions, 52 deletions
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index 346114a94b..079faef3b0 100755 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c @@ -108,10 +108,6 @@ static unsigned int download_bytes; static bool is_recovery_mode; #endif -#define AT_OEM_BL_PART_NAME_BASE "oem_bootloader" -#define AT_OEM_BL_PART_SIZE (sizeof(AT_OEM_BL_PART_NAME_BASE) + \ - sizeof("_a") - 1) - /* Offset (in u32's) of start and end fields in the zImage header. */ #define ZIMAGE_START_ADDR 10 #define ZIMAGE_END_ADDR 11 @@ -1605,7 +1601,30 @@ void trusty_setbootparameter(struct andr_img_hdr *hdr, AvbABFlowResult avb_resul #if defined(CONFIG_AVB_SUPPORT) && defined(CONFIG_MMC) /* we can use avb to verify Trusty if we want */ -const char *requested_partitions[] = {"boot", 0}; +const char *requested_partitions[] = {"boot", "oem_bootloader", NULL}; + +static int find_partition_data_by_name(char* part_name, + AvbSlotVerifyData* avb_out_data, AvbPartitionData** avb_loadpart) +{ + int num = 0; + AvbPartitionData* loadpart = NULL; + + for (num = 0; num < avb_out_data->num_loaded_partitions; num++) { + loadpart = &(avb_out_data->loaded_partitions[num]); + if (!(strncmp(loadpart->partition_name, + part_name, strlen(part_name)))) { + *avb_loadpart = loadpart; + break; + } + } + if (num == avb_out_data->num_loaded_partitions) { + printf("Error! Can't find %s partition from avb partition data!\n", + part_name); + return -1; + } + else + return 0; +} int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { @@ -1615,11 +1634,10 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { ulong image_size; u32 avb_metric; bool check_image_arm64 = false; - char *slot = NULL; AvbABFlowResult avb_result; - AvbSlotVerifyData *avb_out_data; - AvbPartitionData *avb_loadpart; + AvbSlotVerifyData *avb_out_data = NULL; + AvbPartitionData *avb_loadpart = NULL; /* check lock state */ FbLockState lock_status = fastboot_get_lock_stat(); @@ -1653,8 +1671,12 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { if ((avb_result == AVB_AB_FLOW_RESULT_OK) || (avb_result == AVB_AB_FLOW_RESULT_OK_WITH_VERIFICATION_ERROR)) { assert(avb_out_data != NULL); - /* load the first partition */ - avb_loadpart = avb_out_data->loaded_partitions; + /* We may have more than one partition loaded by AVB, find the boot + * partition first. + */ + if (find_partition_data_by_name("boot", avb_out_data, &avb_loadpart)) { + goto fail; + } assert(avb_loadpart != NULL); /* we should use avb_part_data->data as boot image */ /* boot image is already read by avb */ @@ -1663,7 +1685,6 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { printf("boota: bad boot image magic\n"); goto fail; } - slot = avb_out_data->ab_suffix; if (avb_result == AVB_AB_FLOW_RESULT_OK) printf(" verify OK, boot '%s%s'\n", avb_loadpart->partition_name, avb_out_data->ab_suffix); @@ -1717,53 +1738,30 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { #endif #ifdef CONFIG_OF_LIBFDT - u32 fdt_size = 0; - char oemimage[AT_OEM_BL_PART_SIZE]; - snprintf(oemimage, sizeof(oemimage), "%s%s", - AT_OEM_BL_PART_NAME_BASE, slot); - - struct dt_table_header dt_img; - size_t num_read; - if (fsl_avb_ops.read_from_partition(&fsl_avb_ops, oemimage, 0, - sizeof(dt_img), &dt_img, &num_read) != - AVB_IO_RESULT_OK && - num_read != sizeof(dt_img)) { - printf("boota: read dt table header error\n"); - goto dt_read_done; + if (find_partition_data_by_name("oem_bootloader", + avb_out_data, &avb_loadpart)) { + goto fail; } - - if (be32_to_cpu(dt_img.magic) != DT_TABLE_MAGIC) { + struct dt_table_header *dt_img; + dt_img = (struct dt_table_header *)avb_loadpart->data; + if (be32_to_cpu(dt_img->magic) != DT_TABLE_MAGIC) { printf("boota: bad dt table magic %08x\n", - be32_to_cpu(dt_img.magic)); - goto dt_read_done; - } else if (!be32_to_cpu(dt_img.dt_entry_count)) { + be32_to_cpu(dt_img->magic)); + goto fail; + } else if (!be32_to_cpu(dt_img->dt_entry_count)) { printf("boota: no dt entries\n"); - goto dt_read_done; - } - - struct dt_table_entry dt_entry; - assert(be32_to_cpu(dt_img.dt_entry_size) == sizeof(dt_entry)); - if (fsl_avb_ops.read_from_partition(&fsl_avb_ops, oemimage, - be32_to_cpu(dt_img.dt_entries_offset), - be32_to_cpu(dt_img.dt_entry_size), &dt_entry, - &num_read) != AVB_IO_RESULT_OK && - num_read != sizeof(dt_entry)) { - printf("boota: read dt entry error\n"); - goto dt_read_done; - } - - /* Read the fdt from oem_bootloader into hdr->second_addr. */ - fdt_size = be32_to_cpu(dt_entry.dt_size); - if (fsl_avb_ops.read_from_partition(&fsl_avb_ops, oemimage, - be32_to_cpu(dt_entry.dt_offset), fdt_size, - (void *)hdr->second_addr, &num_read) != - AVB_IO_RESULT_OK && num_read != fdt_size) { - printf("boota: read fdt error\n"); + goto fail; } -dt_read_done: - ; + u32 fdt_size = 0; + struct dt_table_entry *dt_entry; + dt_entry = (struct dt_table_entry *)((ulong)dt_img + + be32_to_cpu(dt_img->dt_entries_offset)); + fdt_size = be32_to_cpu(dt_entry->dt_size); + memcpy((void *)(ulong)hdr->second_addr, (void *)((ulong)dt_img + + be32_to_cpu(dt_entry->dt_offset)), fdt_size); #endif /*CONFIG_OF_LIBFDT*/ + if (check_image_arm64) { android_image_get_kernel(hdrload, 0, NULL, NULL); addr = hdrload->kernel_addr; |