summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Ji <ji.luo@nxp.com>2018-07-20 10:23:17 +0800
committerNeal Ostrem <nealo@google.com>2018-07-31 01:09:33 +0000
commit88a74bf624f8872e34a1e5873c9e6c92fbdfff5a (patch)
tree44e17b4fcabbcecb121cd10324766b8982bccba6
parent239efa63ab18740b56f776e744cd01ac7171299d (diff)
downloaduboot-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-xdrivers/usb/gadget/f_fastboot.c102
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;