common: android: simplify image verify/un-verify

Support hash verify if header version < 3.

Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
Change-Id: I2ade1a50aa26cd94c4464c25c86836421d973f00
This commit is contained in:
Joseph Chen 2020-10-30 16:23:01 +08:00
parent 507e69009b
commit cc0848dfb9
1 changed files with 67 additions and 64 deletions

View File

@ -477,6 +477,29 @@ crypto_calc:
return 0; return 0;
} }
static int images_load_verify(struct andr_img_hdr *hdr, ulong part_start,
void *ram_base, struct udevice *crypto)
{
/* load, never change order ! */
if (image_load(IMG_KERNEL, hdr, part_start, ram_base, crypto))
return -1;
if (image_load(IMG_RAMDISK, hdr, part_start, ram_base, crypto))
return -1;
if (image_load(IMG_SECOND, hdr, part_start, ram_base, crypto))
return -1;
if (hdr->header_version > 0) {
if (image_load(IMG_RECOVERY_DTBO, hdr, part_start,
ram_base, crypto))
return -1;
}
if (hdr->header_version > 1) {
if (image_load(IMG_DTB, hdr, part_start, ram_base, crypto))
return -1;
}
return 0;
}
/* /*
* @ram_base: !NULL means require memcpy for an exist full android image. * @ram_base: !NULL means require memcpy for an exist full android image.
*/ */
@ -486,6 +509,7 @@ static int android_image_separate(struct andr_img_hdr *hdr,
void *ram_base) void *ram_base)
{ {
ulong bstart; ulong bstart;
int ret;
if (android_image_check_header(hdr)) { if (android_image_check_header(hdr)) {
printf("Bad android image header\n"); printf("Bad android image header\n");
@ -500,7 +524,13 @@ static int android_image_separate(struct andr_img_hdr *hdr,
* 1. Load images to their individual target ram position * 1. Load images to their individual target ram position
* in order to disable fdt/ramdisk relocation. * in order to disable fdt/ramdisk relocation.
*/ */
/* load rk-kernel.dtb alone */
if (image_load(IMG_RK_DTB, hdr, bstart, ram_base, NULL))
return -1;
#if defined(CONFIG_DM_CRYPTO) && defined(CONFIG_ANDROID_BOOT_IMAGE_HASH) #if defined(CONFIG_DM_CRYPTO) && defined(CONFIG_ANDROID_BOOT_IMAGE_HASH)
if (hdr->header_version < 3) {
struct udevice *dev; struct udevice *dev;
sha_context ctx; sha_context ctx;
uchar hash[20]; uchar hash[20];
@ -509,7 +539,7 @@ static int android_image_separate(struct andr_img_hdr *hdr,
ctx.algo = CRYPTO_SHA1; ctx.algo = CRYPTO_SHA1;
dev = crypto_get_device(ctx.algo); dev = crypto_get_device(ctx.algo);
if (!dev) { if (!dev) {
printf("Can't find crypto device for SHA1 capability\n"); printf("Can't find crypto device for SHA1\n");
return -ENODEV; return -ENODEV;
} }
@ -523,53 +553,26 @@ static int android_image_separate(struct andr_img_hdr *hdr,
if (hdr->header_version > 1) if (hdr->header_version > 1)
ctx.length += hdr->dtb_size + sizeof(hdr->dtb_size); ctx.length += hdr->dtb_size + sizeof(hdr->dtb_size);
/* load, never change order ! */
if (image_load(IMG_RK_DTB, hdr, bstart, ram_base, NULL))
return -1;
crypto_sha_init(dev, &ctx); crypto_sha_init(dev, &ctx);
if (image_load(IMG_KERNEL, hdr, bstart, ram_base, dev)) ret = images_load_verify(hdr, bstart, ram_base, dev);
return -1; if (ret)
if (image_load(IMG_RAMDISK, hdr, bstart, ram_base, dev)) return ret;
return -1;
if (image_load(IMG_SECOND, hdr, bstart, ram_base, dev))
return -1;
if (hdr->header_version > 0) {
if (image_load(IMG_RECOVERY_DTBO, hdr, bstart, ram_base, dev))
return -1;
}
if (hdr->header_version > 1) {
if (image_load(IMG_DTB, hdr, bstart, ram_base, dev))
return -1;
}
crypto_sha_final(dev, &ctx, hash); crypto_sha_final(dev, &ctx, hash);
if (memcmp(hash, hdr->id, 20)) { if (memcmp(hash, hdr->id, 20)) {
print_hash("Hash from header", (u8 *)hdr->id, 20); print_hash("Hash from header", (u8 *)hdr->id, 20);
print_hash("Hash real", (u8 *)hash, 20); print_hash("Hash real", (u8 *)hash, 20);
return -EBADFD; return -EBADFD;
} else { } else {
printf("Image hash OK\n"); printf("ANDROID: Hash OK\n");
}
#else /* !(CONFIG_DM_CRYPTO && CONFIG_ANDROID_BOOT_IMAGE_HASH) */
if (image_load(IMG_RK_DTB, hdr, bstart, ram_base, NULL))
return -1;
if (image_load(IMG_KERNEL, hdr, bstart, ram_base, NULL))
return -1;
if (image_load(IMG_RAMDISK, hdr, bstart, ram_base, NULL))
return -1;
if (image_load(IMG_SECOND, hdr, bstart, ram_base, NULL))
return -1;
if (hdr->header_version > 0) {
if (image_load(IMG_RECOVERY_DTBO, hdr, bstart, ram_base, NULL))
return -1;
}
if (hdr->header_version > 1) {
if (image_load(IMG_DTB, hdr, bstart, ram_base, NULL))
return -1;
} }
} else
#endif #endif
{
ret = images_load_verify(hdr, bstart, ram_base, NULL);
if (ret)
return ret;
}
/* 2. Disable fdt/ramdisk relocation, it saves boot time */ /* 2. Disable fdt/ramdisk relocation, it saves boot time */
env_set("bootm-no-reloc", "y"); env_set("bootm-no-reloc", "y");