in tools/manifest_visualizer/manifest_visualizor.c [30:242]
int32_t visualize_pfm_v1 (uint8_t *pfm)
{
struct pfm_allowable_firmware_header *allowable_fw_header =
(struct pfm_allowable_firmware_header*) pfm;
uint8_t *pointer = ((uint8_t*) allowable_fw_header) +
sizeof (struct pfm_allowable_firmware_header);
printf ("pfm_allowable_firmware_header\n");
printf ("{");
printf ("\tlength: %i\n", allowable_fw_header->length);
printf ("\tfw_count: %i\n", allowable_fw_header->fw_count);
printf ("\treserved: %i\n", allowable_fw_header->reserved);
printf ("}\n");
printf ("Allowable Firmware\n");
printf ("[\n");
for (int i = 0; i < allowable_fw_header->fw_count; ++i) {
struct pfm_firmware_header *fw_header = (struct pfm_firmware_header*) pointer;
char *version_id = (char*) malloc (fw_header->version_length + 1);
if (version_id == NULL) {
printf ("Failed to allocate version id buffer.\n");
return -1;
}
strncpy (version_id, (char*) ((uint8_t*) fw_header + sizeof (struct pfm_firmware_header)),
fw_header->version_length);
version_id[fw_header->version_length] = '\0';
int alignment = fw_header->version_length % 4;
alignment = (alignment == 0) ? 0 : (4 - alignment);
pointer = (uint8_t*) fw_header + sizeof (struct pfm_firmware_header) +
fw_header->version_length + alignment;
printf ("\t{\n");
printf ("\t\tpfm_firmware_header\n");
printf ("\t\t{\n");
printf ("\t\t\tlength: %i\n", fw_header->length);
printf ("\t\t\tversion_length: %i\n", fw_header->version_length);
printf ("\t\t\tblank_byte: 0x%02x\n", fw_header->blank_byte);
printf ("\t\t\tversion_addr: 0x%x\n", fw_header->version_addr);
printf ("\t\t\timg_count: %i\n", fw_header->img_count);
printf ("\t\t\trw_count: %i\n", fw_header->rw_count);
printf ("\t\t\treserved: %i\n", fw_header->reserved);
printf ("\t\t}\n");
printf ("\t\tversion_id: %s\n", version_id);
free (version_id);
printf ("\t\tRW Regions\n");
printf ("\t\t[\n");
for (int j = 0; j < fw_header->rw_count; ++j) {
uint32_t start_addr = *((uint32_t*) pointer);
uint32_t end_addr = *((uint32_t*) pointer + 1);
pointer = (uint8_t*) ((uint32_t*) pointer + 2);
printf ("\t\t\t{\n");
printf ("\t\t\t\tpfm_flash_region\n");
printf ("\t\t\t\t{\n");
printf ("\t\t\t\t\tstart_addr: 0x%x\n", start_addr);
printf ("\t\t\t\t\tend_addr: 0x%x\n", end_addr);
printf ("\t\t\t\t}\n");
printf ("\t\t\t}\n");
}
printf ("\t\t]\n");
for (int j = 0; j < fw_header->img_count; ++j) {
struct pfm_image_header *img_header = (struct pfm_image_header*) pointer;
uint8_t *sig = malloc (img_header->sig_length);
if (sig == NULL) {
printf ("Failed to allocate signature buffer.\n");
return -1;
}
memcpy (sig, img_header + 1, img_header->sig_length);
pointer = (uint8_t*) img_header + sizeof (struct pfm_image_header) +
img_header->sig_length;
printf ("\t\tpfm_image_header\n");
printf ("\t\t{\n");
printf ("\t\t\tlength: %i\n", img_header->length);
printf ("\t\t\tflags: %i\n", img_header->flags);
printf ("\t\t\tkey_id: %i\n", img_header->key_id);
printf ("\t\t\tregion_count: %i\n", img_header->region_count);
printf ("\t\t\tsig_length: %i\n", img_header->sig_length);
printf ("\t\t}\n");
printf ("\t\tSignature:");
for (int k = 0; k < img_header->sig_length; ++k) {
if ((k % 32) == 0) {
printf ("\n\t\t\t");
}
printf ("%02x", sig[k]);
}
printf ("\n");
free (sig);
printf ("\t\tRO Regions\n");
printf ("\t\t[\n");
for (int k = 0; k < img_header->region_count; ++k) {
printf ("\t\t\t{\n");
uint32_t start_addr = *((uint32_t*) pointer);
uint32_t end_addr = *((uint32_t*) pointer + 1);
pointer = (uint8_t*) ((uint32_t*) pointer + 2);
printf ("\t\t\t\tpfm_flash_region\n");
printf ("\t\t\t\t{\n");
printf ("\t\t\t\t\tstart_addr: 0x%x\n", start_addr);
printf ("\t\t\t\t\tend_addr: 0x%x\n", end_addr);
printf ("\t\t\t\t}\n");
printf ("\t\t\t}\n");
}
printf ("\t\t]\n");
}
printf ("\t}\n");
}
printf ("]\n");
struct pfm_key_manifest_header *key_manifest_header = (struct pfm_key_manifest_header*) pointer;
pointer = (uint8_t*) pointer + sizeof (struct pfm_key_manifest_header);
printf ("pfm_key_manifest_header\n");
printf ("{\n");
printf ("\tlength: %i\n", key_manifest_header->length);
printf ("\tkey_count: %i\n", key_manifest_header->key_count);
printf ("\treserved: %i\n", key_manifest_header->reserved);
printf ("}\n");
printf ("Keys\n");
printf ("[\n");
for (int i = 0; i < key_manifest_header->key_count; ++i) {
struct pfm_public_key_header *key_header = (struct pfm_public_key_header*) pointer;
printf ("\t{\n");
printf ("\t\tpfm_key_manifest_header\n");
printf ("\t\tlength: %i\n", key_header->length);
printf ("\t\tkey_length: %i\n", key_header->key_length);
printf ("\t\tkey_exponent: 0x%x\n", key_header->key_exponent);
printf ("\t\tid: %i\n", key_header->id);
printf ("\t\treserved[0]: %i\n", key_header->reserved[0]);
printf ("\t\treserved[1]: %i\n", key_header->reserved[1]);
printf ("\t\treserved[2]: %i\n", key_header->reserved[2]);
uint8_t *modulus = (uint8_t*) malloc (key_header->key_length);
if (modulus == NULL) {
printf ("Failed to allocate modulus buffer.\n");
return -1;
}
memcpy (modulus, key_header + 1, key_header->key_length);
pointer = (uint8_t*) key_header + sizeof (struct pfm_public_key_header) +
key_header->key_length;
printf ("\t\tmodulus:");
for (int j = 0; j < key_header->key_length; ++j) {
if ((j % 32) == 0) {
printf ("\n\t\t\t");
}
printf ("%02x", modulus[j]);
}
printf ("\n");
free (modulus);
printf ("\n");
printf ("\t}\n");
}
printf ("]\n");
struct pfm_platform_header *platform_header = (struct pfm_platform_header*) pointer;
pointer = (uint8_t*) pointer + sizeof (struct pfm_platform_header);
printf ("pfm_platform_header\n");
printf ("{\n");
printf ("\tlength: %i\n", platform_header->length);
printf ("\tid_length: %i\n", platform_header->id_length);
printf ("\treserved: %i\n", platform_header->reserved);
printf ("}\n");
char *platform_id = malloc (platform_header->id_length + 1);
if (platform_id == NULL) {
printf ("Failed to allocate platform id buffer.\n");
return -1;
}
memcpy (platform_id, pointer, platform_header->id_length);
platform_id[platform_header->id_length] = '\0';
int alignment = platform_header->id_length % 4;
alignment = (alignment == 0) ? 0 : (4 - alignment);
pointer += platform_header->id_length + alignment;
printf ("platform_id: %s\n", platform_id);
free (platform_id);
return (pointer - pfm);
}