[PATCH RFC 1/9] tools: mkimage: Add Amlogic Boot Image type
Ferass El Hafidi
funderscore at postmarketos.org
Wed Sep 10 21:55:56 CEST 2025
On Wed Sep 10, 2025 at 7:36 PM UTC, Heinrich Schuchardt wrote:
> <...>
>> +static void amlimage_print_header(const void *buf,
>> + struct image_tool_params *params)
>> +{
>> + const struct amlimage_header *hdr = buf + HEADER_OFFSET;
>> + uint8_t digest[SHA256_SUM_LEN];
>> + sha256_context ctx;
>> + bool valid;
>> +
>> + printf("Amlogic Boot Image %" PRIu8 ".%" PRIu8 "\n",
>> + hdr->version_major, hdr->version_minor);
>> + printf("Total size: %" PRIu32 "\n", hdr->total_size);
>> + printf("Digest %" PRIu32 ": %" PRIu32 " @ 0x%" PRIx32 "\n",
>> + hdr->digest_type, hdr->digest_size, hdr->digest_offset);
>> + printf("Key %" PRIu32 ": %" PRIu32 " @ 0x%" PRIx32 "\n",
>> + hdr->key_type, hdr->key_size, hdr->key_offset);
>> + printf("Payload %" PRIu32 ": %" PRIu32 " @ 0x%" PRIx32 "\n",
>> + hdr->payload_type, hdr->payload_size, hdr->payload_offset);
>> +
>> + sha256_starts(&ctx);
>
> Please, check the digest type before possibly calculating the wrong digest.
>
As far as I know only 2 digest types are possible, from looking quickly at the
bootROM dump I have:
* SHA256 checksum = normal boot
* RSA signature = secure boot
Secure boot is explicitely not supported in amlimage right now.
>> + /* Header and data is used as input for sha256 digest */
>> + sha256_update(&ctx, (void *)hdr, hdr->header_size);
>> + sha256_update(&ctx, (void *)hdr + hdr->data_offset, hdr->data_size);
>> + sha256_finish(&ctx, digest);
>> +
>> + valid = !memcmp((void *)hdr + hdr->digest_offset,
>> + digest, SHA256_SUM_LEN);
>
> Shouldn't the SHA256 check be in amlimage_verify_header()?
>
>> +
>> + printf("Data: %" PRIu32 " @ 0x%" PRIx32 " - %s\n",
>> + hdr->data_size, hdr->data_offset, valid ? "OK" : "BAD");
>> +}
>> +
>> +static void amlimage_set_header(void *buf, struct stat *sbuf, int ifd,
>> + struct image_tool_params *params)
>> +{
>> + struct amlimage_header *hdr = buf + HEADER_OFFSET;
>> + sha256_context ctx;
>> +
>> + /* Use header size as initial size */
>> + hdr->total_size = hdr->header_size;
>> +
>> + /* Use sha256 digest (normal boot) */
>> + hdr->digest_type = 0;
>> + /* The sha256 digest is stored directly following the header */
>> + hdr->digest_offset = hdr->total_size;
>> + /* Unknown if this is used as block size instead of digest size */
>> + hdr->digest_size = 512;
>
> Isn't this simply the SHA512 digest size?
>
As written above, SHA512 does not seem to be supported in the BootROM.
>> + hdr->total_size += hdr->digest_size;
>> +
>> + /* Use key as padding so that payload ends up 4K aligned in TZRAM */
>> + hdr->key_type = 0;
>> + hdr->key_offset = hdr->total_size;
>> + hdr->key_size = PAYLOAD_OFFSET - HEADER_OFFSET - hdr->key_offset;
>> + hdr->total_size += hdr->key_size;
>> +
>> + /* With padding above payload will have a 0x1000 offset in TZRAM */
>> + hdr->payload_type = 0;
>> + hdr->payload_offset = hdr->total_size;
>> + /* Payload size has already been copied from the variant header */
>> + hdr->total_size += hdr->payload_size;
>> +
>> + /* Set the data range to be used as input for sha256 digest */
>> + hdr->data_offset = hdr->digest_offset + SHA256_SUM_LEN;
>> + hdr->data_size = hdr->total_size - hdr->data_offset;
>> +
>> + sha256_starts(&ctx);
>> + /* Header and data is used as input for sha256 digest */
>> + sha256_update(&ctx, (void *)hdr, hdr->header_size);
>> + sha256_update(&ctx, (void *)hdr + hdr->data_offset, hdr->data_size);
>> + /* Write sha256 digest to the 32 bytes directly following the header */
>> + sha256_finish(&ctx, (void *)hdr + hdr->digest_offset);
>> +}
>> +
>> +static int amlimage_extract_subimage(void *buf,
>> + struct image_tool_params *params)
>> +{
>> + const struct amlimage_header *hdr = buf + HEADER_OFFSET;
>> +
>> + /* Save payload as the subimage */
>> + return imagetool_save_subimage(params->outfile,
>> + (ulong)hdr + hdr->payload_offset,
>> + hdr->payload_size);
>> +}
>> +
>> +static int amlimage_check_image_type(uint8_t type)
>> +{
>> + if (type == IH_TYPE_AMLIMAGE)
>> + return EXIT_SUCCESS;
>
> The image variant should either be checked here or in verify header.
>
> Best regards
>
> Heinrich
>
Thanks.
More information about the U-Boot
mailing list