|
@@ -290,6 +290,33 @@ static uint8_t image_checksum8(void *start, uint32_t len)
|
|
|
return csum;
|
|
|
}
|
|
|
|
|
|
+size_t kwbimage_header_size(unsigned char *ptr)
|
|
|
+{
|
|
|
+ if (image_version((void *)ptr) == 0)
|
|
|
+ return sizeof(struct main_hdr_v0);
|
|
|
+ else
|
|
|
+ return KWBHEADER_V1_SIZE((struct main_hdr_v1 *)ptr);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Verify checksum over a complete header that includes the checksum field.
|
|
|
+ * Return 1 when OK, otherwise 0.
|
|
|
+ */
|
|
|
+static int main_hdr_checksum_ok(void *hdr)
|
|
|
+{
|
|
|
+ /* Offsets of checksum in v0 and v1 headers are the same */
|
|
|
+ struct main_hdr_v0 *main_hdr = (struct main_hdr_v0 *)hdr;
|
|
|
+ uint8_t checksum;
|
|
|
+
|
|
|
+ checksum = image_checksum8(hdr, kwbimage_header_size(hdr));
|
|
|
+ /* Calculated checksum includes the header checksum field. Compensate
|
|
|
+ * for that.
|
|
|
+ */
|
|
|
+ checksum -= main_hdr->checksum;
|
|
|
+
|
|
|
+ return checksum == main_hdr->checksum;
|
|
|
+}
|
|
|
+
|
|
|
static uint32_t image_checksum32(void *start, uint32_t len)
|
|
|
{
|
|
|
uint32_t csum = 0;
|
|
@@ -1587,14 +1614,9 @@ static int kwbimage_check_image_types(uint8_t type)
|
|
|
static int kwbimage_verify_header(unsigned char *ptr, int image_size,
|
|
|
struct image_tool_params *params)
|
|
|
{
|
|
|
- struct main_hdr_v0 *main_hdr;
|
|
|
uint8_t checksum;
|
|
|
|
|
|
- main_hdr = (struct main_hdr_v0 *)ptr;
|
|
|
- checksum = image_checksum8(ptr,
|
|
|
- sizeof(struct main_hdr_v0)
|
|
|
- - sizeof(uint8_t));
|
|
|
- if (checksum != main_hdr->checksum)
|
|
|
+ if (!main_hdr_checksum_ok(ptr))
|
|
|
return -FDT_ERR_BADSTRUCTURE;
|
|
|
|
|
|
/* Only version 0 extended header has checksum */
|