]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c
SecurityPkg: Tcg2Dxe: Report correct FinalEventLog size
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Dxe / Tcg2Dxe.c
index 9080e4703233dbe5f196071f294f8c3730e3fe0c..556ef33d9bb5b1c0e8d758d85f998f85086b69e5 100644 (file)
@@ -856,38 +856,13 @@ TcgDxeLogEvent (
       //\r
       (mTcgDxeData.FinalEventsTable[Index])->NumberOfEvents ++;\r
       DEBUG ((EFI_D_INFO, "FinalEventsTable->NumberOfEvents - 0x%x\n", (mTcgDxeData.FinalEventsTable[Index])->NumberOfEvents));\r
-      DEBUG ((EFI_D_INFO, "  Size - 0x%x\n", (UINTN)EventLogAreaStruct->LastEvent - (UINTN)mTcgDxeData.FinalEventsTable[Index]));\r
+      DEBUG ((EFI_D_INFO, "  Size - 0x%x\n", (UINTN)EventLogAreaStruct->EventLogSize));\r
     }\r
   }\r
 \r
   return Status;\r
 }\r
 \r
-/**\r
-  Get TPML_DIGEST_VALUES data size.\r
-\r
-  @param[in]     DigestList    TPML_DIGEST_VALUES data.\r
-\r
-  @return TPML_DIGEST_VALUES data size.\r
-**/\r
-UINT32\r
-GetDigestListSize (\r
-  IN TPML_DIGEST_VALUES             *DigestList\r
-  )\r
-{\r
-  UINTN  Index;\r
-  UINT16 DigestSize;\r
-  UINT32 TotalSize;\r
-\r
-  TotalSize = sizeof(DigestList->count);\r
-  for (Index = 0; Index < DigestList->count; Index++) {\r
-    DigestSize = GetHashSizeFromAlgo (DigestList->digests[Index].hashAlg);\r
-    TotalSize += sizeof(DigestList->digests[Index].hashAlg) + DigestSize;\r
-  }\r
-\r
-  return TotalSize;\r
-}\r
-\r
 /**\r
   Get TPML_DIGEST_VALUES compact binary buffer size.\r
 \r
@@ -923,79 +898,55 @@ GetDigestListBinSize (
 }\r
 \r
 /**\r
-  Return if hash alg is supported in TPM PCR bank.\r
+  Copy TPML_DIGEST_VALUES compact binary into a buffer\r
 \r
-  @param HashAlg  Hash algorithm to be checked.\r
+  @param[in,out]    Buffer                  Buffer to hold copied TPML_DIGEST_VALUES compact binary.\r
+  @param[in]        DigestListBin           TPML_DIGEST_VALUES compact binary buffer.\r
+  @param[in]        HashAlgorithmMask       HASH bits corresponding to the desired digests to copy.\r
+  @param[out]       HashAlgorithmMaskCopied Pointer to HASH bits corresponding to the digests copied.\r
 \r
-  @retval TRUE  Hash algorithm is supported.\r
-  @retval FALSE Hash algorithm is not supported.\r
+  @return The end of buffer to hold TPML_DIGEST_VALUES compact binary.\r
 **/\r
-BOOLEAN\r
-IsHashAlgSupportedInPcrBank (\r
-  IN TPMI_ALG_HASH  HashAlg\r
+VOID *\r
+CopyDigestListBinToBuffer (\r
+  IN OUT VOID                       *Buffer,\r
+  IN VOID                           *DigestListBin,\r
+  IN UINT32                         HashAlgorithmMask,\r
+  OUT UINT32                        *HashAlgorithmMaskCopied\r
   )\r
 {\r
-  switch (HashAlg) {\r
-  case TPM_ALG_SHA1:\r
-    if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA1) != 0) {\r
-      return TRUE;\r
-    }\r
-    break;\r
-  case TPM_ALG_SHA256:\r
-    if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA256) != 0) {\r
-      return TRUE;\r
-    }\r
-    break;\r
-  case TPM_ALG_SHA384:\r
-    if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA384) != 0) {\r
-      return TRUE;\r
-    }\r
-    break;\r
-  case TPM_ALG_SHA512:\r
-    if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA512) != 0) {\r
-      return TRUE;\r
-    }\r
-    break;\r
-  case TPM_ALG_SM3_256:\r
-    if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SM3_256) != 0) {\r
-      return TRUE;\r
-    }\r
-    break;\r
-  }\r
-\r
-  return FALSE;\r
-}\r
+  UINTN         Index;\r
+  UINT16        DigestSize;\r
+  UINT32        Count;\r
+  TPMI_ALG_HASH HashAlg;\r
+  UINT32        DigestListCount;\r
+  UINT32        *DigestListCountPtr;\r
 \r
