HII Config Access protocol implementation of TCG2 configuration module.\r
NOTE: This module is only for reference only, each platform should have its own setup page.\r
\r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "Tcg2ConfigImpl.h"\r
#include <Library/PcdLib.h>\r
#include <Library/Tpm2CommandLib.h>\r
+#include <Library/Tpm2DeviceLib.h>\r
+#include <Library/IoLib.h>\r
+\r
#include <Guid/TpmInstance.h>\r
\r
-#define EFI_TCG2_EVENT_LOG_FORMAT_ALL (EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 | EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)\r
+#include <IndustryStandard/TpmPtp.h>\r
+\r
+#define EFI_TCG2_EVENT_LOG_FORMAT_ALL (EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 | EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)\r
\r
TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1] = TPM_INSTANCE_ID_LIST;\r
\r
-TCG2_CONFIG_PRIVATE_DATA *mTcg2ConfigPrivateDate;\r
-TCG2_CONFIG_PRIVATE_DATA mTcg2ConfigPrivateDateTemplate = {\r
+TCG2_CONFIG_PRIVATE_DATA *mTcg2ConfigPrivateDate;\r
+TCG2_CONFIG_PRIVATE_DATA mTcg2ConfigPrivateDateTemplate = {\r
TCG2_CONFIG_PRIVATE_DATA_SIGNATURE,\r
{\r
Tcg2ExtractConfig,\r
}\r
};\r
\r
-HII_VENDOR_DEVICE_PATH mTcg2HiiVendorDevicePath = {\r
+HII_VENDOR_DEVICE_PATH mTcg2HiiVendorDevicePath = {\r
{\r
{\r
HARDWARE_DEVICE_PATH,\r
HW_VENDOR_DP,\r
{\r
- (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
- (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+ (UINT8)(sizeof (VENDOR_DEVICE_PATH)),\r
+ (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
}\r
},\r
TCG2_CONFIG_FORM_SET_GUID\r
{\r
END_DEVICE_PATH_TYPE,\r
END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
- { \r
- (UINT8) (END_DEVICE_PATH_LENGTH),\r
- (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+ {\r
+ (UINT8)(END_DEVICE_PATH_LENGTH),\r
+ (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)\r
}\r
}\r
};\r
\r
UINT8 mCurrentPpRequest;\r
\r
+/**\r
+ Return if PTP CRB is supported.\r
+\r
+ @param[in] Register Pointer to PTP register.\r
+\r
+ @retval TRUE PTP CRB is supported.\r
+ @retval FALSE PTP CRB is unsupported.\r
+**/\r
+BOOLEAN\r
+IsPtpCrbSupported (\r
+ IN VOID *Register\r
+ )\r
+{\r
+ PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
+\r
+ //\r
+ // Check interface id\r
+ //\r
+ InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
+\r
+ if (((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) ||\r
+ (InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO)) &&\r
+ (InterfaceId.Bits.CapCRB != 0))\r
+ {\r
+ return TRUE;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+/**\r
+ Return if PTP FIFO is supported.\r
+\r
+ @param[in] Register Pointer to PTP register.\r
+\r
+ @retval TRUE PTP FIFO is supported.\r
+ @retval FALSE PTP FIFO is unsupported.\r
+**/\r
+BOOLEAN\r
+IsPtpFifoSupported (\r
+ IN VOID *Register\r
+ )\r
+{\r
+ PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
+\r
+ //\r
+ // Check interface id\r
+ //\r
+ InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
+\r
+ if (((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) ||\r
+ (InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO)) &&\r
+ (InterfaceId.Bits.CapFIFO != 0))\r
+ {\r
+ return TRUE;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+/**\r
+ Set PTP interface type.\r
+ Do not update PcdActiveTpmInterfaceType here because interface change only happens on next _TPM_INIT\r
+\r
+ @param[in] Register Pointer to PTP register.\r
+ @param[in] PtpInterface PTP interface type.\r
+\r
+ @retval EFI_SUCCESS PTP interface type is set.\r
+ @retval EFI_INVALID_PARAMETER PTP interface type is invalid.\r
+ @retval EFI_UNSUPPORTED PTP interface type is unsupported.\r
+ @retval EFI_WRITE_PROTECTED PTP interface is locked.\r
+**/\r
+EFI_STATUS\r
+SetPtpInterface (\r
+ IN VOID *Register,\r
+ IN UINT8 PtpInterface\r
+ )\r
+{\r
+ TPM2_PTP_INTERFACE_TYPE PtpInterfaceCurrent;\r
+ PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
+\r
+ PtpInterfaceCurrent = PcdGet8 (PcdActiveTpmInterfaceType);\r
+ if ((PtpInterfaceCurrent != Tpm2PtpInterfaceFifo) &&\r
+ (PtpInterfaceCurrent != Tpm2PtpInterfaceCrb))\r
+ {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
+ if (InterfaceId.Bits.IntfSelLock != 0) {\r
+ return EFI_WRITE_PROTECTED;\r
+ }\r
+\r
+ switch (PtpInterface) {\r
+ case Tpm2PtpInterfaceFifo:\r
+ if (InterfaceId.Bits.CapFIFO == 0) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ InterfaceId.Bits.InterfaceSelector = PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_FIFO;\r
+ MmioWrite32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId, InterfaceId.Uint32);\r
+ return EFI_SUCCESS;\r
+ case Tpm2PtpInterfaceCrb:\r
+ if (InterfaceId.Bits.CapCRB == 0) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ InterfaceId.Bits.InterfaceSelector = PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_CRB;\r
+ MmioWrite32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId, InterfaceId.Uint32);\r
+ return EFI_SUCCESS;\r
+ default:\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+}\r
+\r
/**\r
This function allows a caller to extract the current configuration for one\r
or more named elements from the target driver.\r
EFI_STATUS\r
EFIAPI\r
Tcg2ExtractConfig (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN CONST EFI_STRING Request,\r
- OUT EFI_STRING *Progress,\r
- OUT EFI_STRING *Results\r
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+ IN CONST EFI_STRING Request,\r
+ OUT EFI_STRING *Progress,\r
+ OUT EFI_STRING *Results\r
)\r
{\r
- if (Progress == NULL || Results == NULL) {\r
+ if ((Progress == NULL) || (Results == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
**/\r
EFI_STATUS\r
SaveTcg2PpRequest (\r
- IN UINT8 PpRequest\r
+ IN UINT8 PpRequest\r
)\r
{\r
UINT32 ReturnCode;\r
ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
mCurrentPpRequest = PpRequest;\r
- Status = EFI_SUCCESS;\r
+ Status = EFI_SUCCESS;\r
} else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
Status = EFI_OUT_OF_RESOURCES;\r
} else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
**/\r
EFI_STATUS\r
SaveTcg2PpRequestParameter (\r
- IN UINT32 PpRequestParameter\r
+ IN UINT32 PpRequestParameter\r
)\r
{\r
UINT32 ReturnCode;\r
**/\r
EFI_STATUS\r
SaveTcg2PCRBanksRequest (\r
- IN UINTN PCRBankIndex,\r
- IN BOOLEAN Enable\r
+ IN UINTN PCRBankIndex,\r
+ IN BOOLEAN Enable\r
)\r
{\r
UINT32 ReturnCode;\r
} else {\r
mTcg2ConfigPrivateDate->PCRBanksDesired &= ~(0x1 << PCRBankIndex);\r
}\r
- \r
+\r
ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS, mTcg2ConfigPrivateDate->PCRBanksDesired);\r
if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
Status = EFI_SUCCESS;\r
EFI_STATUS\r
EFIAPI\r
Tcg2RouteConfig (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN CONST EFI_STRING Configuration,\r
- OUT EFI_STRING *Progress\r
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+ IN CONST EFI_STRING Configuration,\r
+ OUT EFI_STRING *Progress\r
)\r
{\r
- if (Configuration == NULL || Progress == NULL) {\r
+ if ((Configuration == NULL) || (Progress == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ *Progress = Configuration;\r
+\r
return EFI_NOT_FOUND;\r
}\r
\r
+/**\r
+ Get HID string of TPM2 ACPI device object\r
+\r
+ @param[in] Hid Points to HID String Buffer.\r
+ @param[in] Size HID String size in bytes. Must >= TPM_HID_ACPI_SIZE\r
+\r
+ @return HID String get status.\r
+\r
+**/\r
+EFI_STATUS\r
+GetTpm2HID (\r
+ CHAR8 *Hid,\r
+ UINTN Size\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINT32 ManufacturerID;\r
+ UINT32 FirmwareVersion1;\r
+ UINT32 FirmwareVersion2;\r
+ BOOLEAN PnpHID;\r
+\r
+ PnpHID = TRUE;\r
+\r
+ ZeroMem (Hid, Size);\r
+\r
+ //\r
+ // Get Manufacturer ID\r
+ //\r
+ Status = Tpm2GetCapabilityManufactureID (&ManufacturerID);\r
+ if (!EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_INFO, "TPM_PT_MANUFACTURER 0x%08x\n", ManufacturerID));\r
+ //\r
+ // ManufacturerID defined in TCG Vendor ID Registry\r
+ // may tailed with 0x00 or 0x20\r
+ //\r
+ if (((ManufacturerID >> 24) == 0x00) || ((ManufacturerID >> 24) == 0x20)) {\r
+ //\r
+ // HID containing PNP ID "NNN####"\r
+ // NNN is uppercase letter for Vendor ID specified by manufacturer\r
+ //\r
+ CopyMem (Hid, &ManufacturerID, 3);\r
+ } else {\r
+ //\r
+ // HID containing ACP ID "NNNN####"\r
+ // NNNN is uppercase letter for Vendor ID specified by manufacturer\r
+ //\r
+ CopyMem (Hid, &ManufacturerID, 4);\r
+ PnpHID = FALSE;\r
+ }\r
+ } else {\r
+ DEBUG ((DEBUG_ERROR, "Get TPM_PT_MANUFACTURER failed %x!\n", Status));\r
+ ASSERT (FALSE);\r
+ return Status;\r
+ }\r
+\r
+ Status = Tpm2GetCapabilityFirmwareVersion (&FirmwareVersion1, &FirmwareVersion2);\r
+ if (!EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_INFO, "TPM_PT_FIRMWARE_VERSION_1 0x%x\n", FirmwareVersion1));\r
+ DEBUG ((DEBUG_INFO, "TPM_PT_FIRMWARE_VERSION_2 0x%x\n", FirmwareVersion2));\r
+ //\r
+ // #### is Firmware Version 1\r
+ //\r
+ if (PnpHID) {\r
+ AsciiSPrint (Hid + 3, TPM_HID_PNP_SIZE - 3, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 & 0x0000FFFF));\r
+ } else {\r
+ AsciiSPrint (Hid + 4, TPM_HID_ACPI_SIZE - 4, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 & 0x0000FFFF));\r
+ }\r
+ } else {\r
+ DEBUG ((DEBUG_ERROR, "Get TPM_PT_FIRMWARE_VERSION_X failed %x!\n", Status));\r
+ ASSERT (FALSE);\r
+ return Status;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ This function processes the results of changes in configuration\r
+ for TCG2 version information.\r
+\r
+ @param[in] Action Specifies the type of action taken by the browser.\r
+ ASSERT if the Action is not EFI_BROWSER_ACTION_SUBMITTED.\r
+ @param[in] QuestionId A unique value which is sent to the original\r
+ exporting driver so that it can identify the type\r
+ of data to expect.\r
+ @param[in] Type The type of value for the question.\r
+ @param[in] Value A pointer to the data being sent to the original\r
+ exporting driver.\r
+\r
+ @retval EFI_SUCCESS The callback successfully handled the action.\r
+\r
+**/\r
+EFI_STATUS\r
+Tcg2VersionInfoCallback (\r
+ IN EFI_BROWSER_ACTION Action,\r
+ IN EFI_QUESTION_ID QuestionId,\r
+ IN UINT8 Type,\r
+ IN EFI_IFR_TYPE_VALUE *Value\r
+ )\r
+{\r
+ EFI_INPUT_KEY Key;\r
+ UINT64 PcdTcg2PpiVersion;\r
+ UINT8 PcdTpm2AcpiTableRev;\r
+\r
+ ASSERT (Action == EFI_BROWSER_ACTION_SUBMITTED);\r
+\r
+ if (QuestionId == KEY_TCG2_PPI_VERSION) {\r
+ //\r
+ // Get the PCD value after EFI_BROWSER_ACTION_SUBMITTED,\r
+ // the SetVariable to TCG2_VERSION_NAME should have been done.\r
+ // If the PCD value is not equal to the value set to variable,\r
+ // the PCD is not DynamicHii type and does not map to the setup option.\r
+ //\r
+ PcdTcg2PpiVersion = 0;\r
+ CopyMem (\r
+ &PcdTcg2PpiVersion,\r
+ PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
+ AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
+ );\r
+ if (PcdTcg2PpiVersion != Value->u64) {\r
+ CreatePopUp (\r
+ EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+ &Key,\r
+ L"WARNING: PcdTcgPhysicalPresenceInterfaceVer is not DynamicHii type and does not map to this option!",\r
+ L"The version configuring by this setup option will not work!",\r
+ NULL\r
+ );\r
+ }\r
+ } else if (QuestionId == KEY_TPM2_ACPI_REVISION) {\r
+ //\r
+ // Get the PCD value after EFI_BROWSER_ACTION_SUBMITTED,\r
+ // the SetVariable to TCG2_VERSION_NAME should have been done.\r
+ // If the PCD value is not equal to the value set to variable,\r
+ // the PCD is not DynamicHii type and does not map to the setup option.\r
+ //\r
+ PcdTpm2AcpiTableRev = PcdGet8 (PcdTpm2AcpiTableRev);\r
+\r
+ if (PcdTpm2AcpiTableRev != Value->u8) {\r
+ CreatePopUp (\r
+ EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+ &Key,\r
+ L"WARNING: PcdTpm2AcpiTableRev is not DynamicHii type and does not map to this option!",\r
+ L"The Revision configuring by this setup option will not work!",\r
+ NULL\r
+ );\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
/**\r
This function processes the results of changes in configuration.\r
\r
EFI_STATUS\r
EFIAPI\r
Tcg2Callback (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN EFI_BROWSER_ACTION Action,\r
- IN EFI_QUESTION_ID QuestionId,\r
- IN UINT8 Type,\r
- IN EFI_IFR_TYPE_VALUE *Value,\r
- OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+ IN EFI_BROWSER_ACTION Action,\r
+ IN EFI_QUESTION_ID QuestionId,\r
+ IN UINT8 Type,\r
+ IN EFI_IFR_TYPE_VALUE *Value,\r
+ OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
)\r
{\r
+ EFI_STATUS Status;\r
+ EFI_INPUT_KEY Key;\r
+ CHAR8 HidStr[16];\r
+ CHAR16 UnHidStr[16];\r
+ TCG2_CONFIG_PRIVATE_DATA *Private;\r
+\r
if ((This == NULL) || (Value == NULL) || (ActionRequest == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
+\r
+ Private = TCG2_CONFIG_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
+ //\r
+ // Update TPM2 HID info\r
+ //\r
+ if (QuestionId == KEY_TPM_DEVICE) {\r
+ Status = GetTpm2HID (HidStr, 16);\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Fail to get TPM2 HID\r
+ //\r
+ HiiSetString (Private->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_HID_CONTENT), L"Unknown", NULL);\r
+ } else {\r
+ AsciiStrToUnicodeStrS (HidStr, UnHidStr, 16);\r
+ HiiSetString (Private->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_HID_CONTENT), UnHidStr, NULL);\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
+ if (QuestionId == KEY_TPM_DEVICE_INTERFACE) {\r
+ Status = SetPtpInterface ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress), Value->u8);\r
+ if (EFI_ERROR (Status)) {\r
+ CreatePopUp (\r
+ EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+ &Key,\r
+ L"Error: Fail to set PTP interface!",\r
+ NULL\r
+ );\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+ }\r
+ }\r
+\r
if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
if (QuestionId == KEY_TPM_DEVICE) {\r
return EFI_SUCCESS;\r
}\r
+\r
if (QuestionId == KEY_TPM2_OPERATION) {\r
return SaveTcg2PpRequest (Value->u8);\r
}\r
+\r
if (QuestionId == KEY_TPM2_OPERATION_PARAMETER) {\r
return SaveTcg2PpRequestParameter (Value->u32);\r
}\r
+\r
if ((QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) {\r
- SaveTcg2PCRBanksRequest (QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0, Value->b);\r
+ return SaveTcg2PCRBanksRequest (QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0, Value->b);\r
+ }\r
+ }\r
+\r
+ if (Action == EFI_BROWSER_ACTION_SUBMITTED) {\r
+ if ((QuestionId == KEY_TCG2_PPI_VERSION) || (QuestionId == KEY_TPM2_ACPI_REVISION)) {\r
+ return Tcg2VersionInfoCallback (Action, QuestionId, Type, Value);\r
}\r
}\r
\r
)\r
{\r
switch (TpmAlgHash) {\r
- case TPM_ALG_SHA1:\r
- if (Buffer[0] != 0) {\r
- StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
- }\r
- StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1");\r
- break;\r
- case TPM_ALG_SHA256:\r
- if (Buffer[0] != 0) {\r
- StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
- }\r
- StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256");\r
- break;\r
- case TPM_ALG_SHA384:\r
- if (Buffer[0] != 0) {\r
- StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
- }\r
- StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384");\r
- break;\r
- case TPM_ALG_SHA512:\r
- if (Buffer[0] != 0) {\r
- StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
- }\r
- StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512");\r
- break;\r
- case TPM_ALG_SM3_256:\r
- if (Buffer[0] != 0) {\r
- StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
- }\r
- StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256");\r
- break;\r
+ case TPM_ALG_SHA1:\r
+ if (Buffer[0] != 0) {\r
+ StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
+ }\r
+\r
+ StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1");\r
+ break;\r
+ case TPM_ALG_SHA256:\r
+ if (Buffer[0] != 0) {\r
+ StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
+ }\r
+\r
+ StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256");\r
+ break;\r
+ case TPM_ALG_SHA384:\r
+ if (Buffer[0] != 0) {\r
+ StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
+ }\r
+\r
+ StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384");\r
+ break;\r
+ case TPM_ALG_SHA512:\r
+ if (Buffer[0] != 0) {\r
+ StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
+ }\r
+\r
+ StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512");\r
+ break;\r
+ case TPM_ALG_SM3_256:\r
+ if (Buffer[0] != 0) {\r
+ StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
+ }\r
+\r
+ StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256");\r
+ break;\r
}\r
}\r
\r
if (Buffer[0] != 0) {\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
}\r
+\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1");\r
}\r
+\r
if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA256) != 0) {\r
if (Buffer[0] != 0) {\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
}\r
+\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256");\r
}\r
+\r
if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA384) != 0) {\r
if (Buffer[0] != 0) {\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
}\r
+\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384");\r
}\r
+\r
if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA512) != 0) {\r
if (Buffer[0] != 0) {\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
}\r
+\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512");\r
}\r
+\r
if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SM3_256) != 0) {\r
if (Buffer[0] != 0) {\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
}\r
+\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256");\r
}\r
}\r
**/\r
VOID\r
SetConfigInfo (\r
- IN OUT TCG2_CONFIGURATION_INFO *Tcg2ConfigInfo,\r
- IN UINT32 TpmAlgHash\r
+ IN OUT TCG2_CONFIGURATION_INFO *Tcg2ConfigInfo,\r
+ IN UINT32 TpmAlgHash\r
)\r
{\r
switch (TpmAlgHash) {\r
- case TPM_ALG_SHA1:\r
- Tcg2ConfigInfo->Sha1Supported = TRUE;\r
- break;\r
- case TPM_ALG_SHA256:\r
- Tcg2ConfigInfo->Sha256Supported = TRUE;\r
- break;\r
- case TPM_ALG_SHA384:\r
- Tcg2ConfigInfo->Sha384Supported = TRUE;\r
- break;\r
- case TPM_ALG_SHA512:\r
- Tcg2ConfigInfo->Sha512Supported = TRUE;\r
- break;\r
- case TPM_ALG_SM3_256:\r
- Tcg2ConfigInfo->Sm3Supported = TRUE;\r
- break;\r
+ case TPM_ALG_SHA1:\r
+ Tcg2ConfigInfo->Sha1Supported = TRUE;\r
+ break;\r
+ case TPM_ALG_SHA256:\r
+ Tcg2ConfigInfo->Sha256Supported = TRUE;\r
+ break;\r
+ case TPM_ALG_SHA384:\r
+ Tcg2ConfigInfo->Sha384Supported = TRUE;\r
+ break;\r
+ case TPM_ALG_SHA512:\r
+ Tcg2ConfigInfo->Sha512Supported = TRUE;\r
+ break;\r
+ case TPM_ALG_SM3_256:\r
+ Tcg2ConfigInfo->Sm3Supported = TRUE;\r
+ break;\r
}\r
}\r
\r
if (Buffer[0] != 0) {\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
}\r
+\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"TCG_1_2");\r
}\r
+\r
if ((TCG2EventLogFormat & EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) != 0) {\r
if (Buffer[0] != 0) {\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
}\r
+\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"TCG_2");\r
}\r
+\r
if ((TCG2EventLogFormat & (~EFI_TCG2_EVENT_LOG_FORMAT_ALL)) != 0) {\r
if (Buffer[0] != 0) {\r
StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
}\r
- StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"UNKNOWN");\r
- }\r
-}\r
-\r
-/**\r
- Check if buffer is all zero.\r
-\r
- @param[in] Buffer Buffer to be checked.\r
- @param[in] BufferSize Size of buffer to be checked.\r
\r
- @retval TRUE Buffer is all zero.\r
- @retval FALSE Buffer is not all zero.\r
-**/\r
-BOOLEAN\r
-IsZeroBuffer (\r
- IN VOID *Buffer,\r
- IN UINTN BufferSize\r
- )\r
-{\r
- UINT8 *BufferData;\r
- UINTN Index;\r
-\r
- BufferData = Buffer;\r
- for (Index = 0; Index < BufferSize; Index++) {\r
- if (BufferData[Index] != 0) {\r
- return FALSE;\r
- }\r
+ StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"UNKNOWN");\r
}\r
- return TRUE;\r
}\r
\r
/**\r
TPML_PCR_SELECTION Pcrs;\r
CHAR16 TempBuffer[1024];\r
TCG2_CONFIGURATION_INFO Tcg2ConfigInfo;\r
+ TPM2_PTP_INTERFACE_TYPE TpmDeviceInterfaceDetected;\r
+ BOOLEAN IsCmdImp = FALSE;\r
\r
DriverHandle = NULL;\r
ConfigAccess = &PrivateData->ConfigAccess;\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &DriverHandle,\r
- &gEfiDevicePathProtocolGuid,\r
- &mTcg2HiiVendorDevicePath,\r
- &gEfiHiiConfigAccessProtocolGuid,\r
- ConfigAccess,\r
- NULL\r
- );\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
+ &DriverHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ &mTcg2HiiVendorDevicePath,\r
+ &gEfiHiiConfigAccessProtocolGuid,\r
+ ConfigAccess,\r
+ NULL\r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
&gEfiHiiConfigAccessProtocolGuid,\r
ConfigAccess,\r
NULL\r
- ); \r
+ );\r
\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- \r
+\r
PrivateData->HiiHandle = HiiHandle;\r
\r
//\r
// Update static data\r
//\r
switch (PrivateData->TpmDeviceDetected) {\r
- case TPM_DEVICE_NULL:\r
- HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Not Found", NULL);\r
- break;\r
- case TPM_DEVICE_1_2:\r
- HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"TPM 1.2", NULL);\r
- break;\r
- case TPM_DEVICE_2_0_DTPM:\r
- HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"TPM 2.0 (DTPM)", NULL);\r
- break;\r
- default:\r
- HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Unknown", NULL);\r
- break;\r
- }\r
-\r
- ZeroMem (&Tcg2ConfigInfo, sizeof(Tcg2ConfigInfo));\r
+ case TPM_DEVICE_NULL:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Not Found", NULL);\r
+ break;\r
+ case TPM_DEVICE_1_2:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"TPM 1.2", NULL);\r
+ break;\r
+ case TPM_DEVICE_2_0_DTPM:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"TPM 2.0", NULL);\r
+ break;\r
+ default:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Unknown", NULL);\r
+ break;\r
+ }\r
+\r
+ ZeroMem (&Tcg2ConfigInfo, sizeof (Tcg2ConfigInfo));\r
Status = Tpm2GetCapabilityPcrs (&Pcrs);\r
if (EFI_ERROR (Status)) {\r
HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACTIVE_HASH_ALGO_CONTENT), L"[Unknown]", NULL);\r
TempBuffer[0] = 0;\r
for (Index = 0; Index < Pcrs.count; Index++) {\r
if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
- AppendBufferWithTpmAlgHash (TempBuffer, sizeof(TempBuffer), Pcrs.pcrSelections[Index].hash);\r
+ AppendBufferWithTpmAlgHash (TempBuffer, sizeof (TempBuffer), Pcrs.pcrSelections[Index].hash);\r
}\r
}\r
+\r
HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACTIVE_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
\r
TempBuffer[0] = 0;\r
for (Index = 0; Index < Pcrs.count; Index++) {\r
- AppendBufferWithTpmAlgHash (TempBuffer, sizeof(TempBuffer), Pcrs.pcrSelections[Index].hash);\r
+ AppendBufferWithTpmAlgHash (TempBuffer, sizeof (TempBuffer), Pcrs.pcrSelections[Index].hash);\r
SetConfigInfo (&Tcg2ConfigInfo, Pcrs.pcrSelections[Index].hash);\r
}\r
+\r
HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_SUPPORTED_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
}\r
\r
- FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PcdGet32 (PcdTcg2HashAlgorithmBitmap));\r
+ Status = Tpm2GetCapabilityIsCommandImplemented (TPM_CC_ChangeEPS, &IsCmdImp);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Tpm2GetCapabilityIsCmdImpl fails %r\n", Status));\r
+ }\r
+\r
+ Tcg2ConfigInfo.ChangeEPSSupported = IsCmdImp;\r
+\r
+ FillBufferWithBootHashAlg (TempBuffer, sizeof (TempBuffer), PcdGet32 (PcdTcg2HashAlgorithmBitmap));\r
HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_BIOS_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
\r
//\r
// Tcg2 Capability\r
//\r
- FillBufferWithTCG2EventLogFormat (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.SupportedEventLogs);\r
+ FillBufferWithTCG2EventLogFormat (TempBuffer, sizeof (TempBuffer), PrivateData->ProtocolCapability.SupportedEventLogs);\r
HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_SUPPORTED_EVENT_LOG_FORMAT_CONTENT), TempBuffer, NULL);\r
\r
- FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.HashAlgorithmBitmap);\r
+ FillBufferWithBootHashAlg (TempBuffer, sizeof (TempBuffer), PrivateData->ProtocolCapability.HashAlgorithmBitmap);\r
HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_HASH_ALGO_BITMAP_CONTENT), TempBuffer, NULL);\r
\r
UnicodeSPrint (TempBuffer, sizeof (TempBuffer), L"%d", PrivateData->ProtocolCapability.NumberOfPCRBanks);\r
HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_NUMBER_OF_PCR_BANKS_CONTENT), TempBuffer, NULL);\r
\r
- FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.ActivePcrBanks);\r
+ FillBufferWithBootHashAlg (TempBuffer, sizeof (TempBuffer), PrivateData->ProtocolCapability.ActivePcrBanks);\r
HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_ACTIVE_PCR_BANKS_CONTENT), TempBuffer, NULL);\r
\r
+ //\r
+ // Update TPM device interface type\r
+ //\r
+ if (PrivateData->TpmDeviceDetected == TPM_DEVICE_2_0_DTPM) {\r
+ TpmDeviceInterfaceDetected = PcdGet8 (PcdActiveTpmInterfaceType);\r
+ switch (TpmDeviceInterfaceDetected) {\r
+ case Tpm2PtpInterfaceTis:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"TIS", NULL);\r
+ break;\r
+ case Tpm2PtpInterfaceFifo:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP FIFO", NULL);\r
+ break;\r
+ case Tpm2PtpInterfaceCrb:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP CRB", NULL);\r
+ break;\r
+ default:\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"Unknown", NULL);\r
+ break;\r
+ }\r
+\r
+ Tcg2ConfigInfo.TpmDeviceInterfaceAttempt = TpmDeviceInterfaceDetected;\r
+ switch (TpmDeviceInterfaceDetected) {\r
+ case Tpm2PtpInterfaceTis:\r
+ Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = FALSE;\r
+ Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported = FALSE;\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), L"TIS", NULL);\r
+ break;\r
+ case Tpm2PtpInterfaceFifo:\r
+ case Tpm2PtpInterfaceCrb:\r
+ Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = IsPtpFifoSupported ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress));\r
+ Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported = IsPtpCrbSupported ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress));\r
+ TempBuffer[0] = 0;\r
+ if (Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported) {\r
+ if (TempBuffer[0] != 0) {\r
+ StrCatS (TempBuffer, sizeof (TempBuffer) / sizeof (CHAR16), L", ");\r
+ }\r
+\r
+ StrCatS (TempBuffer, sizeof (TempBuffer) / sizeof (CHAR16), L"PTP FIFO");\r
+ }\r
+\r
+ if (Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported) {\r
+ if (TempBuffer[0] != 0) {\r
+ StrCatS (TempBuffer, sizeof (TempBuffer) / sizeof (CHAR16), L", ");\r
+ }\r
+\r
+ StrCatS (TempBuffer, sizeof (TempBuffer) / sizeof (CHAR16), L"PTP CRB");\r
+ }\r
+\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), TempBuffer, NULL);\r
+ break;\r
+ default:\r
+ Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = FALSE;\r
+ Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported = FALSE;\r
+ HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), L"Unknown", NULL);\r
+ break;\r
+ }\r
+ }\r
+\r
//\r
// Set ConfigInfo, to control the check box.\r
//\r
TCG2_STORAGE_INFO_NAME,\r
&gTcg2ConfigFormSetGuid,\r
EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof(Tcg2ConfigInfo),\r
+ sizeof (Tcg2ConfigInfo),\r
&Tcg2ConfigInfo\r
);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_INFO_NAME\n"));\r
+ DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_INFO_NAME\n"));\r
}\r
- return EFI_SUCCESS; \r
+\r
+ return EFI_SUCCESS;\r
}\r
\r
/**\r
**/\r
VOID\r
UninstallTcg2ConfigForm (\r
- IN OUT TCG2_CONFIG_PRIVATE_DATA *PrivateData\r
+ IN OUT TCG2_CONFIG_PRIVATE_DATA *PrivateData\r
)\r
{\r
//\r
);\r
PrivateData->DriverHandle = NULL;\r
}\r
- \r
+\r
FreePool (PrivateData);\r
}\r