int32_t visualize_pfm_v1()

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);
}