Add security package to repository.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12261 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
1212
SecurityPkg/Tcg/TcgDxe/TcgDxe.c
Normal file
1212
SecurityPkg/Tcg/TcgDxe/TcgDxe.c
Normal file
File diff suppressed because it is too large
Load Diff
70
SecurityPkg/Tcg/TcgDxe/TcgDxe.inf
Normal file
70
SecurityPkg/Tcg/TcgDxe/TcgDxe.inf
Normal file
@@ -0,0 +1,70 @@
|
||||
## @file
|
||||
# Component file for module TcgDxe.
|
||||
# This module will produce TCG protocol and measure boot environment.
|
||||
#
|
||||
# Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = TcgDxe
|
||||
FILE_GUID = A5683620-7998-4bb2-A377-1C1E31E1E215
|
||||
MODULE_TYPE = DXE_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
ENTRY_POINT = DriverEntry
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF
|
||||
#
|
||||
|
||||
[Sources]
|
||||
TcgDxe.c
|
||||
TisDxe.c
|
||||
TpmComm.c
|
||||
TpmComm.h
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
MdeModulePkg/MdeModulePkg.dec
|
||||
SecurityPkg/SecurityPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
MemoryAllocationLib
|
||||
BaseLib
|
||||
UefiBootServicesTableLib
|
||||
HobLib
|
||||
UefiDriverEntryPoint
|
||||
UefiRuntimeServicesTableLib
|
||||
BaseMemoryLib
|
||||
DebugLib
|
||||
TpmCommLib
|
||||
PrintLib
|
||||
UefiLib
|
||||
|
||||
[Guids]
|
||||
gEfiSmbiosTableGuid # ALWAYS_CONSUMED
|
||||
gEfiGlobalVariableGuid # ALWAYS_CONSUMED
|
||||
gTcgEventEntryHobGuid
|
||||
gEfiEventReadyToBootGuid
|
||||
gEfiEventExitBootServicesGuid
|
||||
|
||||
[Protocols]
|
||||
gEfiTcgProtocolGuid ## PRODUCES
|
||||
gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
|
||||
[Pcd]
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdTpmPlatformClass
|
||||
|
||||
[Depex]
|
||||
TRUE
|
||||
|
432
SecurityPkg/Tcg/TcgDxe/TisDxe.c
Normal file
432
SecurityPkg/Tcg/TcgDxe/TisDxe.c
Normal file
@@ -0,0 +1,432 @@
|
||||
/** @file
|
||||
TIS (TPM Interface Specification) functions used by TPM Dxe driver.
|
||||
|
||||
Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <IndustryStandard/Tpm12.h>
|
||||
#include <Library/TimerLib.h>
|
||||
#include <Library/TpmCommLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
|
||||
STATIC UINT8 TpmCommandBuf[TPMCMDBUFLENGTH];
|
||||
|
||||
/**
|
||||
Send command to TPM for execution.
|
||||
|
||||
@param[in] TisReg TPM register space base address.
|
||||
@param[in] TpmBuffer Buffer for TPM command data.
|
||||
@param[in] DataLength TPM command data length.
|
||||
|
||||
@retval EFI_SUCCESS Operation completed successfully.
|
||||
@retval EFI_TIMEOUT The register can't run into the expected status in time.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
TisPcSend (
|
||||
IN TIS_PC_REGISTERS_PTR TisReg,
|
||||
IN UINT8 *TpmBuffer,
|
||||
IN UINT32 DataLength
|
||||
)
|
||||
{
|
||||
UINT16 BurstCount;
|
||||
UINT32 Index;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = TisPcPrepareCommand (TisReg);
|
||||
if (EFI_ERROR (Status)){
|
||||
DEBUG ((DEBUG_ERROR, "The Tpm not ready!\n"));
|
||||
return Status;
|
||||
}
|
||||
Index = 0;
|
||||
while (Index < DataLength) {
|
||||
Status = TisPcReadBurstCount (TisReg, &BurstCount);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_TIMEOUT;
|
||||
}
|
||||
for (; BurstCount > 0 && Index < DataLength; BurstCount--) {
|
||||
MmioWrite8 ((UINTN) &TisReg->DataFifo, *(TpmBuffer + Index));
|
||||
Index++;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Ensure the Tpm status STS_EXPECT change from 1 to 0
|
||||
//
|
||||
Status = TisPcWaitRegisterBits (
|
||||
&TisReg->Status,
|
||||
(UINT8) TIS_PC_VALID,
|
||||
TIS_PC_STS_EXPECT,
|
||||
TIS_TIMEOUT_C
|
||||
);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Receive response data of last command from TPM.
|
||||
|
||||
@param[in] TisReg TPM register space base address.
|
||||
@param[out] TpmBuffer Buffer for response data.
|
||||
@param[out] RespSize Response data length.
|
||||
|
||||
@retval EFI_SUCCESS Operation completed successfully.
|
||||
@retval EFI_TIMEOUT The register can't run into the expected status in time.
|
||||
@retval EFI_DEVICE_ERROR Unexpected device status.
|
||||
@retval EFI_BUFFER_TOO_SMALL Response data is too long.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
TisPcReceive (
|
||||
IN TIS_PC_REGISTERS_PTR TisReg,
|
||||
OUT UINT8 *TpmBuffer,
|
||||
OUT UINT32 *RespSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT16 BurstCount;
|
||||
UINT32 Index;
|
||||
UINT32 ResponseSize;
|
||||
UINT32 Data32;
|
||||
|
||||
//
|
||||
// Wait for the command completion
|
||||
//
|
||||
Status = TisPcWaitRegisterBits (
|
||||
&TisReg->Status,
|
||||
(UINT8) (TIS_PC_VALID | TIS_PC_STS_DATA),
|
||||
0,
|
||||
TIS_TIMEOUT_B
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_TIMEOUT;
|
||||
}
|
||||
//
|
||||
// Read the response data header and check it
|
||||
//
|
||||
Index = 0;
|
||||
BurstCount = 0;
|
||||
while (Index < sizeof (TPM_RSP_COMMAND_HDR)) {
|
||||
Status = TisPcReadBurstCount (TisReg, &BurstCount);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_TIMEOUT;
|
||||
}
|
||||
for (; BurstCount > 0 ; BurstCount--) {
|
||||
*(TpmBuffer + Index) = MmioRead8 ((UINTN) &TisReg->DataFifo);
|
||||
Index++;
|
||||
if (Index == sizeof (TPM_RSP_COMMAND_HDR))
|
||||
break;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Check the reponse data header (tag,parasize and returncode )
|
||||
//
|
||||
CopyMem (&Data32, (TpmBuffer + 2), sizeof (UINT32));
|
||||
ResponseSize = SwapBytes32 (Data32);
|
||||
*RespSize = ResponseSize;
|
||||
if (ResponseSize == sizeof (TPM_RSP_COMMAND_HDR)) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
if (ResponseSize < sizeof (TPM_RSP_COMMAND_HDR)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
if (ResponseSize > TPMCMDBUFLENGTH) {
|
||||
return EFI_BUFFER_TOO_SMALL;
|
||||
}
|
||||
//
|
||||
// Continue reading the remaining data
|
||||
//
|
||||
while (Index < ResponseSize) {
|
||||
for (; BurstCount > 0 ; BurstCount--) {
|
||||
*(TpmBuffer + Index) = MmioRead8 ((UINTN) &TisReg->DataFifo);
|
||||
Index++;
|
||||
if (Index == ResponseSize) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
Status = TisPcReadBurstCount (TisReg, &BurstCount);
|
||||
if (EFI_ERROR (Status) && (Index < ResponseSize)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
}
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Format TPM command data according to the format control character.
|
||||
|
||||
@param[in] FmtChar Format control character.
|
||||
@param[in, out] ap List of arguments.
|
||||
@param[in] TpmBuffer Buffer for TPM command data.
|
||||
@param[out] DataLength TPM command data length.
|
||||
|
||||
@retval EFI_SUCCESS Operation completed successfully.
|
||||
@retval EFI_INVALID_PARAMETER Invalid format control character.
|
||||
@retval EFI_BUFFER_TOO_SMALL Buffer too small for command data.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
TisPcSendV (
|
||||
IN UINT8 FmtChar,
|
||||
IN OUT VA_LIST *ap,
|
||||
UINT8 *TpmBuffer,
|
||||
UINT32 *DataLength
|
||||
)
|
||||
{
|
||||
UINT8 DataByte;
|
||||
UINT16 DataWord;
|
||||
UINT32 DataDword;
|
||||
TPM_RQU_COMMAND_HDR TpmCmdHdr;
|
||||
TPM_RQU_COMMAND_HDR *TpmCmdPtr;
|
||||
UINTN Size;
|
||||
UINT8 *Raw;
|
||||
|
||||
switch (FmtChar) {
|
||||
|
||||
case 'b':
|
||||
DataByte = VA_ARG (*ap, UINT8);
|
||||
Raw = &DataByte;
|
||||
Size = sizeof (DataByte);
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
DataWord = VA_ARG (*ap, UINT16);
|
||||
DataWord = SwapBytes16 (DataWord);
|
||||
Raw = (UINT8*)&DataWord;
|
||||
Size = sizeof (DataWord);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
DataDword = VA_ARG (*ap, UINT32);
|
||||
DataDword = SwapBytes32 (DataDword);
|
||||
Raw = (UINT8*)&DataDword;
|
||||
Size = sizeof (DataDword);
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
TpmCmdPtr = VA_ARG (*ap, TPM_RQU_COMMAND_HDR*);
|
||||
TpmCmdHdr.tag = SwapBytes16 (TpmCmdPtr->tag);
|
||||
TpmCmdHdr.paramSize = SwapBytes32 (TpmCmdPtr->paramSize);
|
||||
TpmCmdHdr.ordinal = SwapBytes32 (TpmCmdPtr->ordinal);
|
||||
Raw = (UINT8*) &TpmCmdHdr;
|
||||
Size = sizeof (TpmCmdHdr);
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
Raw = VA_ARG (*ap, UINT8*);
|
||||
Size = VA_ARG (*ap, UINTN);
|
||||
break;
|
||||
|
||||
case '\0':
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
||||
default:
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if(*DataLength + (UINT32) Size > TPMCMDBUFLENGTH) {
|
||||
return EFI_BUFFER_TOO_SMALL;
|
||||
}
|
||||
CopyMem (TpmBuffer + *DataLength, Raw, Size);
|
||||
*DataLength += (UINT32) Size;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Format reponse data according to the format control character.
|
||||
|
||||
@param[in] FmtChar Format control character.
|
||||
@param[in, out] ap List of arguments.
|
||||
@param[out] TpmBuffer Buffer for reponse data.
|
||||
@param[in, out] DataIndex Data offset in reponse data buffer.
|
||||
@param[in] RespSize Response data length.
|
||||
@param[out] DataFinished Reach the end of Response data.
|
||||
|
||||
@retval EFI_SUCCESS Operation completed successfully.
|
||||
@retval EFI_INVALID_PARAMETER Invalid format control character.
|
||||
@retval EFI_BUFFER_TOO_SMALL Buffer too small for command data.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
TisPcReceiveV (
|
||||
IN UINT8 FmtChar,
|
||||
IN OUT VA_LIST *ap,
|
||||
OUT UINT8 *TpmBuffer,
|
||||
IN OUT UINT32 *DataIndex,
|
||||
IN UINT32 RespSize,
|
||||
OUT BOOLEAN *DataFinished
|
||||
)
|
||||
{
|
||||
UINT8 *Raw;
|
||||
TPM_RSP_COMMAND_HDR *TpmRspPtr;
|
||||
UINTN Size;
|
||||
|
||||
Raw = VA_ARG (*ap, UINT8*);
|
||||
switch (FmtChar) {
|
||||
|
||||
case 'b':
|
||||
Size = sizeof (UINT8);
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
Size = sizeof (UINT16);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
Size = sizeof (UINT32);
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
Size = sizeof (*TpmRspPtr);
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
Size = VA_ARG (*ap, UINTN);
|
||||
if(*DataIndex + (UINT32) Size <= RespSize) {
|
||||
break;
|
||||
}
|
||||
*DataFinished = TRUE;
|
||||
if (*DataIndex >= RespSize) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
CopyMem (Raw, TpmBuffer + *DataIndex, RespSize - *DataIndex);
|
||||
*DataIndex += RespSize - *DataIndex;
|
||||
return EFI_SUCCESS;
|
||||
|
||||
case '\0':
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
||||
default:
|
||||
return EFI_WARN_UNKNOWN_GLYPH;
|
||||
}
|
||||
|
||||
if(*DataIndex + (UINT32) Size > RespSize) {
|
||||
*DataFinished = TRUE;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if( *DataIndex + (UINT32) Size > TPMCMDBUFLENGTH )
|
||||
return EFI_BUFFER_TOO_SMALL;
|
||||
|
||||
CopyMem (Raw, TpmBuffer + *DataIndex, Size);
|
||||
*DataIndex += (UINT32) Size;
|
||||
|
||||
switch (FmtChar) {
|
||||
|
||||
case 'w':
|
||||
*(UINT16*)Raw = SwapBytes16 (*(UINT16*) Raw);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
*(UINT32*)Raw = SwapBytes32 (*(UINT32*) Raw);
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
TpmRspPtr = (TPM_RSP_COMMAND_HDR*) Raw;
|
||||
TpmRspPtr->tag = SwapBytes16 (TpmRspPtr->tag);
|
||||
TpmRspPtr->paramSize = SwapBytes32 (TpmRspPtr->paramSize);
|
||||
TpmRspPtr->returnCode = SwapBytes32 (TpmRspPtr->returnCode);
|
||||
break;
|
||||
}
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Send formatted command to TPM for execution and return formatted data from response.
|
||||
|
||||
@param[in] TisReg TPM Handle.
|
||||
@param[in] Fmt Format control string.
|
||||
@param[in] ... The variable argument list.
|
||||
|
||||
@retval EFI_SUCCESS Operation completed successfully.
|
||||
@retval EFI_TIMEOUT The register can't run into the expected status in time.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
TisPcExecute (
|
||||
IN TIS_TPM_HANDLE TisReg,
|
||||
IN CONST CHAR8 *Fmt,
|
||||
...
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
VA_LIST Ap;
|
||||
UINT32 BufSize;
|
||||
UINT32 ResponseSize;
|
||||
BOOLEAN DataFinished;
|
||||
|
||||
VA_START (Ap, Fmt);
|
||||
|
||||
//
|
||||
// Put the formatted command to the TpmCommandBuf
|
||||
//
|
||||
BufSize = 0;
|
||||
while (*Fmt != '\0') {
|
||||
if (*Fmt == '%') Fmt++;
|
||||
if (*Fmt == '/') break;
|
||||
Status = TisPcSendV (*Fmt, &Ap, TpmCommandBuf, &BufSize);
|
||||
if (EFI_ERROR( Status )) {
|
||||
return Status;
|
||||
}
|
||||
Fmt++;
|
||||
}
|
||||
//
|
||||
// Send the command to TPM
|
||||
//
|
||||
Status = TisPcSend (TisReg, TpmCommandBuf, BufSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
//
|
||||
// Ensure the TPM state change from "Reception" to "Idle/Ready"
|
||||
//
|
||||
MmioWrite8 ((UINTN) &(((TIS_PC_REGISTERS_PTR) TisReg)->Status), TIS_PC_STS_READY);
|
||||
return Status;
|
||||
}
|
||||
|
||||
MmioWrite8 ((UINTN) &(((TIS_PC_REGISTERS_PTR) TisReg)->Status), TIS_PC_STS_GO);
|
||||
Fmt++;
|
||||
//
|
||||
// Receive the response data from TPM
|
||||
//
|
||||
ZeroMem (TpmCommandBuf, TPMCMDBUFLENGTH);
|
||||
Status = TisPcReceive (TisReg, TpmCommandBuf, &ResponseSize);
|
||||
//
|
||||
// Ensure the TPM state change from "Execution" or "Completion" to "Idle/Ready"
|
||||
//
|
||||
MmioWrite8 ((UINTN) &(((TIS_PC_REGISTERS_PTR) TisReg)->Status), TIS_PC_STS_READY);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the formatted data from the TpmCommandBuf.
|
||||
//
|
||||
BufSize =0;
|
||||
DataFinished = FALSE;
|
||||
while (*Fmt != '\0') {
|
||||
if (*Fmt == '%') {
|
||||
Fmt++;
|
||||
}
|
||||
Status = TisPcReceiveV (*Fmt, &Ap, TpmCommandBuf, &BufSize, ResponseSize, &DataFinished);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
if (DataFinished) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
Fmt++;
|
||||
}
|
||||
|
||||
VA_END (Ap);
|
||||
return Status;
|
||||
}
|
||||
|
163
SecurityPkg/Tcg/TcgDxe/TpmComm.c
Normal file
163
SecurityPkg/Tcg/TcgDxe/TpmComm.c
Normal file
@@ -0,0 +1,163 @@
|
||||
/** @file
|
||||
Utility functions used by TPM Dxe driver.
|
||||
|
||||
Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <IndustryStandard/Tpm12.h>
|
||||
#include <IndustryStandard/UefiTcgPlatform.h>
|
||||
#include <Library/TpmCommLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
|
||||
#include "TpmComm.h"
|
||||
|
||||
/**
|
||||
Extend a TPM PCR.
|
||||
|
||||
@param[in] TpmHandle TPM handle.
|
||||
@param[in] DigestToExtend The 160 bit value representing the event to be recorded.
|
||||
@param[in] PcrIndex The PCR to be updated.
|
||||
@param[out] NewPcrValue New PCR value after extend.
|
||||
|
||||
@retval EFI_SUCCESS Operation completed successfully.
|
||||
@retval EFI_DEVICE_ERROR The command was unsuccessful.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
TpmCommExtend (
|
||||
IN TIS_TPM_HANDLE TpmHandle,
|
||||
IN TPM_DIGEST *DigestToExtend,
|
||||
IN TPM_PCRINDEX PcrIndex,
|
||||
OUT TPM_DIGEST *NewPcrValue
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
TPM_DIGEST NewValue;
|
||||
TPM_RQU_COMMAND_HDR CmdHdr;
|
||||
TPM_RSP_COMMAND_HDR RspHdr;
|
||||
|
||||
if (NewPcrValue == NULL) {
|
||||
NewPcrValue = &NewValue;
|
||||
}
|
||||
|
||||
CmdHdr.tag = TPM_TAG_RQU_COMMAND;
|
||||
CmdHdr.paramSize =
|
||||
sizeof (CmdHdr) + sizeof (PcrIndex) + sizeof (*DigestToExtend);
|
||||
CmdHdr.ordinal = TPM_ORD_Extend;
|
||||
Status = TisPcExecute (
|
||||
TpmHandle,
|
||||
"%h%d%r%/%h%r",
|
||||
&CmdHdr,
|
||||
PcrIndex,
|
||||
DigestToExtend,
|
||||
(UINTN)sizeof (*DigestToExtend),
|
||||
&RspHdr,
|
||||
NewPcrValue,
|
||||
(UINTN)sizeof (*NewPcrValue)
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
if (RspHdr.returnCode != 0) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Get TPM capability flags.
|
||||
|
||||
@param[in] TpmHandle TPM handle.
|
||||
@param[in] FlagSubcap Flag subcap.
|
||||
@param[out] FlagBuffer Pointer to the buffer for returned flag structure.
|
||||
@param[in] FlagSize Size of the buffer.
|
||||
|
||||
@retval EFI_SUCCESS Operation completed successfully.
|
||||
@retval EFI_DEVICE_ERROR The command was unsuccessful.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
TpmCommGetFlags (
|
||||
IN TIS_TPM_HANDLE TpmHandle,
|
||||
IN UINT32 FlagSubcap,
|
||||
OUT VOID *FlagBuffer,
|
||||
IN UINTN FlagSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
TPM_RQU_COMMAND_HDR CmdHdr;
|
||||
TPM_RSP_COMMAND_HDR RspHdr;
|
||||
UINT32 Size;
|
||||
|
||||
CmdHdr.tag = TPM_TAG_RQU_COMMAND;
|
||||
CmdHdr.paramSize = sizeof (CmdHdr) + sizeof (UINT32) * 3;
|
||||
CmdHdr.ordinal = TPM_ORD_GetCapability;
|
||||
|
||||
Status = TisPcExecute (
|
||||
TpmHandle,
|
||||
"%h%d%d%d%/%h%d%r",
|
||||
&CmdHdr,
|
||||
TPM_CAP_FLAG,
|
||||
sizeof (FlagSubcap),
|
||||
FlagSubcap,
|
||||
&RspHdr,
|
||||
&Size,
|
||||
FlagBuffer,
|
||||
FlagSize
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
if (RspHdr.returnCode != 0) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Add a new entry to the Event Log.
|
||||
|
||||
@param[in, out] EventLogPtr Pointer to the Event Log data.
|
||||
@param[in, out] LogSize Size of the Event Log.
|
||||
@param[in] MaxSize Maximum size of the Event Log.
|
||||
@param[in] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR data structure.
|
||||
@param[in] NewEventData Pointer to the new event data.
|
||||
|
||||
@retval EFI_SUCCESS The new event log entry was added.
|
||||
@retval EFI_OUT_OF_RESOURCES No enough memory to log the new event.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
TpmCommLogEvent (
|
||||
IN OUT UINT8 **EventLogPtr,
|
||||
IN OUT UINTN *LogSize,
|
||||
IN UINTN MaxSize,
|
||||
IN TCG_PCR_EVENT_HDR *NewEventHdr,
|
||||
IN UINT8 *NewEventData
|
||||
)
|
||||
{
|
||||
UINT32 NewLogSize;
|
||||
|
||||
NewLogSize = sizeof (*NewEventHdr) + NewEventHdr->EventSize;
|
||||
if (NewLogSize + *LogSize > MaxSize) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
*EventLogPtr += *LogSize;
|
||||
*LogSize += NewLogSize;
|
||||
CopyMem (*EventLogPtr, NewEventHdr, sizeof (*NewEventHdr));
|
||||
CopyMem (
|
||||
*EventLogPtr + sizeof (*NewEventHdr),
|
||||
NewEventData,
|
||||
NewEventHdr->EventSize
|
||||
);
|
||||
return EFI_SUCCESS;
|
||||
}
|
99
SecurityPkg/Tcg/TcgDxe/TpmComm.h
Normal file
99
SecurityPkg/Tcg/TcgDxe/TpmComm.h
Normal file
@@ -0,0 +1,99 @@
|
||||
/** @file
|
||||
Definitions and function prototypes used by TPM DXE driver.
|
||||
|
||||
Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _TPM_COMM_H_
|
||||
#define _TPM_COMM_H_
|
||||
|
||||
/**
|
||||
Add a new entry to the Event Log.
|
||||
|
||||
@param[in, out] EventLogPtr Pointer to the Event Log data.
|
||||
@param[in, out] LogSize Size of the Event Log.
|
||||
@param[in] MaxSize Maximum size of the Event Log.
|
||||
@param[in] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR data structure.
|
||||
@param[in] NewEventData Pointer to the new event data.
|
||||
|
||||
@retval EFI_SUCCESS The new event log entry was added.
|
||||
@retval EFI_OUT_OF_RESOURCES No enough memory to log the new event.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
TpmCommLogEvent (
|
||||
IN OUT UINT8 **EventLogPtr,
|
||||
IN OUT UINTN *LogSize,
|
||||
IN UINTN MaxSize,
|
||||
IN TCG_PCR_EVENT_HDR *NewEventHdr,
|
||||
IN UINT8 *NewEventData
|
||||
);
|
||||
|
||||
/**
|
||||
Extend a TPM PCR.
|
||||
|
||||
@param[in] TpmHandle TPM handle.
|
||||
@param[in] DigestToExtend The 160 bit value representing the event to be recorded.
|
||||
@param[in] PcrIndex The PCR to be updated.
|
||||
@param[out] NewPcrValue New PCR value after extend.
|
||||
|
||||
@retval EFI_SUCCESS Operation completed successfully.
|
||||
@retval EFI_DEVICE_ERROR The command was unsuccessful.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
TpmCommExtend (
|
||||
IN TIS_TPM_HANDLE TpmHandle,
|
||||
IN TPM_DIGEST *DigestToExtend,
|
||||
IN TPM_PCRINDEX PcrIndex,
|
||||
OUT TPM_DIGEST *NewPcrValue
|
||||
);
|
||||
|
||||
/**
|
||||
Get TPM capability flags.
|
||||
|
||||
@param[in] TpmHandle TPM handle.
|
||||
@param[in] FlagSubcap Flag subcap.
|
||||
@param[out] FlagBuffer Pointer to the buffer for returned flag structure.
|
||||
@param[in] FlagSize Size of the buffer.
|
||||
|
||||
@retval EFI_SUCCESS Operation completed successfully.
|
||||
@retval EFI_DEVICE_ERROR The command was unsuccessful.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
TpmCommGetFlags (
|
||||
IN TIS_TPM_HANDLE TpmHandle,
|
||||
IN UINT32 FlagSubcap,
|
||||
OUT VOID *Buffer,
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
/**
|
||||
Send formatted command to TPM for execution and return formatted data from response.
|
||||
|
||||
@param[in] TisReg TPM Handle.
|
||||
@param[in] Fmt Format control string.
|
||||
@param[in] ... The variable argument list.
|
||||
|
||||
@retval EFI_SUCCESS Operation completed successfully.
|
||||
@retval EFI_TIMEOUT The register can't run into the expected status in time.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
TisPcExecute (
|
||||
IN TIS_TPM_HANDLE TisReg,
|
||||
IN CONST CHAR8 *Fmt,
|
||||
...
|
||||
);
|
||||
|
||||
#endif // _TPM_COMM_H_
|
Reference in New Issue
Block a user