static int vboot_locate(struct cbfs_props *props) { struct region selected_region; /* Don't honor vboot results until the vboot logic has run. */ if (!vboot_logic_executed()) return -1; if (vb2_get_selected_region(&selected_region)) return -1; props->offset = region_offset(&selected_region); props->size = region_sz(&selected_region); return 0; }
uint32_t vboot_measure_cbfs_hook(struct cbfsf *fh, const char *name) { uint32_t pcr_index; uint32_t cbfs_type; struct region_device rdev; char tcpa_metadata[TCPA_PCR_HASH_NAME]; if (!vboot_logic_executed()) return 0; cbfsf_file_type(fh, &cbfs_type); cbfs_file_data(&rdev, fh); switch (cbfs_type) { case CBFS_TYPE_MRC: case CBFS_TYPE_MRC_CACHE: pcr_index = TPM_RUNTIME_DATA_PCR; break; case CBFS_TYPE_STAGE: case CBFS_TYPE_SELF: case CBFS_TYPE_FIT: pcr_index = TPM_CRTM_PCR; break; default: if (is_runtime_data(name)) pcr_index = TPM_RUNTIME_DATA_PCR; else pcr_index = TPM_CRTM_PCR; break; } if (create_tcpa_metadata(&rdev, name, tcpa_metadata) < 0) return VB2_ERROR_UNKNOWN; return tpm_measure_region(&rdev, pcr_index, tcpa_metadata); }