/** @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 <Library/BaseLib.h> | |
#include <Library/Tpm12DeviceLib.h> | |
#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 (); | |
} |