]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c
SecurityPkg/Tcg2Dxe: Add Tcg2Dxe to support 800-155 event.
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Dxe / Tcg2Dxe.c
index 3cd16c2fa33fdc69782c8bd277f1b9ebd23d2b0b..1fe1955cab8b90057ace35e6a5c1e354afeb4ce7 100644 (file)
@@ -75,6 +75,7 @@ typedef struct {
   UINT8                             *LastEvent;\r
   BOOLEAN                           EventLogStarted;\r
   BOOLEAN                           EventLogTruncated;\r
+  UINTN                             Next800155EventOffset;\r
 } TCG_EVENT_LOG_AREA_STRUCT;\r
 \r
 typedef struct _TCG_DXE_DATA {\r
@@ -771,16 +772,43 @@ Tcg2GetEventLog (
   return EFI_SUCCESS;\r
 }\r
 \r
+/*\r
+  Return if this is a Tcg800155PlatformIdEvent.\r
+\r
+  @param[in]      NewEventHdr         Pointer to a TCG_PCR_EVENT_HDR/TCG_PCR_EVENT_EX data structure.\r
+  @param[in]      NewEventHdrSize     New event header size.\r
+  @param[in]      NewEventData        Pointer to the new event data.\r
+  @param[in]      NewEventSize        New event data size.\r
+\r
+  @retval TRUE   This is a Tcg800155PlatformIdEvent.\r
+  @retval FALSE  This is NOT a Tcg800155PlatformIdEvent.\r
+\r
+*/\r
+BOOLEAN\r
+Is800155Event (\r
+  IN      VOID                      *NewEventHdr,\r
+  IN      UINT32                    NewEventHdrSize,\r
+  IN      UINT8                     *NewEventData,\r
+  IN      UINT32                    NewEventSize\r
+  )\r
+{\r
+  if ((((TCG_PCR_EVENT2_HDR *)NewEventHdr)->EventType == EV_NO_ACTION) &&\r
+      (NewEventSize >= sizeof(TCG_Sp800_155_PlatformId_Event2)) &&\r
+      (CompareMem (NewEventData, TCG_Sp800_155_PlatformId_Event2_SIGNATURE,\r
+        sizeof(TCG_Sp800_155_PlatformId_Event2_SIGNATURE) - 1) == 0)) {\r
+    return TRUE;\r
+  }\r
+  return FALSE;\r
+}\r
+\r
 /**\r
   Add a new entry to the Event Log.\r
 \r
-  @param[in, out] EventLogPtr     Pointer to the Event Log data.\r
-  @param[in, out] LogSize         Size of the Event Log.\r
-  @param[in]      MaxSize         Maximum size of the Event Log.\r
-  @param[in]      NewEventHdr     Pointer to a TCG_PCR_EVENT_HDR/TCG_PCR_EVENT_EX data structure.\r
-  @param[in]      NewEventHdrSize New event header size.\r
-  @param[in]      NewEventData    Pointer to the new event data.\r
-  @param[in]      NewEventSize    New event data size.\r
+  @param[in, out] EventLogAreaStruct  The event log area data structure\r
+  @param[in]      NewEventHdr         Pointer to a TCG_PCR_EVENT_HDR/TCG_PCR_EVENT_EX data structure.\r
+  @param[in]      NewEventHdrSize     New event header size.\r
+  @param[in]      NewEventData        Pointer to the new event data.\r
+  @param[in]      NewEventSize        New event data size.\r
 \r
   @retval EFI_SUCCESS           The new event log entry was added.\r
   @retval EFI_OUT_OF_RESOURCES  No enough memory to log the new event.\r
@@ -788,9 +816,7 @@ Tcg2GetEventLog (
 **/\r
 EFI_STATUS\r
 TcgCommLogEvent (\r
-  IN OUT  UINT8                     **EventLogPtr,\r
-  IN OUT  UINTN                     *LogSize,\r
-  IN      UINTN                     MaxSize,\r
+  IN OUT  TCG_EVENT_LOG_AREA_STRUCT *EventLogAreaStruct,\r
   IN      VOID                      *NewEventHdr,\r
   IN      UINT32                    NewEventHdrSize,\r
   IN      UINT8                     *NewEventData,\r
@@ -798,6 +824,7 @@ TcgCommLogEvent (
   )\r
 {\r
   UINTN                            NewLogSize;\r
+  BOOLEAN                          Record800155Event;\r
 \r
   if (NewEventSize > MAX_ADDRESS -  NewEventHdrSize) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -805,23 +832,55 @@ TcgCommLogEvent (
 \r
   NewLogSize = NewEventHdrSize + NewEventSize;\r
 \r
-  if (NewLogSize > MAX_ADDRESS -  *LogSize) {\r
+  if (NewLogSize > MAX_ADDRESS -  EventLogAreaStruct->EventLogSize) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  if (NewLogSize + *LogSize > MaxSize) {\r
-    DEBUG ((EFI_D_INFO, "  MaxSize    - 0x%x\n", MaxSize));\r
-    DEBUG ((EFI_D_INFO, "  NewLogSize - 0x%x\n", NewLogSize));\r
-    DEBUG ((EFI_D_INFO, "  LogSize    - 0x%x\n", *LogSize));\r
-    DEBUG ((EFI_D_INFO, "TcgCommLogEvent - %r\n", EFI_OUT_OF_RESOURCES));\r
+  if (NewLogSize + EventLogAreaStruct->EventLogSize > EventLogAreaStruct->Laml) {\r
+    DEBUG ((DEBUG_INFO, "  Laml       - 0x%x\n", EventLogAreaStruct->Laml));\r
+    DEBUG ((DEBUG_INFO, "  NewLogSize - 0x%x\n", NewLogSize));\r
+    DEBUG ((DEBUG_INFO, "  LogSize    - 0x%x\n", EventLogAreaStruct->EventLogSize));\r
+    DEBUG ((DEBUG_INFO, "TcgCommLogEvent - %r\n", EFI_OUT_OF_RESOURCES));\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  *EventLogPtr += *LogSize;\r
-  *LogSize += NewLogSize;\r
-  CopyMem (*EventLogPtr, NewEventHdr, NewEventHdrSize);\r
+  //\r
+  // Check 800-155 event\r
+  // Record to 800-155 event offset only.\r
+  // If the offset is 0, no need to record.\r
+  //\r
+  Record800155Event = Is800155Event (NewEventHdr, NewEventHdrSize, NewEventData, NewEventSize);\r
+  if (Record800155Event) {\r
+    if (EventLogAreaStruct->Next800155EventOffset != 0) {\r
+      CopyMem (\r
+        (UINT8 *)(UINTN)EventLogAreaStruct->Lasa + EventLogAreaStruct->Next800155EventOffset + NewLogSize,\r
+        (UINT8 *)(UINTN)EventLogAreaStruct->Lasa + EventLogAreaStruct->Next800155EventOffset,\r
+        EventLogAreaStruct->EventLogSize - EventLogAreaStruct->Next800155EventOffset\r
+        );\r
+\r
+      CopyMem (\r
+        (UINT8 *)(UINTN)EventLogAreaStruct->Lasa + EventLogAreaStruct->Next800155EventOffset,\r
+        NewEventHdr,\r
+        NewEventHdrSize\r
+        );\r
+      CopyMem (\r
+        (UINT8 *)(UINTN)EventLogAreaStruct->Lasa + EventLogAreaStruct->Next800155EventOffset + NewEventHdrSize,\r
+        NewEventData,\r
+        NewEventSize\r
+        );\r
+\r
+      EventLogAreaStruct->Next800155EventOffset += NewLogSize;\r
+      EventLogAreaStruct->LastEvent += NewLogSize;\r
+      EventLogAreaStruct->EventLogSize += NewLogSize;\r
+    }\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  EventLogAreaStruct->LastEvent = (UINT8 *)(UINTN)EventLogAreaStruct->Lasa + EventLogAreaStruct->EventLogSize;\r
+  EventLogAreaStruct->EventLogSize += NewLogSize;\r
+  CopyMem (EventLogAreaStruct->LastEvent, NewEventHdr, NewEventHdrSize);\r
   CopyMem (\r
-    *EventLogPtr + NewEventHdrSize,\r
+    EventLogAreaStruct->LastEvent + NewEventHdrSize,\r
     NewEventData,\r
     NewEventSize\r
     );\r
@@ -873,11 +932,8 @@ TcgDxeLogEvent (
     return EFI_VOLUME_FULL;\r
   }\r
 \r
-  EventLogAreaStruct->LastEvent = (UINT8*)(UINTN)EventLogAreaStruct->Lasa;\r
   Status = TcgCommLogEvent (\r
-             &EventLogAreaStruct->LastEvent,\r
-             &EventLogAreaStruct->EventLogSize,\r
-             (UINTN)EventLogAreaStruct->Laml,\r
+             EventLogAreaStruct,\r
              NewEventHdr,\r
              NewEventHdrSize,\r
              NewEventData,\r
@@ -907,11 +963,8 @@ TcgDxeLogEvent (
       return EFI_VOLUME_FULL;\r
     }\r
 \r
-    EventLogAreaStruct->LastEvent = (UINT8*)(UINTN)EventLogAreaStruct->Lasa;\r
     Status = TcgCommLogEvent (\r
-               &EventLogAreaStruct->LastEvent,\r
-               &EventLogAreaStruct->EventLogSize,\r
-               (UINTN)EventLogAreaStruct->Laml,\r
+               EventLogAreaStruct,\r
                NewEventHdr,\r
                NewEventHdrSize,\r
                NewEventData,\r
@@ -1138,11 +1191,25 @@ TcgDxeHashLogExtendEvent (
 {\r
   EFI_STATUS                        Status;\r
   TPML_DIGEST_VALUES                DigestList;\r
+  TCG_PCR_EVENT2_HDR                NoActionEvent;\r
 \r
   if (!mTcgDxeData.BsCap.TPMPresentFlag) {\r
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
+  if (NewEventHdr->EventType == EV_NO_ACTION) {\r
+    //\r
+    // Do not do TPM extend for EV_NO_ACTION\r
+    //\r
+    Status = EFI_SUCCESS;\r
+    InitNoActionEvent (&NoActionEvent, NewEventHdr->EventSize);\r
+    if ((Flags & EFI_TCG2_EXTEND_ONLY) == 0) {\r
+      Status = TcgDxeLogHashEvent (&(NoActionEvent.Digests), NewEventHdr, NewEventData);\r
+    }\r
+\r
+    return Status;\r
+  }\r
+\r
   Status = HashAndExtend (\r
              NewEventHdr->PCRIndex,\r
              HashData,\r
@@ -1202,7 +1269,13 @@ Tcg2HashLogExtendEvent (
 \r
   DEBUG ((DEBUG_VERBOSE, "Tcg2HashLogExtendEvent ...\n"));\r
 \r
-  if ((This == NULL) || (DataToHash == 0) || (Event == NULL)) {\r
+  if ((This == NULL) || (Event == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  //\r
+  // Do not check hash data size for EV_NO_ACTION event.\r
+  //\r
+  if ((Event->Header.EventType != EV_NO_ACTION) && (DataToHash == 0)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -1487,6 +1560,7 @@ SetupEventLog (
       }\r
       mTcgDxeData.EventLogAreaStruct[Index].Lasa = Lasa;\r
       mTcgDxeData.EventLogAreaStruct[Index].Laml = PcdGet32 (PcdTcgLogAreaMinLen);\r
+      mTcgDxeData.EventLogAreaStruct[Index].Next800155EventOffset = 0;\r
 \r
       if ((PcdGet8(PcdTpm2AcpiTableRev) >= 4) ||\r
           (mTcg2EventInfo[Index].LogFormat == EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)) {\r
@@ -1577,6 +1651,31 @@ SetupEventLog (
                    (UINT8 *)TcgEfiSpecIdEventStruct,\r
                    SpecIdEvent.EventSize\r
                    );\r
+        //\r
+        // record the offset at the end of 800-155 event.\r
+        // the future 800-155 event can be inserted here.\r
+        //\r
+        mTcgDxeData.EventLogAreaStruct[Index].Next800155EventOffset = \\r
+          mTcgDxeData.EventLogAreaStruct[Index].EventLogSize;\r
+\r
+        //\r
+        // Tcg800155PlatformIdEvent. Event format is TCG_PCR_EVENT2\r
+        //\r
+        GuidHob.Guid = GetFirstGuidHob (&gTcg800155PlatformIdEventHobGuid);\r
+        while (GuidHob.Guid != NULL) {\r
+          InitNoActionEvent(&NoActionEvent, GET_GUID_HOB_DATA_SIZE (GuidHob.Guid));\r
+\r
+          Status = TcgDxeLogEvent (\r
+                     mTcg2EventInfo[Index].LogFormat,\r
+                     &NoActionEvent,\r
+                     sizeof(NoActionEvent.PCRIndex) + sizeof(NoActionEvent.EventType) + GetDigestListBinSize (&NoActionEvent.Digests) + sizeof(NoActionEvent.EventSize),\r
+                     GET_GUID_HOB_DATA (GuidHob.Guid),\r
+                     GET_GUID_HOB_DATA_SIZE (GuidHob.Guid)\r
+                     );\r
+\r
+          GuidHob.Guid = GET_NEXT_HOB (GuidHob);\r
+          GuidHob.Guid = GetNextGuidHob (&gTcg800155PlatformIdEventHobGuid, GuidHob.Guid);\r
+        }\r
 \r
         //\r
         // EfiStartupLocalityEvent. Event format is TCG_PCR_EVENT2\r
@@ -1643,6 +1742,7 @@ SetupEventLog (
         mTcgDxeData.FinalEventLogAreaStruct[Index].LastEvent = (VOID *)(UINTN)mTcgDxeData.FinalEventLogAreaStruct[Index].Lasa;\r
         mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogStarted = FALSE;\r
         mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogTruncated = FALSE;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].Next800155EventOffset = 0;\r
 \r
         //\r
         // Install to configuration table for EFI_TCG2_EVENT_LOG_FORMAT_TCG_2\r
@@ -1663,6 +1763,7 @@ SetupEventLog (
         mTcgDxeData.FinalEventLogAreaStruct[Index].LastEvent = 0;\r
         mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogStarted = FALSE;\r
         mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogTruncated = FALSE;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].Next800155EventOffset = 0;\r
       }\r
     }\r
   }\r