/** Do a hash operation on a data buffer, extend a specific TPM PCR with the hash result, and add an entry to the Event Log. @param[in] TcgData TCG_DXE_DATA structure. @param[in] HashData Physical address of the start of the data buffer to be hashed, extended, and logged. @param[in] HashDataLen The length, in bytes, of the buffer referenced by HashData @param[in, out] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR data structure. @param[in] NewEventData Pointer to the new event data. @retval EFI_SUCCESS Operation completed successfully. @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. @retval EFI_DEVICE_ERROR The command was unsuccessful. **/ EFI_STATUS EFIAPI TcgDxeHashLogExtendEventI ( IN TCG_DXE_DATA *TcgData, IN UINT8 *HashData, IN UINT64 HashDataLen, IN OUT TCG_PCR_EVENT_HDR *NewEventHdr, IN UINT8 *NewEventData ) { EFI_STATUS Status; if (HashDataLen > 0) { Status = TpmCommHashAll ( HashData, (UINTN) HashDataLen, &NewEventHdr->Digest ); ASSERT_EFI_ERROR (Status); } Status = TpmCommExtend ( TcgData->TpmHandle, &NewEventHdr->Digest, NewEventHdr->PCRIndex, NULL ); if (!EFI_ERROR (Status)) { Status = TcgDxeLogEventI (TcgData, NewEventHdr, NewEventData); } return Status; }
/** Do a hash operation on a data buffer, extend a specific TPM PCR with the hash result, and add an entry to the Event Log. @param[in] TcgData TCG_DXE_DATA structure. @param[in] HashData Physical address of the start of the data buffer to be hashed, extended, and logged. @param[in] HashDataLen The length, in bytes, of the buffer referenced by HashData @param[in, out] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR data structure. @param[in] NewEventData Pointer to the new event data. @retval EFI_SUCCESS Operation completed successfully. @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. @retval EFI_DEVICE_ERROR The command was unsuccessful. **/ EFI_STATUS EFIAPI TcgDxeHashLogExtendEventI ( IN TCG_DXE_DATA *TcgData, IN UINT8 *HashData, IN UINT64 HashDataLen, IN OUT TCG_PCR_EVENT_HDR *NewEventHdr, IN UINT8 *NewEventData ) { EFI_STATUS Status; if (!TcgData->BsCap.TPMPresentFlag) { return EFI_DEVICE_ERROR; } if (HashDataLen > 0 || HashData != NULL) { Status = TpmCommHashAll ( HashData, (UINTN) HashDataLen, &NewEventHdr->Digest ); if (EFI_ERROR(Status)) { DEBUG ((DEBUG_ERROR, "TpmCommHashAll Failed. %x\n", Status)); goto Done; } } Status = TpmCommExtend ( TcgData->TpmHandle, &NewEventHdr->Digest, NewEventHdr->PCRIndex, NULL ); if (!EFI_ERROR (Status)) { Status = TcgDxeLogEventI (TcgData, NewEventHdr, NewEventData); } Done: if ((Status == EFI_DEVICE_ERROR) || (Status == EFI_TIMEOUT)) { DEBUG ((EFI_D_ERROR, "TcgDxeHashLogExtendEventI - %r. Disable TPM.\n", Status)); TcgData->BsCap.TPMPresentFlag = FALSE; REPORT_STATUS_CODE ( EFI_ERROR_CODE | EFI_ERROR_MINOR, (PcdGet32 (PcdStatusCodeSubClassTpmDevice) | EFI_P_EC_INTERFACE_ERROR) ); Status = EFI_DEVICE_ERROR; } return Status; }
/** Do a hash operation on a data buffer, extend a specific TPM PCR with the hash result, and build a GUIDed HOB recording the event which will be passed to the DXE phase and added into the Event Log. @param[in] PeiServices Describes the list of possible PEI Services. @param[in] HashData Physical address of the start of the data buffer to be hashed, extended, and logged. @param[in] HashDataLen The length, in bytes, of the buffer referenced by HashData. @param[in] TpmHandle TPM handle. @param[in] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR data structure. @param[in] NewEventData Pointer to the new event data. @retval EFI_SUCCESS Operation completed successfully. @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. @retval EFI_DEVICE_ERROR The command was unsuccessful. **/ EFI_STATUS HashLogExtendEvent ( IN EFI_PEI_SERVICES **PeiServices, IN UINT8 *HashData, IN UINTN HashDataLen, IN TIS_TPM_HANDLE TpmHandle, IN TCG_PCR_EVENT_HDR *NewEventHdr, IN UINT8 *NewEventData ) { EFI_STATUS Status; VOID *HobData; HobData = NULL; if (HashDataLen != 0) { Status = TpmCommHashAll ( HashData, HashDataLen, &NewEventHdr->Digest ); ASSERT_EFI_ERROR (Status); } Status = TpmCommExtend ( PeiServices, TpmHandle, &NewEventHdr->Digest, NewEventHdr->PCRIndex, NULL ); ASSERT_EFI_ERROR (Status); HobData = BuildGuidHob ( &gTcgEventEntryHobGuid, sizeof (*NewEventHdr) + NewEventHdr->EventSize ); if (HobData == NULL) { return EFI_OUT_OF_RESOURCES; } CopyMem (HobData, NewEventHdr, sizeof (*NewEventHdr)); HobData = (VOID *) ((UINT8*)HobData + sizeof (*NewEventHdr)); CopyMem (HobData, NewEventData, NewEventHdr->EventSize); return EFI_SUCCESS; }
/** This service abstracts the capability to do a hash operation on a data buffer. @param[in] This Indicates the calling context @param[in] HashData Pointer to the data buffer to be hashed @param[in] HashDataLen Length of the data buffer to be hashed @param[in] AlgorithmId Identification of the Algorithm to use for the hashing operation @param[in, out] HashedDataLen Resultant length of the hashed data @param[in, out] HashedDataResult Resultant buffer of the hashed data @retval EFI_SUCCESS Operation completed successfully. @retval EFI_INVALID_PARAMETER HashDataLen is NULL. @retval EFI_INVALID_PARAMETER HashDataLenResult is NULL. @retval EFI_OUT_OF_RESOURCES Cannot allocate buffer of size *HashedDataLen. @retval EFI_UNSUPPORTED AlgorithmId not supported. @retval EFI_BUFFER_TOO_SMALL *HashedDataLen < sizeof (TCG_DIGEST). **/ EFI_STATUS EFIAPI TcgDxeHashAll ( IN EFI_TCG_PROTOCOL *This, IN UINT8 *HashData, IN UINT64 HashDataLen, IN TCG_ALGORITHM_ID AlgorithmId, IN OUT UINT64 *HashedDataLen, IN OUT UINT8 **HashedDataResult ) { if (HashedDataLen == NULL || HashedDataResult == NULL) { return EFI_INVALID_PARAMETER; } switch (AlgorithmId) { case TPM_ALG_SHA: if (*HashedDataLen == 0) { *HashedDataLen = sizeof (TPM_DIGEST); *HashedDataResult = AllocatePool ((UINTN) *HashedDataLen); if (*HashedDataResult == NULL) { return EFI_OUT_OF_RESOURCES; } } if (*HashedDataLen < sizeof (TPM_DIGEST)) { *HashedDataLen = sizeof (TPM_DIGEST); return EFI_BUFFER_TOO_SMALL; } *HashedDataLen = sizeof (TPM_DIGEST); if (*HashedDataResult == NULL) { *HashedDataResult = AllocatePool ((UINTN) *HashedDataLen); } return TpmCommHashAll ( HashData, (UINTN) HashDataLen, (TPM_DIGEST*)*HashedDataResult ); default: return EFI_UNSUPPORTED; } }
/** Do a hash operation on a data buffer, extend a specific TPM PCR with the hash result, and add an entry to the Event Log. @param[in] TcgData TCG_DXE_DATA structure. @param[in] HashData Physical address of the start of the data buffer to be hashed, extended, and logged. @param[in] HashDataLen The length, in bytes, of the buffer referenced by HashData @param[in, out] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR data structure. @param[in] NewEventData Pointer to the new event data. @retval EFI_SUCCESS Operation completed successfully. @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. @retval EFI_DEVICE_ERROR The command was unsuccessful. **/ EFI_STATUS EFIAPI TcgDxeHashLogExtendEventI ( IN TCG_DXE_DATA *TcgData, IN UINT8 *HashData, IN UINT64 HashDataLen, IN OUT TCG_PCR_EVENT_HDR *NewEventHdr, IN UINT8 *NewEventData ) { EFI_STATUS Status; if (HashData == NULL && HashDataLen > 0) { return EFI_INVALID_PARAMETER; } if (HashDataLen > 0 || HashData != NULL) { Status = TpmCommHashAll ( HashData, (UINTN) HashDataLen, &NewEventHdr->Digest ); if (EFI_ERROR(Status)) { DEBUG ((DEBUG_ERROR, "TpmCommHashAll Failed. %x\n", Status)); return Status; } } Status = TpmCommExtend ( TcgData->TpmHandle, &NewEventHdr->Digest, NewEventHdr->PCRIndex, NULL ); if (!EFI_ERROR (Status)) { Status = TcgDxeLogEventI (TcgData, NewEventHdr, NewEventData); } return Status; }
/** Do a hash operation on a data buffer, extend a specific TPM PCR with the hash result, and build a GUIDed HOB recording the event which will be passed to the DXE phase and added into the Event Log. @param[in] PeiServices Describes the list of possible PEI Services. @param[in] HashData Physical address of the start of the data buffer to be hashed, extended, and logged. @param[in] HashDataLen The length, in bytes, of the buffer referenced by HashData. @param[in] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR data structure. @param[in] NewEventData Pointer to the new event data. @retval EFI_SUCCESS Operation completed successfully. @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. @retval EFI_DEVICE_ERROR The command was unsuccessful. **/ EFI_STATUS HashLogExtendEvent ( IN EFI_PEI_SERVICES **PeiServices, IN UINT8 *HashData, IN UINTN HashDataLen, IN TCG_PCR_EVENT_HDR *NewEventHdr, IN UINT8 *NewEventData ) { EFI_STATUS Status; VOID *HobData; if (GetFirstGuidHob (&gTpmErrorHobGuid) != NULL) { return EFI_DEVICE_ERROR; } HobData = NULL; if (HashDataLen != 0) { Status = TpmCommHashAll ( HashData, HashDataLen, &NewEventHdr->Digest ); if (EFI_ERROR (Status)) { goto Done; } } Status = Tpm12Extend ( &NewEventHdr->Digest, NewEventHdr->PCRIndex, NULL ); if (EFI_ERROR (Status)) { goto Done; } HobData = BuildGuidHob ( &gTcgEventEntryHobGuid, sizeof (*NewEventHdr) + NewEventHdr->EventSize ); if (HobData == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Done; } CopyMem (HobData, NewEventHdr, sizeof (*NewEventHdr)); HobData = (VOID *) ((UINT8*)HobData + sizeof (*NewEventHdr)); CopyMem (HobData, NewEventData, NewEventHdr->EventSize); Done: if ((Status == EFI_DEVICE_ERROR) || (Status == EFI_TIMEOUT)) { DEBUG ((EFI_D_ERROR, "HashLogExtendEvent - %r. Disable TPM.\n", Status)); BuildGuidHob (&gTpmErrorHobGuid,0); REPORT_STATUS_CODE ( EFI_ERROR_CODE | EFI_ERROR_MINOR, (PcdGet32 (PcdStatusCodeSubClassTpmDevice) | EFI_P_EC_INTERFACE_ERROR) ); Status = EFI_DEVICE_ERROR; } return Status; }