10#include <Guid/ImageAuthentication.h>
11#include <IndustryStandard/UefiTcgPlatform.h>
13#include <Library/UefiBootServicesTableLib.h>
14#include <Library/UefiRuntimeServicesTableLib.h>
15#include <Library/MemoryAllocationLib.h>
16#include <Library/BaseMemoryLib.h>
17#include <Library/DebugLib.h>
18#include <Library/BaseLib.h>
19#include <Library/TpmMeasurementLib.h>
32 { EFI_IMAGE_SECURITY_DATABASE, &gEfiImageSecurityDatabaseGuid },
33 { EFI_IMAGE_SECURITY_DATABASE1, &gEfiImageSecurityDatabaseGuid },
34 { EFI_IMAGE_SECURITY_DATABASE2, &gEfiImageSecurityDatabaseGuid },
55 IN CHAR16 *VariableName,
56 IN EFI_GUID *VendorGuid
62 if ((StrCmp (VariableName,
mVariableType[Index].VariableName) == 0) &&
89 IN EFI_GUID *VendorGuid,
96 UEFI_VARIABLE_DATA *VarLog;
99 ASSERT ((VarSize == 0 && VarData == NULL) || (VarSize != 0 && VarData != NULL));
101 VarNameLength = StrLen (VarName);
102 VarLogSize = (UINT32)(
sizeof (*VarLog) + VarNameLength *
sizeof (*VarName) + VarSize
103 -
sizeof (VarLog->UnicodeName) - sizeof (VarLog->VariableData));
105 VarLog = (UEFI_VARIABLE_DATA *)AllocateZeroPool (VarLogSize);
106 if (VarLog == NULL) {
107 return EFI_OUT_OF_RESOURCES;
110 CopyMem (&VarLog->VariableName, VendorGuid, sizeof (VarLog->VariableName));
111 VarLog->UnicodeNameLength = VarNameLength;
112 VarLog->VariableDataLength = VarSize;
116 VarNameLength * sizeof (*VarName)
120 (CHAR16 *)VarLog->UnicodeName + VarNameLength,
126 DEBUG ((DEBUG_INFO,
"VariableDxe: MeasureVariable (Pcr - %x, EventType - %x, ", (UINTN)7, (UINTN)EV_EFI_VARIABLE_DRIVER_CONFIG));
127 DEBUG ((DEBUG_INFO,
"VariableName - %s, VendorGuid - %g)\n", VarName, VendorGuid));
129 Status = TpmMeasureAndLogData (
131 EV_EFI_VARIABLE_DRIVER_CONFIG,
161 IN CONST CHAR16 *Name,
162 IN CONST EFI_GUID *Guid,
179 Status =
gRT->GetVariable ((CHAR16 *)Name, (EFI_GUID *)Guid, NULL, &BufferSize, *Value);
180 if (Status != EFI_BUFFER_TOO_SMALL) {
187 *Value = AllocatePool (BufferSize);
189 if (*Value == NULL) {
190 return EFI_OUT_OF_RESOURCES;
196 Status =
gRT->GetVariable ((CHAR16 *)Name, (EFI_GUID *)Guid, NULL, &BufferSize, *Value);
197 if (EFI_ERROR (Status)) {
219 IN CHAR16 *VariableName,
220 IN EFI_GUID *VendorGuid
224 UINTN VariableDataSize;
242 if (EFI_ERROR (Status)) {
246 if ((StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE2) == 0) &&
247 CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid))
249 DEBUG ((DEBUG_INFO,
"Skip measuring variable %s since it's deleted\n", EFI_IMAGE_SECURITY_DATABASE2));
253 VariableDataSize = 0;
263 DEBUG ((DEBUG_INFO,
"MeasureBootPolicyVariable - %r\n", Status));
265 if (VariableData != NULL) {
266 FreePool (VariableData);
272 if ((StrCmp (VariableName, EFI_PLATFORM_KEY_NAME) == 0) &&
276 EFI_SECURE_BOOT_MODE_NAME,
281 if (EFI_ERROR (Status)) {
295 DEBUG ((DEBUG_INFO,
"%s variable updated according to PK change. Remeasure the value!\n", EFI_SECURE_BOOT_MODE_NAME));
297 EFI_SECURE_BOOT_MODE_NAME,
302 DEBUG ((DEBUG_INFO,
"MeasureBootPolicyVariable - %r\n", Status));
307 FreePool (VariableData);
332 EFI_SECURE_BOOT_MODE_NAME,
337 if (EFI_ERROR (Status)) {
341 DEBUG ((DEBUG_INFO,
"RecordSecureBootPolicyVarData GetVariable %s Status %x\n", EFI_SECURE_BOOT_MODE_NAME, Status));
EFI_STATUS EFIAPI MeasureVariable(IN CHAR16 *VarName, IN EFI_GUID *VendorGuid, IN VOID *VarData, IN UINTN VarSize)
UINTN mSecureBootVarDataSize
VOID EFIAPI SecureBootHook(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid)
BOOLEAN IsSecureBootPolicyVariable(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid)
EFI_STATUS InternalGetVariable(IN CONST CHAR16 *Name, IN CONST EFI_GUID *Guid, OUT VOID **Value, OUT UINTN *Size)
VOID EFIAPI RecordSecureBootPolicyVarData(VOID)
VARIABLE_TYPE mVariableType[]
UINT8 * mSecureBootVarData
DMG_SIZE_DEVICE_PATH Size
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiGlobalVariableGuid