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