Exemplo n.º 1
0
VbError_t VbExHashFirmwareBody(VbCommonParams *cparams, uint32_t firmware_index)
{
	uint8_t *data;
	uint32_t size;
	uint32_t data_size;
	struct components *components;
	uint32_t i;

	switch (firmware_index) {
	case VB_SELECT_FIRMWARE_A:
		data = gcontext->fw_a;
		size = gcontext->fw_a_size;
		break;
	case VB_SELECT_FIRMWARE_B:
		data = gcontext->fw_b;
		size = gcontext->fw_b_size;
		break;
	default:
		return VBERROR_UNKNOWN;
	}

	components = (void *)data;
	data_size = sizeof(struct components);

	if (components->num_components > MAX_NUM_COMPONENTS)
		return VBERROR_UNKNOWN;

	data_size +=
		components->num_components * sizeof(struct component_entry);

	for (i = 0; i < components->num_components; i++)
		data_size += ALIGN(components->entries[i].size, 4);

	if (size < data_size)
			return VBERROR_UNKNOWN;

	VbUpdateFirmwareBodyHash(cparams, data, data_size);

	return VBERROR_SUCCESS;
}
Exemplo n.º 2
0
VbError_t VbExHashFirmwareBody(VbCommonParams *cparams, uint32_t firmware_index)
{
	uint8_t *data;
	struct vboot_region *region;
	struct vboot_context *ctx;
	size_t data_size;
	uintptr_t offset_addr;

	ctx = cparams->caller_context;

	switch (firmware_index) {
	case VB_SELECT_FIRMWARE_A:
		region = &ctx->fw_a;
		break;
	case VB_SELECT_FIRMWARE_B:
		region = &ctx->fw_b;
		break;
	default:
		return VBERROR_UNKNOWN;
	}

	data_size = region->size;
	offset_addr = region->offset_addr;
	while (data_size) {
		size_t block_size;

		block_size = get_hash_block_size(data_size);
		data = ctx->get_region(offset_addr, block_size, NULL);
		if (data == NULL)
			return VBERROR_UNKNOWN;
		VbUpdateFirmwareBodyHash(cparams, data, block_size);

		data_size -= block_size;
		offset_addr += block_size;
	}

	return VBERROR_SUCCESS;
}