-/**\r
-  Copy TPML_DIGEST_VALUES into a buffer\r
+  DigestListCountPtr = (UINT32 *) Buffer;\r
+  DigestListCount = 0;\r
+  (*HashAlgorithmMaskCopied) = 0;\r
 \r
-  @param[in,out] Buffer        Buffer to hold TPML_DIGEST_VALUES.\r
-  @param[in]     DigestList    TPML_DIGEST_VALUES to be copied.\r
+  Count = ReadUnaligned32 (DigestListBin);\r
+  Buffer = (UINT8 *)Buffer + sizeof(Count);\r
+  DigestListBin = (UINT8 *)DigestListBin + sizeof(Count);\r
+  for (Index = 0; Index < Count; Index++) {\r
+    HashAlg = ReadUnaligned16 (DigestListBin);\r
+    DigestListBin = (UINT8 *)DigestListBin + sizeof(HashAlg);\r
+    DigestSize = GetHashSizeFromAlgo (HashAlg);\r
 \r
-  @return The end of buffer to hold TPML_DIGEST_VALUES.\r
-**/\r
-VOID *\r
-CopyDigestListToBuffer (\r
-  IN OUT VOID                       *Buffer,\r
-  IN TPML_DIGEST_VALUES             *DigestList\r
-  )\r
-{\r
-  UINTN  Index;\r
-  UINT16 DigestSize;\r
-\r
-  CopyMem (Buffer, &DigestList->count, sizeof(DigestList->count));\r
-  Buffer = (UINT8 *)Buffer + sizeof(DigestList->count);\r
-  for (Index = 0; Index < DigestList->count; Index++) {\r
-    if (!IsHashAlgSupportedInPcrBank (DigestList->digests[Index].hashAlg)) {\r
-      DEBUG ((EFI_D_ERROR, "WARNING: TPM2 Event log has HashAlg unsupported by PCR bank (0x%x)\n", DigestList->digests[Index].hashAlg));\r
-      continue;\r
+    if (IsHashAlgSupportedInHashAlgorithmMask(HashAlg, HashAlgorithmMask)) {\r
+      CopyMem (Buffer, &HashAlg, sizeof(HashAlg));\r
+      Buffer = (UINT8 *)Buffer + sizeof(HashAlg);\r
+      CopyMem (Buffer, DigestListBin, DigestSize);\r
+      Buffer = (UINT8 *)Buffer + DigestSize;\r
+      DigestListCount++;\r
+      (*HashAlgorithmMaskCopied) |= GetHashMaskFromAlgo (HashAlg);\r
+    } else {\r
+      DEBUG ((DEBUG_ERROR, "WARNING: CopyDigestListBinToBuffer Event log has HashAlg unsupported by PCR bank (0x%x)\n", HashAlg));\r
     }\r
-    CopyMem (Buffer, &DigestList->digests[Index].hashAlg, sizeof(DigestList->digests[Index].hashAlg));\r
-    Buffer = (UINT8 *)Buffer + sizeof(DigestList->digests[Index].hashAlg);\r
-    DigestSize = GetHashSizeFromAlgo (DigestList->digests[Index].hashAlg);\r
-    CopyMem (Buffer, &DigestList->digests[Index].digest, DigestSize);\r
-    Buffer = (UINT8 *)Buffer + DigestSize;\r
+    DigestListBin = (UINT8 *)DigestListBin + DigestSize;\r
   }\r
+  WriteUnaligned32 (DigestListCountPtr, DigestListCount);\r
 \r
   return Buffer;\r
 }\r
@@ -1023,6 +974,7 @@ TcgDxeLogHashEvent (
   EFI_STATUS                        RetStatus;\r
   TCG_PCR_EVENT2                    TcgPcrEvent2;\r
   UINT8                             *DigestBuffer;\r
+  UINT32                            *EventSizePtr;\r
 \r
   DEBUG ((EFI_D_INFO, "SupportedEventLogs - 0x%08x\n", mTcgDxeData.BsCap.SupportedEventLogs));\r
 \r
@@ -1059,9 +1011,8 @@ TcgDxeLogHashEvent (
         TcgPcrEvent2.PCRIndex = NewEventHdr->PCRIndex;\r
         TcgPcrEvent2.EventType = NewEventHdr->EventType;\r
         DigestBuffer = (UINT8 *)&TcgPcrEvent2.Digest;\r
-        DigestBuffer = CopyDigestListToBuffer (DigestBuffer, DigestList);\r
-        CopyMem (DigestBuffer, &NewEventHdr->EventSize, sizeof(NewEventHdr->EventSize));\r
-        DigestBuffer = DigestBuffer + sizeof(NewEventHdr->EventSize);\r
+        EventSizePtr = CopyDigestListToBuffer (DigestBuffer, DigestList, mTcgDxeData.BsCap.ActivePcrBanks);\r
+        CopyMem (EventSizePtr, &NewEventHdr->EventSize, sizeof(NewEventHdr->EventSize));\r
 \r
         //\r
         // Enter critical region\r
@@ -1070,7 +1021,7 @@ TcgDxeLogHashEvent (
         Status = TcgDxeLogEvent (\r
                    mTcg2EventInfo[Index].LogFormat,\r
                    &TcgPcrEvent2,\r
-                   sizeof(TcgPcrEvent2.PCRIndex) + sizeof(TcgPcrEvent2.EventType) + GetDigestListSize (DigestList) + sizeof(TcgPcrEvent2.EventSize),\r
+                   sizeof(TcgPcrEvent2.PCRIndex) + sizeof(TcgPcrEvent2.EventType) + GetDigestListBinSize (DigestBuffer) + sizeof(TcgPcrEvent2.EventSize),\r
                    NewEventData,\r
                    NewEventHdr->EventSize\r
                    );\r
@@ -1420,8 +1371,13 @@ SetupEventLog (
   EFI_PEI_HOB_POINTERS            GuidHob;\r
   EFI_PHYSICAL_ADDRESS            Lasa;\r
   UINTN                           Index;\r
+  VOID                            *DigestListBin;\r
+  TPML_DIGEST_VALUES              TempDigestListBin;\r
   UINT32                          DigestListBinSize;\r
+  UINT8                           *Event;\r
   UINT32                          EventSize;\r
+  UINT32                          *EventSizePtr;\r
+  UINT32                          HashAlgorithmMaskCopied;\r
   TCG_EfiSpecIDEventStruct        *TcgEfiSpecIdEventStruct;\r
   UINT8                           TempBuf[sizeof(TCG_EfiSpecIDEventStruct) + sizeof(UINT32) + (HASH_COUNT * sizeof(TCG_EfiSpecIdEventAlgorithmSize)) + sizeof(UINT8)];\r
   TCG_PCR_EVENT_HDR               FirstPcrEvent;\r
@@ -1438,9 +1394,8 @@ SetupEventLog (
   for (Index = 0; Index < sizeof(mTcg2EventInfo)/sizeof(mTcg2EventInfo[0]); Index++) {\r
     if ((mTcgDxeData.BsCap.SupportedEventLogs & mTcg2EventInfo[Index].LogFormat) != 0) {\r
       mTcgDxeData.EventLogAreaStruct[Index].EventLogFormat = mTcg2EventInfo[Index].LogFormat;\r
-      Lasa = (EFI_PHYSICAL_ADDRESS) (SIZE_4GB - 1);\r
       Status = gBS->AllocatePages (\r
-                      AllocateMaxAddress,\r
+                      AllocateAnyPages,\r
                       EfiBootServicesData,\r
                       EFI_SIZE_TO_PAGES (PcdGet32 (PcdTcgLogAreaMinLen)),\r
                       &Lasa\r
@@ -1540,9 +1495,8 @@ SetupEventLog (
   for (Index = 0; Index < sizeof(mTcg2EventInfo)/sizeof(mTcg2EventInfo[0]); Index++) {\r
     if ((mTcgDxeData.BsCap.SupportedEventLogs & mTcg2EventInfo[Index].LogFormat) != 0) {\r
       if (mTcg2EventInfo[Index].LogFormat == EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) {\r
-        Lasa = (EFI_PHYSICAL_ADDRESS) (SIZE_4GB - 1);\r
         Status = gBS->AllocatePages (\r
-                        AllocateMaxAddress,\r
+                        AllocateAnyPages,\r
                         EfiACPIMemoryNVS,\r
                         EFI_SIZE_TO_PAGES (PcdGet32 (PcdTcg2FinalLogAreaLen)),\r
                         &Lasa\r
@@ -1600,7 +1554,8 @@ SetupEventLog (
       Status = EFI_SUCCESS;\r
       while (!EFI_ERROR (Status) && \r
              (GuidHob.Raw = GetNextGuidHob (mTcg2EventInfo[Index].EventGuid, GuidHob.Raw)) != NULL) {\r
-        TcgEvent    = GET_GUID_HOB_DATA (GuidHob.Guid);\r
+        TcgEvent    = AllocateCopyPool (GET_GUID_HOB_DATA_SIZE (GuidHob.Guid), GET_GUID_HOB_DATA (GuidHob.Guid));\r
+        ASSERT (TcgEvent != NULL);\r
         GuidHob.Raw = GET_NEXT_HOB (GuidHob);\r
         switch (mTcg2EventInfo[Index].LogFormat) {\r
         case EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2:\r
@@ -1613,17 +1568,47 @@ SetupEventLog (
                      );\r
           break;\r
         case EFI_TCG2_EVENT_LOG_FORMAT_TCG_2:\r
-          DigestListBinSize = GetDigestListBinSize ((UINT8 *)TcgEvent + sizeof(TCG_PCRINDEX) + sizeof(TCG_EVENTTYPE));\r
-          CopyMem (&EventSize, (UINT8 *)TcgEvent + sizeof(TCG_PCRINDEX) + sizeof(TCG_EVENTTYPE) + DigestListBinSize, sizeof(UINT32));\r
+          DigestListBin = (UINT8 *)TcgEvent + sizeof(TCG_PCRINDEX) + sizeof(TCG_EVENTTYPE);\r
+          DigestListBinSize = GetDigestListBinSize (DigestListBin);\r
+          //\r
+          // Save event size.\r
+          //\r
+          CopyMem (&EventSize, (UINT8 *)DigestListBin + DigestListBinSize, sizeof(UINT32));\r
+          Event = (UINT8 *)DigestListBin + DigestListBinSize + sizeof(UINT32);\r
+          //\r
+          // Filter inactive digest in the event2 log from PEI HOB.\r
+          //\r
+          CopyMem (&TempDigestListBin, DigestListBin, GetDigestListBinSize (DigestListBin));\r
+          EventSizePtr = CopyDigestListBinToBuffer (\r
+                           DigestListBin,\r
+                           &TempDigestListBin,\r
+                           mTcgDxeData.BsCap.ActivePcrBanks,\r
+                           &HashAlgorithmMaskCopied\r
+                           );\r
+          if (HashAlgorithmMaskCopied != mTcgDxeData.BsCap.ActivePcrBanks) {\r
+            DEBUG ((\r
+              DEBUG_ERROR,\r
+              "ERROR: The event2 log includes digest hash mask 0x%x, but required digest hash mask is 0x%x\n",\r
+              HashAlgorithmMaskCopied,\r
+              mTcgDxeData.BsCap.ActivePcrBanks\r
+              ));\r
+          }\r
+          //\r
+          // Restore event size.\r
+          //\r
+          CopyMem (EventSizePtr, &EventSize, sizeof(UINT32));\r
+          DigestListBinSize = GetDigestListBinSize (DigestListBin);\r
+\r
           Status = TcgDxeLogEvent (\r
                      mTcg2EventInfo[Index].LogFormat,\r
                      TcgEvent,\r
                      sizeof(TCG_PCRINDEX) + sizeof(TCG_EVENTTYPE) + DigestListBinSize + sizeof(UINT32),\r
-                     (UINT8 *)TcgEvent + sizeof(TCG_PCRINDEX) + sizeof(TCG_EVENTTYPE) + DigestListBinSize + sizeof(UINT32),\r
+                     Event,\r
                      EventSize\r
                      );\r
           break;\r
         }\r
+        FreePool (TcgEvent);\r
       }\r
     }\r
   }\r
@@ -1816,6 +1801,7 @@ MeasureVariable (
                (UINT8*)VarLog\r
                );\r
   } else {\r
+    ASSERT (VarData != NULL);\r
     Status = TcgDxeHashLogExtendEvent (\r
                0,\r
                (UINT8*)VarData,\r
@@ -2176,7 +2162,7 @@ OnReadyToBoot (
     for (PcrIndex = 0; PcrIndex < 7; PcrIndex++) {\r
       Status = MeasureSeparatorEvent (PcrIndex);\r
       if (EFI_ERROR (Status)) {\r
-        DEBUG ((EFI_D_ERROR, "Seperator Event not Measured. Error!\n"));\r
+        DEBUG ((DEBUG_ERROR, "Separator Event not Measured. Error!\n"));\r
       }\r
     }\r
 \r
@@ -2325,7 +2311,6 @@ DriverEntry (
   VOID                              *Registration;\r
   UINT32                            MaxCommandSize;\r
   UINT32                            MaxResponseSize;\r
-  TPML_PCR_SELECTION                Pcrs;\r
   UINTN                             Index;\r
   EFI_TCG2_EVENT_ALGORITHM_BITMAP   TpmHashAlgorithmBitmap;\r
   UINT32                            ActivePCRBanks;\r
@@ -2395,51 +2380,9 @@ DriverEntry (
   //\r
   // Get supported PCR and current Active PCRs\r
   //\r
-  Status = Tpm2GetCapabilityPcrs (&Pcrs);\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Tpm2GetCapabilityPcrs fail!\n"));\r
-    TpmHashAlgorithmBitmap = EFI_TCG2_BOOT_HASH_ALG_SHA1;\r
-    ActivePCRBanks = EFI_TCG2_BOOT_HASH_ALG_SHA1;\r
-  } else {\r
-    DEBUG ((EFI_D_INFO, "Tpm2GetCapabilityPcrs Count - %08x\n", Pcrs.count));\r
-    TpmHashAlgorithmBitmap = 0;\r
-    ActivePCRBanks = 0;\r
-    for (Index = 0; Index < Pcrs.count; Index++) {\r
-      DEBUG ((EFI_D_INFO, "hash - %x\n", Pcrs.pcrSelections[Index].hash));\r
-      switch (Pcrs.pcrSelections[Index].hash) {\r
-      case TPM_ALG_SHA1:\r
-        TpmHashAlgorithmBitmap |= EFI_TCG2_BOOT_HASH_ALG_SHA1;\r
-        if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
-          ActivePCRBanks |= EFI_TCG2_BOOT_HASH_ALG_SHA1;\r
-        }        \r
-        break;\r
-      case TPM_ALG_SHA256:\r
-        TpmHashAlgorithmBitmap |= EFI_TCG2_BOOT_HASH_ALG_SHA256;\r
-        if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
-          ActivePCRBanks |= EFI_TCG2_BOOT_HASH_ALG_SHA256;\r
-        }\r
-        break;\r
-      case TPM_ALG_SHA384:\r
-        TpmHashAlgorithmBitmap |= EFI_TCG2_BOOT_HASH_ALG_SHA384;\r
-        if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
-          ActivePCRBanks |= EFI_TCG2_BOOT_HASH_ALG_SHA384;\r
-        }\r
-        break;\r
-      case TPM_ALG_SHA512:\r
-        TpmHashAlgorithmBitmap |= EFI_TCG2_BOOT_HASH_ALG_SHA512;\r
-        if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
-          ActivePCRBanks |= EFI_TCG2_BOOT_HASH_ALG_SHA512;\r
-        }\r
-        break;\r
-      case TPM_ALG_SM3_256:\r
-        TpmHashAlgorithmBitmap |= EFI_TCG2_BOOT_HASH_ALG_SM3_256;\r
-        if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
-          ActivePCRBanks |= EFI_TCG2_BOOT_HASH_ALG_SM3_256;\r
-        }\r
-        break;\r
-      }\r
-    }\r
-  }\r
+  Status = Tpm2GetCapabilitySupportedAndActivePcrs (&TpmHashAlgorithmBitmap, &ActivePCRBanks);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   mTcgDxeData.BsCap.HashAlgorithmBitmap = TpmHashAlgorithmBitmap & PcdGet32 (PcdTcg2HashAlgorithmBitmap);\r
   mTcgDxeData.BsCap.ActivePcrBanks = ActivePCRBanks & PcdGet32 (PcdTcg2HashAlgorithmBitmap);\r
 \r