/** @file Implement the InternalTpm12Detect() function on top of the Tpm12DeviceLib class. Copyright (C) 2020, Red Hat, Inc. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include "Tpm12Support.h" #pragma pack (1) typedef struct { TPM_RSP_COMMAND_HDR Hdr; TPM_CURRENT_TICKS CurrentTicks; } TPM_RSP_GET_TICKS; #pragma pack () /** Probe for the TPM for 1.2 version, by sending TPM1.2 GetTicks Sending a TPM1.2 command to a TPM2 should return a TPM1.2 header (tag = 0xc4) and error code (TPM_BADTAG = 0x1e) @retval EFI_SUCCESS TPM version 1.2 probing successful. @return Error codes propagated from Tpm12SubmitCommand(). **/ STATIC EFI_STATUS TestTpm12 ( ) { EFI_STATUS Status; TPM_RQU_COMMAND_HDR Command; TPM_RSP_GET_TICKS Response; UINT32 Length; Command.tag = SwapBytes16 (TPM_TAG_RQU_COMMAND); Command.paramSize = SwapBytes32 (sizeof (Command)); Command.ordinal = SwapBytes32 (TPM_ORD_GetTicks); Length = sizeof (Response); Status = Tpm12SubmitCommand (sizeof (Command), (UINT8 *)&Command, &Length, (UINT8 *)&Response); if (EFI_ERROR (Status)) { return Status; } return EFI_SUCCESS; } /** Detect the presence of a TPM with interface version 1.2. @retval EFI_SUCCESS TPM-1.2 available. The Tpm12RequestUseTpm() and Tpm12SubmitCommand(TPM_ORD_GetTicks) operations (from the Tpm12DeviceLib class) have succeeded. @return Error codes propagated from Tpm12RequestUseTpm() and Tpm12SubmitCommand(). **/ EFI_STATUS InternalTpm12Detect ( VOID ) { EFI_STATUS Status; Status = Tpm12RequestUseTpm (); if (EFI_ERROR (Status)) { return Status; } return TestTpm12 (); }