]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.c
SecurityPkg/Tcg2Pei: Add TCG PFP 105 support.
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Pei / Tcg2Pei.c
index 1565d4e402199714179467fad8924d3fadf0b63c..3788063cc9e8267c0e4719e401a198af2e5744ab 100644 (file)
@@ -37,6 +37,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/ReportStatusCodeLib.h>\r
 #include <Library/ResetSystemLib.h>\r
+#include <Library/PrintLib.h>\r
 \r
 #define PERF_ID_TCG2_PEI  0x3080\r
 \r
@@ -78,6 +79,18 @@ EFI_PLATFORM_FIRMWARE_BLOB *mMeasuredChildFvInfo;
 UINT32 mMeasuredMaxChildFvIndex = 0;\r
 UINT32 mMeasuredChildFvIndex = 0;\r
 \r
+#pragma pack (1)\r
+\r
+#define FV_HANDOFF_TABLE_DESC  "Fv(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)"\r
+typedef struct {\r
+  UINT8                             BlobDescriptionSize;\r
+  UINT8                             BlobDescription[sizeof(FV_HANDOFF_TABLE_DESC)];\r
+  EFI_PHYSICAL_ADDRESS              BlobBase;\r
+  UINT64                            BlobLength;\r
+} FV_HANDOFF_TABLE_POINTERS2;\r
+\r
+#pragma pack ()\r
+\r
 /**\r
   Measure and record the Firmware Volume Information once FvInfoPPI install.\r
 \r
@@ -447,6 +460,48 @@ MeasureCRTMVersion (
            );\r
 }\r
 \r
+/*\r
+  Get the FvName from the FV header.\r
+\r
+  Causion: The FV is untrusted input.\r
+\r
+  @param[in]  FvBase            Base address of FV image.\r
+  @param[in]  FvLength          Length of FV image.\r
+\r
+  @return FvName pointer\r
+  @retval NULL   FvName is NOT found\r
+*/\r
+VOID *\r
+GetFvName (\r
+  IN EFI_PHYSICAL_ADDRESS           FvBase,\r
+  IN UINT64                         FvLength\r
+  )\r
+{\r
+  EFI_FIRMWARE_VOLUME_HEADER      *FvHeader;\r
+  EFI_FIRMWARE_VOLUME_EXT_HEADER  *FvExtHeader;\r
+\r
+  if (FvBase >= MAX_ADDRESS) {\r
+    return NULL;\r
+  }\r
+  if (FvLength >= MAX_ADDRESS - FvBase) {\r
+    return NULL;\r
+  }\r
+  if (FvLength < sizeof(EFI_FIRMWARE_VOLUME_HEADER)) {\r
+    return NULL;\r
+  }\r
+\r
+  FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FvBase;\r
+  if (FvHeader->ExtHeaderOffset < sizeof(EFI_FIRMWARE_VOLUME_HEADER)) {\r
+    return NULL;\r
+  }\r
+  if (FvHeader->ExtHeaderOffset + sizeof(EFI_FIRMWARE_VOLUME_EXT_HEADER) > FvLength) {\r
+    return NULL;\r
+  }\r
+  FvExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)(UINTN)(FvBase + FvHeader->ExtHeaderOffset);\r
+\r
+  return &FvExtHeader->FvName;\r
+}\r
+\r
 /**\r
   Measure FV image.\r
   Add it into the measured FV list after the FV is measured successfully.\r
@@ -469,6 +524,9 @@ MeasureFvImage (
   UINT32                                                Index;\r
   EFI_STATUS                                            Status;\r
   EFI_PLATFORM_FIRMWARE_BLOB                            FvBlob;\r
+  FV_HANDOFF_TABLE_POINTERS2                            FvBlob2;\r
+  VOID                                                  *EventData;\r
+  VOID                                                  *FvName;\r
   TCG_PCR_EVENT_HDR                                     TcgEventHdr;\r
   UINT32                                                Instance;\r
   UINT32                                                Tpm2HashMask;\r
@@ -566,11 +624,26 @@ MeasureFvImage (
   //\r
   // Init the log event for FV measurement\r
   //\r
-  FvBlob.BlobBase       = FvBase;\r
-  FvBlob.BlobLength     = FvLength;\r
-  TcgEventHdr.PCRIndex  = 0;\r
-  TcgEventHdr.EventType = EV_EFI_PLATFORM_FIRMWARE_BLOB;\r
-  TcgEventHdr.EventSize = sizeof (FvBlob);\r
+  if (PcdGet32(PcdTcgPfpMeasurementRevision) >= TCG_EfiSpecIDEventStruct_SPEC_ERRATA_TPM2_REV_105) {\r
+    FvBlob2.BlobDescriptionSize = sizeof(FvBlob2.BlobDescription);\r
+    CopyMem (FvBlob2.BlobDescription, FV_HANDOFF_TABLE_DESC, sizeof(FvBlob2.BlobDescription));\r
+    FvName = GetFvName (FvBase, FvLength);\r
+    if (FvName != NULL) {\r
+      AsciiSPrint ((CHAR8 *)FvBlob2.BlobDescription, sizeof(FvBlob2.BlobDescription), "Fv(%g)", FvName);\r
+    }\r
+    FvBlob2.BlobBase      = FvBase;\r
+    FvBlob2.BlobLength    = FvLength;\r
+    TcgEventHdr.EventType = EV_EFI_PLATFORM_FIRMWARE_BLOB2;\r
+    TcgEventHdr.EventSize = sizeof (FvBlob2);\r
+    EventData             = &FvBlob2;\r
+  } else {\r
+    FvBlob.BlobBase       = FvBase;\r
+    FvBlob.BlobLength     = FvLength;\r
+    TcgEventHdr.PCRIndex  = 0;\r
+    TcgEventHdr.EventType = EV_EFI_PLATFORM_FIRMWARE_BLOB;\r
+    TcgEventHdr.EventSize = sizeof (FvBlob);\r
+    EventData             = &FvBlob;\r
+  }\r
 \r
   if (Tpm2HashMask == 0) {\r
     //\r
@@ -583,9 +656,9 @@ MeasureFvImage (
                );\r
 \r
     if (!EFI_ERROR(Status)) {\r
-       Status = LogHashEvent (&DigestList, &TcgEventHdr, (UINT8*) &FvBlob);\r
-       DEBUG ((DEBUG_INFO, "The pre-hashed FV which is extended & logged by Tcg2Pei starts at: 0x%x\n", FvBlob.BlobBase));\r
-       DEBUG ((DEBUG_INFO, "The pre-hashed FV which is extended & logged by Tcg2Pei has the size: 0x%x\n", FvBlob.BlobLength));\r
+       Status = LogHashEvent (&DigestList, &TcgEventHdr, EventData);\r
+       DEBUG ((DEBUG_INFO, "The pre-hashed FV which is extended & logged by Tcg2Pei starts at: 0x%x\n", FvBase));\r
+       DEBUG ((DEBUG_INFO, "The pre-hashed FV which is extended & logged by Tcg2Pei has the size: 0x%x\n", FvLength));\r
     } else if (Status == EFI_DEVICE_ERROR) {\r
       BuildGuidHob (&gTpmErrorHobGuid,0);\r
       REPORT_STATUS_CODE (\r
@@ -599,13 +672,13 @@ MeasureFvImage (
     //\r
     Status = HashLogExtendEvent (\r
                0,\r
-               (UINT8*) (UINTN) FvBlob.BlobBase,\r
-               (UINTN) FvBlob.BlobLength,\r
-               &TcgEventHdr,\r
-               (UINT8*) &FvBlob\r
+               (UINT8*) (UINTN) FvBase, // HashData\r
+               (UINTN) FvLength,        // HashDataLen\r
+               &TcgEventHdr,            // EventHdr\r
+               EventData                // EventData\r
                );\r
-    DEBUG ((DEBUG_INFO, "The FV which is measured by Tcg2Pei starts at: 0x%x\n", FvBlob.BlobBase));\r
-    DEBUG ((DEBUG_INFO, "The FV which is measured by Tcg2Pei has the size: 0x%x\n", FvBlob.BlobLength));\r
+    DEBUG ((DEBUG_INFO, "The FV which is measured by Tcg2Pei starts at: 0x%x\n", FvBase));\r
+    DEBUG ((DEBUG_INFO, "The FV which is measured by Tcg2Pei has the size: 0x%x\n", FvLength));\r
   }\r
 \r
   if (EFI_ERROR(Status)) {\r