1 /** @file 2 Utility functions used by TPM Dxe driver. 3 4 Copyright (c) 2005 - 2013, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include <IndustryStandard/Tpm12.h> 16 #include <IndustryStandard/UefiTcgPlatform.h> 17 #include <Library/TpmCommLib.h> 18 #include <Library/BaseMemoryLib.h> 19 20 #include "TpmComm.h" 21 22 /** 23 Extend a TPM PCR. 24 25 @param[in] TpmHandle TPM handle. 26 @param[in] DigestToExtend The 160 bit value representing the event to be recorded. 27 @param[in] PcrIndex The PCR to be updated. 28 @param[out] NewPcrValue New PCR value after extend. 29 30 @retval EFI_SUCCESS Operation completed successfully. 31 @retval EFI_DEVICE_ERROR The command was unsuccessful. 32 33 **/ 34 EFI_STATUS 35 TpmCommExtend ( 36 IN TIS_TPM_HANDLE TpmHandle, 37 IN TPM_DIGEST *DigestToExtend, 38 IN TPM_PCRINDEX PcrIndex, 39 OUT TPM_DIGEST *NewPcrValue 40 ) 41 { 42 EFI_STATUS Status; 43 TPM_DIGEST NewValue; 44 TPM_RQU_COMMAND_HDR CmdHdr; 45 TPM_RSP_COMMAND_HDR RspHdr; 46 47 if (NewPcrValue == NULL) { 48 NewPcrValue = &NewValue; 49 } 50 51 CmdHdr.tag = TPM_TAG_RQU_COMMAND; 52 CmdHdr.paramSize = 53 sizeof (CmdHdr) + sizeof (PcrIndex) + sizeof (*DigestToExtend); 54 CmdHdr.ordinal = TPM_ORD_Extend; 55 Status = TisPcExecute ( 56 TpmHandle, 57 "%h%d%r%/%h%r", 58 &CmdHdr, 59 PcrIndex, 60 DigestToExtend, 61 (UINTN)sizeof (*DigestToExtend), 62 &RspHdr, 63 NewPcrValue, 64 (UINTN)sizeof (*NewPcrValue) 65 ); 66 if (EFI_ERROR (Status)) { 67 return Status; 68 } 69 if (RspHdr.returnCode != 0) { 70 return EFI_DEVICE_ERROR; 71 } 72 return EFI_SUCCESS; 73 } 74 75 /** 76 Get TPM capability flags. 77 78 @param[in] TpmHandle TPM handle. 79 @param[in] FlagSubcap Flag subcap. 80 @param[out] FlagBuffer Pointer to the buffer for returned flag structure. 81 @param[in] FlagSize Size of the buffer. 82 83 @retval EFI_SUCCESS Operation completed successfully. 84 @retval EFI_DEVICE_ERROR The command was unsuccessful. 85 86 **/ 87 EFI_STATUS 88 TpmCommGetFlags ( 89 IN TIS_TPM_HANDLE TpmHandle, 90 IN UINT32 FlagSubcap, 91 OUT VOID *FlagBuffer, 92 IN UINTN FlagSize 93 ) 94 { 95 EFI_STATUS Status; 96 TPM_RQU_COMMAND_HDR CmdHdr; 97 TPM_RSP_COMMAND_HDR RspHdr; 98 UINT32 Size; 99 100 CmdHdr.tag = TPM_TAG_RQU_COMMAND; 101 CmdHdr.paramSize = sizeof (CmdHdr) + sizeof (UINT32) * 3; 102 CmdHdr.ordinal = TPM_ORD_GetCapability; 103 104 Status = TisPcExecute ( 105 TpmHandle, 106 "%h%d%d%d%/%h%d%r", 107 &CmdHdr, 108 TPM_CAP_FLAG, 109 sizeof (FlagSubcap), 110 FlagSubcap, 111 &RspHdr, 112 &Size, 113 FlagBuffer, 114 FlagSize 115 ); 116 if (EFI_ERROR (Status)) { 117 return Status; 118 } 119 if (RspHdr.returnCode != 0) { 120 return EFI_DEVICE_ERROR; 121 } 122 return EFI_SUCCESS; 123 } 124 125 /** 126 Add a new entry to the Event Log. 127 128 @param[in, out] EventLogPtr Pointer to the Event Log data. 129 @param[in, out] LogSize Size of the Event Log. 130 @param[in] MaxSize Maximum size of the Event Log. 131 @param[in] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR data structure. 132 @param[in] NewEventData Pointer to the new event data. 133 134 @retval EFI_SUCCESS The new event log entry was added. 135 @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. 136 137 **/ 138 EFI_STATUS 139 TpmCommLogEvent ( 140 IN OUT UINT8 **EventLogPtr, 141 IN OUT UINTN *LogSize, 142 IN UINTN MaxSize, 143 IN TCG_PCR_EVENT_HDR *NewEventHdr, 144 IN UINT8 *NewEventData 145 ) 146 { 147 UINTN NewLogSize; 148 149 // 150 // Prevent Event Overflow 151 // 152 if (NewEventHdr->EventSize > (UINTN)(~0) - sizeof (*NewEventHdr)) { 153 return EFI_OUT_OF_RESOURCES; 154 } 155 156 NewLogSize = sizeof (*NewEventHdr) + NewEventHdr->EventSize; 157 if (NewLogSize > MaxSize - *LogSize) { 158 return EFI_OUT_OF_RESOURCES; 159 } 160 161 *EventLogPtr += *LogSize; 162 *LogSize += NewLogSize; 163 CopyMem (*EventLogPtr, NewEventHdr, sizeof (*NewEventHdr)); 164 CopyMem ( 165 *EventLogPtr + sizeof (*NewEventHdr), 166 NewEventData, 167 NewEventHdr->EventSize 168 ); 169 return EFI_SUCCESS; 170 } 171