Revision: 18219
          http://sourceforge.net/p/edk2/code/18219
Author:   jyao1
Date:     2015-08-13 08:24:17 +0000 (Thu, 13 Aug 2015)
Log Message:
-----------
Add TPM2 support defined in trusted computing group.

TCG EFI Protocol Specification for TPM Family 2.0 Revision 1.0 Version 9 at 
http://www.trustedcomputinggroup.org/resources/tcg_efi_protocol_specification
TCG Physical Presence Interface Specification Version 1.30, Revision 00.52 at 
http://www.trustedcomputinggroup.org/resources/tcg_physical_presence_interface_specification

Add Tcg2XXX, similar file/directory as TrEEXXX. Old TrEE driver/library can be 
deprecated.
1) Add Tcg2Pei/Dxe/Smm driver to log event and provide services.
2) Add Dxe/Pei/SmmTcg2PhysicalPresenceLib to support TCG PP.
3) Update Tpm2 library to use TCG2 protocol instead of TrEE protocol.

Test Win8/Win10 with SecureBoot enabled, PCR7 shows bound.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: "Yao, Jiewen" <[email protected]>
Reviewed-by: "Zhang, Chao B" <[email protected]>

Revision Links:
--------------
    http://sourceforge.net/p/edk2/code/1
    http://sourceforge.net/p/edk2/code/00

Modified Paths:
--------------
    trunk/edk2/SecurityPkg/Include/Guid/TcgEventHob.h
    trunk/edk2/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c
    
trunk/edk2/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf
    trunk/edk2/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c
    trunk/edk2/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.inf
    
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterCommon.c
    
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c
    
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.inf
    
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c
    
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.inf
    trunk/edk2/SecurityPkg/Library/HashLibTpm2/HashLibTpm2.c
    trunk/edk2/SecurityPkg/SecurityPkg.dec
    trunk/edk2/SecurityPkg/SecurityPkg.dsc

Added Paths:
-----------
    trunk/edk2/SecurityPkg/Include/Guid/Tcg2ConfigHii.h
    trunk/edk2/SecurityPkg/Include/Guid/Tcg2PhysicalPresenceData.h
    trunk/edk2/SecurityPkg/Include/Library/Tcg2PhysicalPresenceLib.h
    trunk/edk2/SecurityPkg/Include/Library/Tcg2PpVendorLib.h
    trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/
    
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c
    
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.inf
    
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.uni
    
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/PhysicalPresenceStrings.uni
    trunk/edk2/SecurityPkg/Library/PeiTcg2PhysicalPresenceLib/
    
trunk/edk2/SecurityPkg/Library/PeiTcg2PhysicalPresenceLib/PeiTcg2PhysicalPresenceLib.c
    
trunk/edk2/SecurityPkg/Library/PeiTcg2PhysicalPresenceLib/PeiTcg2PhysicalPresenceLib.inf
    
trunk/edk2/SecurityPkg/Library/PeiTcg2PhysicalPresenceLib/PeiTcg2PhysicalPresenceLib.uni
    trunk/edk2/SecurityPkg/Library/SmmTcg2PhysicalPresenceLib/
    
trunk/edk2/SecurityPkg/Library/SmmTcg2PhysicalPresenceLib/SmmTcg2PhysicalPresenceLib.c
    
trunk/edk2/SecurityPkg/Library/SmmTcg2PhysicalPresenceLib/SmmTcg2PhysicalPresenceLib.inf
    
trunk/edk2/SecurityPkg/Library/SmmTcg2PhysicalPresenceLib/SmmTcg2PhysicalPresenceLib.uni
    trunk/edk2/SecurityPkg/Library/Tcg2PpVendorLibNull/
    trunk/edk2/SecurityPkg/Library/Tcg2PpVendorLibNull/Tcg2PpVendorLibNull.c
    trunk/edk2/SecurityPkg/Library/Tcg2PpVendorLibNull/Tcg2PpVendorLibNull.inf
    trunk/edk2/SecurityPkg/Library/Tcg2PpVendorLibNull/Tcg2PpVendorLibNull.uni
    trunk/edk2/SecurityPkg/Library/Tpm2DeviceLibTcg2/
    trunk/edk2/SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.c
    trunk/edk2/SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf
    trunk/edk2/SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2Config.vfr
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDxe.inf
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDxe.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDxeExtra.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.h
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigNvData.h
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPeiExtra.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigStrings.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Config/TpmDetection.c
    trunk/edk2/SecurityPkg/Tcg/Tcg2Dxe/
    trunk/edk2/SecurityPkg/Tcg/Tcg2Dxe/MeasureBootPeCoff.c
    trunk/edk2/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c
    trunk/edk2/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf
    trunk/edk2/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Dxe/Tcg2DxeExtra.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Pei/
    trunk/edk2/SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.c
    trunk/edk2/SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf
    trunk/edk2/SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Pei/Tcg2PeiExtra.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Smm/
    trunk/edk2/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c
    trunk/edk2/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h
    trunk/edk2/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf
    trunk/edk2/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Smm/Tcg2SmmExtra.uni
    trunk/edk2/SecurityPkg/Tcg/Tcg2Smm/Tpm.asl

Added: trunk/edk2/SecurityPkg/Include/Guid/Tcg2ConfigHii.h
===================================================================
--- trunk/edk2/SecurityPkg/Include/Guid/Tcg2ConfigHii.h                         
(rev 0)
+++ trunk/edk2/SecurityPkg/Include/Guid/Tcg2ConfigHii.h 2015-08-13 08:24:17 UTC 
(rev 18219)
@@ -0,0 +1,25 @@
+/** @file
+  GUIDs used as HII FormSet and HII Package list GUID in Tcg2Config driver. 
+  
+Copyright (c) 2015, 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 that 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 __TCG2_CONFIG_HII_GUID_H__
+#define __TCG2_CONFIG_HII_GUID_H__
+
+#define TCG2_CONFIG_FORM_SET_GUID \
+  { \
+    0x6339d487, 0x26ba, 0x424b, { 0x9a, 0x5d, 0x68, 0x7e, 0x25, 0xd7, 0x40, 
0xbc } \
+  }
+
+extern EFI_GUID gTcg2ConfigFormSetGuid;
+
+#endif

Added: trunk/edk2/SecurityPkg/Include/Guid/Tcg2PhysicalPresenceData.h
===================================================================
--- trunk/edk2/SecurityPkg/Include/Guid/Tcg2PhysicalPresenceData.h              
                (rev 0)
+++ trunk/edk2/SecurityPkg/Include/Guid/Tcg2PhysicalPresenceData.h      
2015-08-13 08:24:17 UTC (rev 18219)
@@ -0,0 +1,47 @@
+/** @file
+  Define the variable data structures used for TCG2 physical presence.
+  The TPM2 request from firmware or OS is saved to variable. And it is
+  cleared after it is processed in the next boot cycle. The TPM2 response 
+  is saved to variable.
+
+Copyright (c) 2015, 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 __TCG2_PHYSICAL_PRESENCE_DATA_GUID_H__
+#define __TCG2_PHYSICAL_PRESENCE_DATA_GUID_H__
+
+#define EFI_TCG2_PHYSICAL_PRESENCE_DATA_GUID \
+  { \
+    0xaeb9c5c1, 0x94f1, 0x4d02, { 0xbf, 0xd9, 0x46, 0x2, 0xdb, 0x2d, 0x3c, 
0x54 } \
+  }
+
+#define TCG2_PHYSICAL_PRESENCE_VARIABLE  L"Tcg2PhysicalPresence"
+
+typedef struct {
+  UINT8   PPRequest;      ///< Physical Presence request command.
+  UINT32  PPRequestParameter; ///< Physical Presence request Parameter.
+  UINT8   LastPPRequest;
+  UINT32  PPResponse;
+} EFI_TCG2_PHYSICAL_PRESENCE;
+
+//
+// This variable is used to save TCG2 Management Flags and corresponding 
operations.
+// It should be protected from malicious software (e.g. Set it as read-only 
variable). 
+//
+#define TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE  L"Tcg2PhysicalPresenceFlags"
+typedef struct {
+  UINT32  PPFlags;
+} EFI_TCG2_PHYSICAL_PRESENCE_FLAGS;
+
+extern EFI_GUID  gEfiTcg2PhysicalPresenceGuid;
+
+#endif
+

Modified: trunk/edk2/SecurityPkg/Include/Guid/TcgEventHob.h
===================================================================
--- trunk/edk2/SecurityPkg/Include/Guid/TcgEventHob.h   2015-08-13 08:22:05 UTC 
(rev 18218)
+++ trunk/edk2/SecurityPkg/Include/Guid/TcgEventHob.h   2015-08-13 08:24:17 UTC 
(rev 18219)
@@ -1,5 +1,5 @@
 /** @file
-  Defines the HOB GUID used to pass a TCG_PCR_EVENT from a TPM PEIM to 
+  Defines the HOB GUID used to pass a TCG_PCR_EVENT or TCG_PCR_EVENT2 from a 
TPM PEIM to 
   a TPM DXE Driver. A GUIDed HOB is generated for each measurement 
   made in the PEI Phase.
     
@@ -27,6 +27,13 @@
 
 extern EFI_GUID gTcgEventEntryHobGuid;
 
+#define EFI_TCG_EVENT2_HOB_GUID \
+  { \
+    0xd26c221e, 0x2430, 0x4c8a, { 0x91, 0x70, 0x3f, 0xcb, 0x45, 0x0, 0x41, 
0x3f } \
+  }
+
+extern EFI_GUID gTcgEvent2EntryHobGuid;
+
 ///
 /// The Global ID of a GUIDed HOB used to record TPM device error.
 ///

Added: trunk/edk2/SecurityPkg/Include/Library/Tcg2PhysicalPresenceLib.h
===================================================================
--- trunk/edk2/SecurityPkg/Include/Library/Tcg2PhysicalPresenceLib.h            
                (rev 0)
+++ trunk/edk2/SecurityPkg/Include/Library/Tcg2PhysicalPresenceLib.h    
2015-08-13 08:24:17 UTC (rev 18219)
@@ -0,0 +1,160 @@
+/** @file
+  Ihis library is intended to be used by BDS modules.
+  This library will execute TPM2 request.
+
+Copyright (c) 2015, 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 _TCG2_PHYSICAL_PRESENCE_LIB_H_
+#define _TCG2_PHYSICAL_PRESENCE_LIB_H_
+
+#include <IndustryStandard/Tpm20.h>
+#include <IndustryStandard/TcgPhysicalPresence.h>
+#include <Protocol/Tcg2Protocol.h>
+
+//
+// UEFI TCG2 library definition bit of the BIOS TPM Management Flags
+//
+// BIT0 is reserved
+#define TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CLEAR               BIT1
+// BIT2 is reserved
+#define TCG2_LIB_PP_FLAG_RESET_TRACK                                      BIT3
+#define TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_TURN_ON             BIT4
+#define TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_TURN_OFF            BIT5
+#define TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CHANGE_EPS          BIT6
+#define TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CHANGE_PCRS         BIT7
+
+//
+// UEFI TCG2 library definition bit of the BIOS Information Flags
+//
+#define TCG2_BIOS_INFORMATION_FLAG_HIERACHY_CONTROL_STORAGE_DISABLE      BIT8
+#define TCG2_BIOS_INFORMATION_FLAG_HIERACHY_CONTROL_ENDORSEMENT_DISABLE  BIT9
+
+//
+// UEFI TCG2 library definition bit of the BIOS Storage Management Flags
+//
+#define TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_ENABLE_BLOCK_SID   
BIT16
+#define TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_DISABLE_BLOCK_SID  
BIT17
+
+//
+// Default value
+//
+#define TCG2_BIOS_TPM_MANAGEMENT_FLAG_DEFAULT  
(TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_TURN_OFF | \
+                                                
TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CLEAR | \
+                                                
TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CHANGE_EPS | \
+                                                
TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CHANGE_PCRS)
+
+/**
+  Check and execute the pending TPM request.
+
+  The TPM request may come from OS or BIOS. This API will display request 
information and wait 
+  for user confirmation if TPM request exists. The TPM request will be sent to 
TPM device after
+  the TPM request is confirmed, and one or more reset may be required to make 
TPM request to 
+  take effect.
+  
+  This API should be invoked after console in and console out are all ready as 
they are required
+  to display request information and get user input to confirm the request.  
+
+  @param  PlatformAuth                   platform auth value. NULL means no 
platform auth change.
+**/
+VOID
+EFIAPI
+Tcg2PhysicalPresenceLibProcessRequest (
+  IN      TPM2B_AUTH                     *PlatformAuth  OPTIONAL
+  );
+
+/**
+  Check if the pending TPM request needs user input to confirm.
+
+  The TPM request may come from OS. This API will check if TPM request exists 
and need user
+  input to confirmation.
+  
+  @retval    TRUE        TPM needs input to confirm user physical presence.
+  @retval    FALSE       TPM doesn't need input to confirm user physical 
presence.
+
+**/
+BOOLEAN
+EFIAPI
+Tcg2PhysicalPresenceLibNeedUserConfirm (
+  VOID
+  );
+
+/**
+  Return TPM2 ManagementFlags set by PP interface.
+
+  @retval    ManagementFlags    TPM2 Management Flags.
+**/
+UINT32
+EFIAPI
+Tcg2PhysicalPresenceLibGetManagementFlags (
+  VOID
+  );
+
+/**
+  The handler for TPM physical presence function:
+  Return TPM Operation Response to OS Environment.
+
+  This API should be invoked in OS runtime phase to interface with ACPI method.
+
+  @param[out]     MostRecentRequest Most recent operation request.
+  @param[out]     Response          Response to the most recent operation 
request.
+
+  @return Return Code for Return TPM Operation Response to OS Environment.
+**/
+UINT32
+EFIAPI
+Tcg2PhysicalPresenceLibReturnOperationResponseToOsFunction (
+  OUT UINT32                *MostRecentRequest,
+  OUT UINT32                *Response
+  );
+
+
+/**
+  The handler for TPM physical presence function:
+  Submit TPM Operation Request to Pre-OS Environment and
+  Submit TPM Operation Request to Pre-OS Environment 2.
+
+  This API should be invoked in OS runtime phase to interface with ACPI method.
+
+  Caution: This function may receive untrusted input.
+  
+  @param[in]      OperationRequest TPM physical presence operation request.
+  @param[in]      RequestParameter TPM physical presence operation request 
parameter.
+
+  @return Return Code for Submit TPM Operation Request to Pre-OS Environment 
and
+          Submit TPM Operation Request to Pre-OS Environment 2.
+**/
+UINT32
+EFIAPI
+Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (
+  IN UINT32                 OperationRequest,
+  IN UINT32                 RequestParameter
+  );
+
+/**
+  The handler for TPM physical presence function:
+  Get User Confirmation Status for Operation.
+
+  This API should be invoked in OS runtime phase to interface with ACPI method.
+
+  Caution: This function may receive untrusted input.
+  
+  @param[in]      OperationRequest TPM physical presence operation request.
+
+  @return Return Code for Get User Confirmation Status for Operation.
+**/
+UINT32
+EFIAPI
+Tcg2PhysicalPresenceLibGetUserConfirmationStatusFunction (
+  IN UINT32                 OperationRequest
+  );
+
+#endif

Added: trunk/edk2/SecurityPkg/Include/Library/Tcg2PpVendorLib.h
===================================================================
--- trunk/edk2/SecurityPkg/Include/Library/Tcg2PpVendorLib.h                    
        (rev 0)
+++ trunk/edk2/SecurityPkg/Include/Library/Tcg2PpVendorLib.h    2015-08-13 
08:24:17 UTC (rev 18219)
@@ -0,0 +1,129 @@
+/** @file
+  Ihis library is to support TCG PC Client Platform Physical Presence 
Interface Specification
+  Family "2.0" part, >= 128 Vendor Specific PPI Operation.
+
+  The Vendor Specific PPI operation may change TPM state, BIOS TPM management
+  flags, and may need additional boot cycle.
+  
+  Caution: This function may receive untrusted input.
+
+Copyright (c) 2015, 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 _TCG2_PP_VENDOR_LIB_H_
+#define _TCG2_PP_VENDOR_LIB_H_
+
+#include <IndustryStandard/Tpm20.h>
+#include <Protocol/Tcg2Protocol.h>
+#include <Library/Tcg2PhysicalPresenceLib.h>
+
+/**
+  Check and execute the requested physical presence command.
+
+  This API should be invoked in BIOS boot phase to process pending request.
+  
+  Caution: This function may receive untrusted input.
+  
+  If OperationRequest < 128, then ASSERT().
+
+  @param[in]      PlatformAuth     platform auth value. NULL means no platform 
auth change.
+  @param[in]      OperationRequest TPM physical presence operation request.
+  @param[in, out] ManagementFlags  BIOS TPM Management Flags.
+  @param[out]     ResetRequired    If reset is required to vendor settings in 
effect.
+                                   True, it indicates the reset is required.
+                                   False, it indicates the reset is not 
required.
+
+  @return TPM Operation Response to OS Environment.
+**/
+UINT32
+EFIAPI
+Tcg2PpVendorLibExecutePendingRequest (
+  IN TPM2B_AUTH             *PlatformAuth,  OPTIONAL
+  IN UINT32                 OperationRequest,
+  IN OUT UINT32             *ManagementFlags,
+  OUT BOOLEAN               *ResetRequired
+  );
+
+/**
+  Check if there is a valid physical presence command request.
+
+  This API should be invoked in BIOS boot phase to process pending request.
+  
+  Caution: This function may receive untrusted input.
+
+  If OperationRequest < 128, then ASSERT().
+
+  @param[in]      OperationRequest TPM physical presence operation request.
+  @param[in]      ManagementFlags  BIOS TPM Management Flags.
+  @param[out]     RequestConfirmed If the physical presence operation command 
required user confirm from UI.
+                                   True, it indicates the command doesn't 
require user confirm.
+                                   False, it indicates the command need user 
confirm from UI.
+
+  @retval  TRUE        Physical Presence operation command is valid.
+  @retval  FALSE       Physical Presence operation command is invalid.
+**/
+BOOLEAN
+EFIAPI
+Tcg2PpVendorLibHasValidRequest (
+  IN UINT32                 OperationRequest,
+  IN UINT32                 ManagementFlags,
+  OUT BOOLEAN               *RequestConfirmed
+  );
+
+/**
+  The callback for TPM vendor specific physical presence which is called for
+  Submit TPM Operation Request to Pre-OS Environment and
+  Submit TPM Operation Request to Pre-OS Environment 2.
+
+  This API should be invoked in OS runtime phase to interface with ACPI method.
+
+  Caution: This function may receive untrusted input.
+  
+  If OperationRequest < 128, then ASSERT().
+
+  @param[in]      OperationRequest TPM physical presence operation request.
+  @param[in]      ManagementFlags  BIOS TPM Management Flags.
+  @param[in]      RequestParameter Extra parameter from the passed package.
+
+  @return Return Code for Submit TPM Operation Request to Pre-OS Environment 
and
+          Submit TPM Operation Request to Pre-OS Environment 2.
+**/
+UINT32
+EFIAPI
+Tcg2PpVendorLibSubmitRequestToPreOSFunction (
+  IN UINT32                 OperationRequest,
+  IN UINT32                 ManagementFlags,
+  IN UINT32                 RequestParameter
+  );
+
+/**
+  The callback for TPM vendor specific physical presence which is called for
+  Get User Confirmation Status for Operation.
+
+  This API should be invoked in OS runtime phase to interface with ACPI method.
+
+  Caution: This function may receive untrusted input.
+  
+  If OperationRequest < 128, then ASSERT().
+
+  @param[in]      OperationRequest TPM physical presence operation request.
+  @param[in]      ManagementFlags  BIOS TPM Management Flags.
+
+  @return Return Code for Get User Confirmation Status for Operation.
+**/
+UINT32
+EFIAPI
+Tcg2PpVendorLibGetUserConfirmationStatusFunction (
+  IN UINT32                 OperationRequest,
+  IN UINT32                 ManagementFlags
+  );
+
+#endif

Added: 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c
                              (rev 0)
+++ 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c
      2015-08-13 08:24:17 UTC (rev 18219)
@@ -0,0 +1,1245 @@
+/** @file
+  Execute pending TPM2 requests from OS or BIOS.
+
+  Caution: This module requires additional review when modified.
+  This driver will have external input - variable.
+  This external input must be validated carefully to avoid security issue.
+
+  Tpm2ExecutePendingTpmRequest() will receive untrusted input and do 
validation.
+
+Copyright (c) 2013 - 2015, 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 <PiDxe.h>
+
+#include <Protocol/Tcg2Protocol.h>
+#include <Protocol/VariableLock.h>
+#include <Library/DebugLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/PrintLib.h>
+#include <Library/HiiLib.h>
+#include <Library/HobLib.h>
+#include <Guid/EventGroup.h>
+#include <Guid/Tcg2PhysicalPresenceData.h>
+#include <Library/Tpm2CommandLib.h>
+#include <Library/Tcg2PhysicalPresenceLib.h>
+#include <Library/Tcg2PpVendorLib.h>
+
+#define CONFIRM_BUFFER_SIZE         4096
+
+EFI_HII_HANDLE mTcg2PpStringPackHandle;
+
+/**
+  Get string by string id from HII Interface.
+
+  @param[in] Id          String ID.
+
+  @retval    CHAR16 *    String from ID.
+  @retval    NULL        If error occurs.
+
+**/
+CHAR16 *
+Tcg2PhysicalPresenceGetStringById (
+  IN  EFI_STRING_ID   Id
+  )
+{
+  return HiiGetString (mTcg2PpStringPackHandle, Id, NULL);
+}
+
+/**
+  Send ClearControl and Clear command to TPM.
+
+  @param[in]  PlatformAuth      platform auth value. NULL means no platform 
auth change.
+
+  @retval EFI_SUCCESS           Operation completed successfully.
+  @retval EFI_TIMEOUT           The register can't run into the expected 
status in time.
+  @retval EFI_BUFFER_TOO_SMALL  Response data buffer is too small.
+  @retval EFI_DEVICE_ERROR      Unexpected device behavior.
+
+**/
+EFI_STATUS
+EFIAPI
+Tpm2CommandClear (
+  IN TPM2B_AUTH                *PlatformAuth  OPTIONAL
+  )
+{
+  EFI_STATUS                Status;
+  TPMS_AUTH_COMMAND         *AuthSession;
+  TPMS_AUTH_COMMAND         LocalAuthSession;
+
+  if (PlatformAuth == NULL) {
+    AuthSession = NULL;
+  } else {
+    AuthSession = &LocalAuthSession;
+    ZeroMem (&LocalAuthSession, sizeof(LocalAuthSession));
+    LocalAuthSession.sessionHandle = TPM_RS_PW;
+    LocalAuthSession.hmac.size = PlatformAuth->size;
+    CopyMem (LocalAuthSession.hmac.buffer, PlatformAuth->buffer, 
PlatformAuth->size);
+  }
+
+  DEBUG ((EFI_D_INFO, "Tpm2ClearControl ... \n"));
+  Status = Tpm2ClearControl (TPM_RH_PLATFORM, AuthSession, NO);
+  DEBUG ((EFI_D_INFO, "Tpm2ClearControl - %r\n", Status));
+  if (EFI_ERROR (Status)) {
+    goto Done;
+  }
+  DEBUG ((EFI_D_INFO, "Tpm2Clear ... \n"));
+  Status = Tpm2Clear (TPM_RH_PLATFORM, AuthSession);
+  DEBUG ((EFI_D_INFO, "Tpm2Clear - %r\n", Status));
+
+Done:
+  ZeroMem (&LocalAuthSession.hmac, sizeof(LocalAuthSession.hmac));
+  return Status;
+}
+
+/**
+  Alloc PCR data.
+
+  @param[in]  PlatformAuth      platform auth value. NULL means no platform 
auth change.
+  @param[in]  SupportedPCRBanks Supported PCR banks
+  @param[in]  PCRBanks          PCR banks
+  
+  @retval EFI_SUCCESS Operation completed successfully.
+**/
+EFI_STATUS
+Tpm2CommandAllocPcr (
+  IN TPM2B_AUTH                *PlatformAuth,  OPTIONAL
+  IN UINT32                    SupportedPCRBanks,
+  IN UINT32                    PCRBanks
+  )
+{
+  EFI_STATUS                Status;
+  TPMS_AUTH_COMMAND         *AuthSession;
+  TPMS_AUTH_COMMAND         LocalAuthSession;
+  TPML_PCR_SELECTION        PcrAllocation;
+  TPMI_YES_NO               AllocationSuccess;
+  UINT32                    MaxPCR;
+  UINT32                    SizeNeeded;
+  UINT32                    SizeAvailable;
+
+  if (PlatformAuth == NULL) {
+    AuthSession = NULL;
+  } else {
+    AuthSession = &LocalAuthSession;
+    ZeroMem (&LocalAuthSession, sizeof(LocalAuthSession));
+    LocalAuthSession.sessionHandle = TPM_RS_PW;
+    LocalAuthSession.hmac.size = PlatformAuth->size;
+    CopyMem (LocalAuthSession.hmac.buffer, PlatformAuth->buffer, 
PlatformAuth->size);
+  }
+
+  //
+  // Fill input
+  //
+  ZeroMem (&PcrAllocation, sizeof(PcrAllocation));
+  if ((EFI_TCG2_BOOT_HASH_ALG_SHA1 & SupportedPCRBanks) != 0) {
+    PcrAllocation.pcrSelections[PcrAllocation.count].hash = TPM_ALG_SHA1;
+    PcrAllocation.pcrSelections[PcrAllocation.count].sizeofSelect = 
PCR_SELECT_MAX;
+    if ((EFI_TCG2_BOOT_HASH_ALG_SHA1 & PCRBanks) != 0) {
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[0] = 0xFF;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[1] = 0xFF;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[2] = 0xFF;
+    } else {
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[0] = 0x00;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[1] = 0x00;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[2] = 0x00;
+    }
+    PcrAllocation.count++;
+  }
+  if ((EFI_TCG2_BOOT_HASH_ALG_SHA256 & SupportedPCRBanks) != 0) {
+    PcrAllocation.pcrSelections[PcrAllocation.count].hash = TPM_ALG_SHA256;
+    PcrAllocation.pcrSelections[PcrAllocation.count].sizeofSelect = 
PCR_SELECT_MAX;
+    if ((EFI_TCG2_BOOT_HASH_ALG_SHA256 & PCRBanks) != 0) {
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[0] = 0xFF;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[1] = 0xFF;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[2] = 0xFF;
+    } else {
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[0] = 0x00;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[1] = 0x00;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[2] = 0x00;
+    }
+    PcrAllocation.count++;
+  }
+  if ((EFI_TCG2_BOOT_HASH_ALG_SHA384 & SupportedPCRBanks) != 0) {
+    PcrAllocation.pcrSelections[PcrAllocation.count].hash = TPM_ALG_SHA384;
+    PcrAllocation.pcrSelections[PcrAllocation.count].sizeofSelect = 
PCR_SELECT_MAX;
+    if ((EFI_TCG2_BOOT_HASH_ALG_SHA384 & PCRBanks) != 0) {
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[0] = 0xFF;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[1] = 0xFF;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[2] = 0xFF;
+    } else {
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[0] = 0x00;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[1] = 0x00;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[2] = 0x00;
+    }
+    PcrAllocation.count++;
+  }
+  if ((EFI_TCG2_BOOT_HASH_ALG_SHA512 & SupportedPCRBanks) != 0) {
+    PcrAllocation.pcrSelections[PcrAllocation.count].hash = TPM_ALG_SHA512;
+    PcrAllocation.pcrSelections[PcrAllocation.count].sizeofSelect = 
PCR_SELECT_MAX;
+    if ((EFI_TCG2_BOOT_HASH_ALG_SHA512 & PCRBanks) != 0) {
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[0] = 0xFF;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[1] = 0xFF;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[2] = 0xFF;
+    } else {
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[0] = 0x00;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[1] = 0x00;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[2] = 0x00;
+    }
+    PcrAllocation.count++;
+  }
+  if ((EFI_TCG2_BOOT_HASH_ALG_SM3_256 & SupportedPCRBanks) != 0) {
+    PcrAllocation.pcrSelections[PcrAllocation.count].hash = TPM_ALG_SM3_256;
+    PcrAllocation.pcrSelections[PcrAllocation.count].sizeofSelect = 
PCR_SELECT_MAX;
+    if ((EFI_TCG2_BOOT_HASH_ALG_SM3_256 & PCRBanks) != 0) {
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[0] = 0xFF;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[1] = 0xFF;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[2] = 0xFF;
+    } else {
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[0] = 0x00;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[1] = 0x00;
+      PcrAllocation.pcrSelections[PcrAllocation.count].pcrSelect[2] = 0x00;
+    }
+    PcrAllocation.count++;
+  }
+  Status = Tpm2PcrAllocate (
+             TPM_RH_PLATFORM,
+             AuthSession,
+             &PcrAllocation,
+             &AllocationSuccess,
+             &MaxPCR,
+             &SizeNeeded,
+             &SizeAvailable
+             );
+  DEBUG ((EFI_D_INFO, "Tpm2PcrAllocate - %r\n", Status));
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  DEBUG ((EFI_D_INFO, "AllocationSuccess - %02x\n", AllocationSuccess));
+  DEBUG ((EFI_D_INFO, "MaxPCR            - %08x\n", MaxPCR));
+  DEBUG ((EFI_D_INFO, "SizeNeeded        - %08x\n", SizeNeeded));
+  DEBUG ((EFI_D_INFO, "SizeAvailable     - %08x\n", SizeAvailable));
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Change EPS.
+
+  @param[in]  PlatformAuth      platform auth value. NULL means no platform 
auth change.
+  
+  @retval EFI_SUCCESS Operation completed successfully.
+**/
+EFI_STATUS
+Tpm2CommandChangeEps (
+  IN TPM2B_AUTH                *PlatformAuth  OPTIONAL
+  )
+{
+  EFI_STATUS                Status;
+  TPMS_AUTH_COMMAND         *AuthSession;
+  TPMS_AUTH_COMMAND         LocalAuthSession;
+
+  if (PlatformAuth == NULL) {
+    AuthSession = NULL;
+  } else {
+    AuthSession = &LocalAuthSession;
+    ZeroMem (&LocalAuthSession, sizeof(LocalAuthSession));
+    LocalAuthSession.sessionHandle = TPM_RS_PW;
+    LocalAuthSession.hmac.size = PlatformAuth->size;
+    CopyMem (LocalAuthSession.hmac.buffer, PlatformAuth->buffer, 
PlatformAuth->size);
+  }
+
+  Status = Tpm2ChangeEPS (TPM_RH_PLATFORM, AuthSession);
+  DEBUG ((EFI_D_INFO, "Tpm2ChangeEPS - %r\n", Status));
+  return Status;
+}
+
+/**
+  Execute physical presence operation requested by the OS.
+
+  @param[in]      PlatformAuth        platform auth value. NULL means no 
platform auth change.
+  @param[in]      CommandCode         Physical presence operation value.
+  @param[in]      CommandParameter    Physical presence operation parameter.
+  @param[in, out] PpiFlags            The physical presence interface flags.
+  
+  @retval TCG_PP_OPERATION_RESPONSE_BIOS_FAILURE   Unknown physical presence 
operation.
+  @retval TCG_PP_OPERATION_RESPONSE_BIOS_FAILURE   Error occurred during 
sending command to TPM or 
+                                                   receiving response from TPM.
+  @retval Others                                   Return code from the TPM 
device after command execution.
+**/
+UINT32
+Tcg2ExecutePhysicalPresence (
+  IN      TPM2B_AUTH                       *PlatformAuth,  OPTIONAL
+  IN      UINT32                           CommandCode,
+  IN      UINT32                           CommandParameter,
+  IN OUT  EFI_TCG2_PHYSICAL_PRESENCE_FLAGS *PpiFlags
+  )
+{
+  EFI_STATUS                        Status;
+  EFI_TCG2_PROTOCOL                 *Tcg2Protocol;
+  EFI_TCG2_BOOT_SERVICE_CAPABILITY  ProtocolCapability;
+
+  Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) 
&Tcg2Protocol);
+  ASSERT_EFI_ERROR (Status);
+
+  ProtocolCapability.Size = sizeof(ProtocolCapability);
+  Status = Tcg2Protocol->GetCapability (
+                           Tcg2Protocol,
+                           &ProtocolCapability
+                           );
+  ASSERT_EFI_ERROR (Status);
+
+  switch (CommandCode) {
+    case TCG2_PHYSICAL_PRESENCE_CLEAR:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_2:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_3:
+      Status = Tpm2CommandClear (PlatformAuth);
+      if (EFI_ERROR (Status)) {
+        return TCG_PP_OPERATION_RESPONSE_BIOS_FAILURE;
+      } else {
+        return TCG_PP_OPERATION_RESPONSE_SUCCESS;
+      }
+
+    case TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_CLEAR_TRUE:
+      PpiFlags->PPFlags |= TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CLEAR;
+      return TCG_PP_OPERATION_RESPONSE_SUCCESS;
+
+    case TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_CLEAR_FALSE:
+      PpiFlags->PPFlags &= 
~TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CLEAR;
+      return TCG_PP_OPERATION_RESPONSE_SUCCESS;
+
+    case TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS:
+      Status = Tpm2CommandAllocPcr (PlatformAuth, 
ProtocolCapability.HashAlgorithmBitmap, CommandParameter);
+      if (EFI_ERROR (Status)) {
+        return TCG_PP_OPERATION_RESPONSE_BIOS_FAILURE;
+      } else {
+        return TCG_PP_OPERATION_RESPONSE_SUCCESS;
+      }
+
+    case TCG2_PHYSICAL_PRESENCE_CHANGE_EPS:
+      Status = Tpm2CommandChangeEps (PlatformAuth);
+      if (EFI_ERROR (Status)) {
+        return TCG_PP_OPERATION_RESPONSE_BIOS_FAILURE;
+      } else {
+        return TCG_PP_OPERATION_RESPONSE_SUCCESS;
+      }
+
+    case TCG2_PHYSICAL_PRESENCE_LOG_ALL_DIGESTS:
+      Status = Tpm2CommandAllocPcr (PlatformAuth, 
ProtocolCapability.HashAlgorithmBitmap, ProtocolCapability.HashAlgorithmBitmap);
+      if (EFI_ERROR (Status)) {
+        return TCG_PP_OPERATION_RESPONSE_BIOS_FAILURE;
+      } else {
+        return TCG_PP_OPERATION_RESPONSE_SUCCESS;
+      }
+
+    default:
+      if (CommandCode <= TCG2_PHYSICAL_PRESENCE_NO_ACTION_MAX) {
+        return TCG_PP_OPERATION_RESPONSE_SUCCESS;
+      } else {
+        return TCG_PP_OPERATION_RESPONSE_BIOS_FAILURE;
+      }
+  }
+}
+
+
+/**
+  Read the specified key for user confirmation.
+
+  @param[in]  CautionKey  If true,  F12 is used as confirm key;
+                          If false, F10 is used as confirm key.
+
+  @retval     TRUE        User confirmed the changes by input.
+  @retval     FALSE       User discarded the changes.
+**/
+BOOLEAN
+Tcg2ReadUserKey (
+  IN     BOOLEAN                    CautionKey
+  )
+{
+  EFI_STATUS                        Status;
+  EFI_INPUT_KEY                     Key;
+  UINT16                            InputKey;
+      
+  InputKey = 0; 
+  do {
+    Status = gBS->CheckEvent (gST->ConIn->WaitForKey);
+    if (!EFI_ERROR (Status)) {
+      Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
+      if (Key.ScanCode == SCAN_ESC) {
+        InputKey = Key.ScanCode;
+      }
+      if ((Key.ScanCode == SCAN_F10) && !CautionKey) {
+        InputKey = Key.ScanCode;
+      }
+      if ((Key.ScanCode == SCAN_F12) && CautionKey) {
+        InputKey = Key.ScanCode;
+      }
+    }      
+  } while (InputKey == 0);
+
+  if (InputKey != SCAN_ESC) {
+    return TRUE;
+  }
+  
+  return FALSE;
+}
+
+/**
+  Fill Buffer With BootHashAlg.
+
+  @param[in] Buffer               Buffer to be filled.
+  @param[in] BufferSize           Size of buffer.
+  @param[in] BootHashAlg          BootHashAlg.
+
+**/
+VOID
+Tcg2FillBufferWithBootHashAlg (
+  IN UINT16  *Buffer,
+  IN UINTN   BufferSize,
+  IN UINT32  BootHashAlg
+  )
+{
+  Buffer[0] = 0;
+  if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA1) != 0) {
+    if (Buffer[0] != 0) {
+      StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L", ", (BufferSize / 
sizeof (CHAR16)) - StrLen (Buffer) - 1);
+    }
+    StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1", (BufferSize / 
sizeof (CHAR16)) - StrLen (Buffer) - 1);
+  }
+  if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA256) != 0) {
+    if (Buffer[0] != 0) {
+      StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L", ", (BufferSize / 
sizeof (CHAR16)) - StrLen (Buffer) - 1);
+    }
+    StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256", (BufferSize / 
sizeof (CHAR16)) - StrLen (Buffer) - 1);
+  }
+  if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA384) != 0) {
+    if (Buffer[0] != 0) {
+      StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L", ", (BufferSize / 
sizeof (CHAR16)) - StrLen (Buffer) - 1);
+    }
+    StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384", (BufferSize / 
sizeof (CHAR16)) - StrLen (Buffer) - 1);
+  }
+  if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA512) != 0) {
+    if (Buffer[0] != 0) {
+      StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L", ", (BufferSize / 
sizeof (CHAR16)) - StrLen (Buffer) - 1);
+    }
+    StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512", (BufferSize / 
sizeof (CHAR16)) - StrLen (Buffer) - 1);
+  }
+  if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SM3_256) != 0) {
+    if (Buffer[0] != 0) {
+      StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L", ", (BufferSize / 
sizeof (CHAR16)) - StrLen (Buffer) - 1);
+    }
+    StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256", (BufferSize / 
sizeof (CHAR16)) - StrLen (Buffer) - 1);
+  }
+}
+
+/**
+  Display the confirm text and get user confirmation.
+
+  @param[in] TpmPpCommand             The requested TPM physical presence 
command.
+  @param[in] TpmPpCommandParameter    The requested TPM physical presence 
command parameter.
+
+  @retval    TRUE          The user has confirmed the changes.
+  @retval    FALSE         The user doesn't confirm the changes.
+**/
+BOOLEAN
+Tcg2UserConfirm (
+  IN      UINT32                    TpmPpCommand,
+  IN      UINT32                    TpmPpCommandParameter
+  )
+{
+  CHAR16                            *ConfirmText;
+  CHAR16                            *TmpStr1;
+  CHAR16                            *TmpStr2; 
+  UINTN                             BufSize;
+  BOOLEAN                           CautionKey;
+  BOOLEAN                           NoPpiInfo;
+  UINT16                            Index;
+  CHAR16                            DstStr[81];
+  CHAR16                            TempBuffer[1024];
+  CHAR16                            TempBuffer2[1024];
+  EFI_TCG2_PROTOCOL                 *Tcg2Protocol;
+  EFI_TCG2_BOOT_SERVICE_CAPABILITY  ProtocolCapability;
+  UINT32                            CurrentPCRBanks;
+  EFI_STATUS                        Status;
+
+  Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) 
&Tcg2Protocol);
+  ASSERT_EFI_ERROR (Status);
+
+  ProtocolCapability.Size = sizeof(ProtocolCapability);
+  Status = Tcg2Protocol->GetCapability (
+                           Tcg2Protocol,
+                           &ProtocolCapability
+                           );
+  ASSERT_EFI_ERROR (Status);
+
+  Status = Tcg2Protocol->GetActivePcrBanks (
+                           Tcg2Protocol,
+                           &CurrentPCRBanks
+                           );
+  ASSERT_EFI_ERROR (Status);
+  
+  TmpStr2     = NULL;
+  CautionKey  = FALSE;
+  NoPpiInfo   = FALSE;
+  BufSize     = CONFIRM_BUFFER_SIZE;
+  ConfirmText = AllocateZeroPool (BufSize);
+  ASSERT (ConfirmText != NULL);
+
+  switch (TpmPpCommand) {
+
+    case TCG2_PHYSICAL_PRESENCE_CLEAR:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_2:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_3:
+      CautionKey = TRUE;
+      TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CLEAR));
+
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_HEAD_STR));
+      UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
+      FreePool (TmpStr1);
+
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_WARNING_CLEAR));
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), L" \n\n", (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      FreePool (TmpStr1);      
+
+      break;
+
+    case TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_CLEAR_FALSE:
+      CautionKey = TRUE;
+      NoPpiInfo  = TRUE;
+      TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CLEAR));
+
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_PPI_HEAD_STR));
+      UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
+      FreePool (TmpStr1);
+
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_NOTE_CLEAR));
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      FreePool (TmpStr1);
+
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_WARNING_CLEAR));
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), L" \n\n", (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      FreePool (TmpStr1); 
+
+      break;
+
+    case TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS:
+      CautionKey = TRUE;
+      TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_SET_PCR_BANKS));
+
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_HEAD_STR));
+      UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
+      FreePool (TmpStr1);
+
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_WARNING_SET_PCR_BANKS_1));
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      FreePool (TmpStr1);      
+
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_WARNING_SET_PCR_BANKS_2));
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      FreePool (TmpStr1);      
+
+      Tcg2FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), 
TpmPpCommandParameter);
+      Tcg2FillBufferWithBootHashAlg (TempBuffer2, sizeof(TempBuffer2), 
CurrentPCRBanks);
+
+      TmpStr1 = AllocateZeroPool (BufSize);
+      ASSERT (TmpStr1 != NULL);
+      UnicodeSPrint (TmpStr1, BufSize, L"Current PCRBanks is 0x%x. (%s)\nNew 
PCRBanks is 0x%x. (%s)\n", CurrentPCRBanks, TempBuffer2, TpmPpCommandParameter, 
TempBuffer);
+
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), L" \n", (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      FreePool (TmpStr1);      
+
+      break;
+
+    case TCG2_PHYSICAL_PRESENCE_CHANGE_EPS:
+      CautionKey = TRUE;
+      TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_CHANGE_EPS));
+
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_HEAD_STR));
+      UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
+      FreePool (TmpStr1);
+
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_WARNING_CHANGE_EPS_1));
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      FreePool (TmpStr1);      
+      
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_WARNING_CHANGE_EPS_2));
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      FreePool (TmpStr1);      
+
+      break;
+      
+
+    default:
+      ;
+  }
+
+  if (TmpStr2 == NULL) {
+    FreePool (ConfirmText);
+    return FALSE;
+  }
+
+  if (TpmPpCommand < TCG2_PHYSICAL_PRESENCE_STORAGE_MANAGEMENT_BEGIN) {
+    if (CautionKey) {
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_CAUTION_KEY));
+    } else {
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_ACCEPT_KEY));
+    }
+    StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+    FreePool (TmpStr1);
+
+    if (NoPpiInfo) {
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_NO_PPI_INFO));
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      FreePool (TmpStr1);
+    }
+
+    TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TPM_REJECT_KEY));
+  } else {
+    if (CautionKey) {
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TCG_STORAGE_CAUTION_KEY));
+    } else {
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TCG_STORAGE_ACCEPT_KEY));
+    }
+    StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+    FreePool (TmpStr1);
+
+    if (NoPpiInfo) {
+      TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TCG_STORAGE_NO_PPI_INFO));
+      StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / 
sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
+      FreePool (TmpStr1);
+    }
+
+    TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN 
(TCG_STORAGE_REJECT_KEY));
+  }
+  BufSize -= StrSize (ConfirmText);
+  UnicodeSPrint (ConfirmText + StrLen (ConfirmText), BufSize, TmpStr1, 
TmpStr2);
+
+  DstStr[80] = L'\0';
+  for (Index = 0; Index < StrLen (ConfirmText); Index += 80) {
+    StrnCpyS (DstStr, sizeof (DstStr) / sizeof (CHAR16), ConfirmText + Index, 
sizeof (DstStr) / sizeof (CHAR16) - 1);    
+    Print (DstStr);    
+  }
+  
+  FreePool (TmpStr1);
+  FreePool (TmpStr2);
+  FreePool (ConfirmText);
+
+  if (Tcg2ReadUserKey (CautionKey)) {
+    return TRUE;
+  }
+
+  return FALSE;  
+}
+
+/**
+  Check if there is a valid physical presence command request. Also updates 
parameter value 
+  to whether the requested physical presence command already confirmed by user
+ 
+   @param[in]  TcgPpData                 EFI Tcg2 Physical Presence request 
data. 
+   @param[in]  Flags                     The physical presence interface flags.
+   @param[out] RequestConfirmed            If the physical presence operation 
command required user confirm from UI.
+                                             True, it indicates the command 
doesn't require user confirm, or already confirmed 
+                                                   in last boot cycle by user.
+                                             False, it indicates the command 
need user confirm from UI.
+
+   @retval  TRUE        Physical Presence operation command is valid.
+   @retval  FALSE       Physical Presence operation command is invalid.
+
+**/
+BOOLEAN
+Tcg2HaveValidTpmRequest  (
+  IN      EFI_TCG2_PHYSICAL_PRESENCE       *TcgPpData,
+  IN      EFI_TCG2_PHYSICAL_PRESENCE_FLAGS Flags,
+  OUT     BOOLEAN                          *RequestConfirmed
+  )
+{
+  BOOLEAN  IsRequestValid;
+
+  *RequestConfirmed = FALSE;
+
+  switch (TcgPpData->PPRequest) {
+    case TCG2_PHYSICAL_PRESENCE_NO_ACTION:
+      *RequestConfirmed = TRUE;
+      return TRUE;
+
+    case TCG2_PHYSICAL_PRESENCE_CLEAR:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_2:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_3:
+      if ((Flags.PPFlags & 
TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CLEAR) == 0) {
+        *RequestConfirmed = TRUE;
+      }
+      break;
+
+    case TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_CLEAR_TRUE:
+      *RequestConfirmed = TRUE;
+      break;
+
+    case TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_CLEAR_FALSE:
+      break;
+
+    case TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS:
+      if ((Flags.PPFlags & 
TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CHANGE_PCRS) == 0) {
+        *RequestConfirmed = TRUE;
+      }
+      break;
+
+    case TCG2_PHYSICAL_PRESENCE_CHANGE_EPS:
+      if ((Flags.PPFlags & 
TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CHANGE_EPS) == 0) {
+        *RequestConfirmed = TRUE;
+      }
+      break;
+      
+    case TCG2_PHYSICAL_PRESENCE_LOG_ALL_DIGESTS:
+      *RequestConfirmed = TRUE;
+      break;
+
+    default:
+      if (TcgPpData->PPRequest >= 
TCG2_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {
+        IsRequestValid = Tcg2PpVendorLibHasValidRequest (TcgPpData->PPRequest, 
Flags.PPFlags, RequestConfirmed);
+        if (!IsRequestValid) {
+          return FALSE;
+        } else {
+          break;
+        }
+      } else {
+        //
+        // Wrong Physical Presence command
+        //
+        return FALSE;
+      }
+  }
+
+  if ((Flags.PPFlags & TCG2_LIB_PP_FLAG_RESET_TRACK) != 0) {
+    //
+    // It had been confirmed in last boot, it doesn't need confirm again.
+    //
+    *RequestConfirmed = TRUE;
+  }
+
+  //
+  // Physical Presence command is correct
+  //
+  return TRUE;
+}
+
+
+/**
+  Check and execute the requested physical presence command.
+
+  Caution: This function may receive untrusted input.
+  TcgPpData variable is external input, so this function will validate
+  its data structure to be valid value.
+
+  @param[in] PlatformAuth         platform auth value. NULL means no platform 
auth change.
+  @param[in] TcgPpData            Point to the physical presence NV variable.
+  @param[in] Flags                The physical presence interface flags.
+**/
+VOID
+Tcg2ExecutePendingTpmRequest (
+  IN      TPM2B_AUTH                       *PlatformAuth,  OPTIONAL
+  IN      EFI_TCG2_PHYSICAL_PRESENCE       *TcgPpData,
+  IN      EFI_TCG2_PHYSICAL_PRESENCE_FLAGS Flags
+  )
+{
+  EFI_STATUS                        Status;
+  UINTN                             DataSize;
+  BOOLEAN                           RequestConfirmed;
+  EFI_TCG2_PHYSICAL_PRESENCE_FLAGS  NewFlags;
+  BOOLEAN                           ResetRequired;
+  UINT32                            NewPPFlags;
+
+  if (TcgPpData->PPRequest == TCG2_PHYSICAL_PRESENCE_NO_ACTION) {
+    //
+    // No operation request
+    //
+    return;
+  }
+
+  if (!Tcg2HaveValidTpmRequest(TcgPpData, Flags, &RequestConfirmed)) {
+    //
+    // Invalid operation request.
+    //
+    if (TcgPpData->PPRequest <= TCG2_PHYSICAL_PRESENCE_NO_ACTION_MAX) {
+      TcgPpData->PPResponse = TCG_PP_OPERATION_RESPONSE_SUCCESS;
+    } else {
+      TcgPpData->PPResponse = TCG_PP_OPERATION_RESPONSE_BIOS_FAILURE;
+    }
+    TcgPpData->LastPPRequest = TcgPpData->PPRequest;
+    TcgPpData->PPRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;
+    TcgPpData->PPRequestParameter = 0;
+
+    DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);
+    Status = gRT->SetVariable (
+                    TCG2_PHYSICAL_PRESENCE_VARIABLE,
+                    &gEfiTcg2PhysicalPresenceGuid,
+                    EFI_VARIABLE_NON_VOLATILE | 
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
+                    DataSize,
+                    TcgPpData
+                    );
+    return;
+  }
+
+  ResetRequired = FALSE;
+  if (TcgPpData->PPRequest >= 
TCG2_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {
+    NewFlags = Flags;
+    NewPPFlags = NewFlags.PPFlags;
+    TcgPpData->PPResponse = Tcg2PpVendorLibExecutePendingRequest 
(PlatformAuth, TcgPpData->PPRequest, &NewPPFlags, &ResetRequired);
+    NewFlags.PPFlags = NewPPFlags;
+  } else {
+    if (!RequestConfirmed) {
+      //
+      // Print confirm text and wait for approval. 
+      //
+      RequestConfirmed = Tcg2UserConfirm (TcgPpData->PPRequest, 
TcgPpData->PPRequestParameter);
+    }
+
+    //
+    // Execute requested physical presence command
+    //
+    TcgPpData->PPResponse = TCG_PP_OPERATION_RESPONSE_USER_ABORT;
+    NewFlags = Flags;
+    if (RequestConfirmed) {
+      TcgPpData->PPResponse = Tcg2ExecutePhysicalPresence (
+                                PlatformAuth,
+                                TcgPpData->PPRequest, 
+                                TcgPpData->PPRequestParameter, 
+                                &NewFlags
+                                );
+    }
+  }
+
+  //
+  // Save the flags if it is updated.
+  //
+  if (CompareMem (&Flags, &NewFlags, sizeof(EFI_TCG2_PHYSICAL_PRESENCE_FLAGS)) 
!= 0) {
+    Status   = gRT->SetVariable (
+                      TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE,
+                      &gEfiTcg2PhysicalPresenceGuid,
+                      EFI_VARIABLE_NON_VOLATILE | 
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
+                      sizeof (EFI_TCG2_PHYSICAL_PRESENCE_FLAGS),
+                      &NewFlags
+                      ); 
+  }
+
+  //
+  // Clear request
+  //
+  if ((NewFlags.PPFlags & TCG2_LIB_PP_FLAG_RESET_TRACK) == 0) {
+    TcgPpData->LastPPRequest = TcgPpData->PPRequest;
+    TcgPpData->PPRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;    
+    TcgPpData->PPRequestParameter = 0;
+  }
+
+  //
+  // Save changes
+  //
+  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);
+  Status = gRT->SetVariable (
+                  TCG2_PHYSICAL_PRESENCE_VARIABLE,
+                  &gEfiTcg2PhysicalPresenceGuid,
+                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS 
| EFI_VARIABLE_RUNTIME_ACCESS,
+                  DataSize,
+                  TcgPpData
+                  );
+  if (EFI_ERROR (Status)) {
+    return;
+  }
+
+  if (TcgPpData->PPResponse == TCG_PP_OPERATION_RESPONSE_USER_ABORT) {
+    return;
+  }
+
+  //
+  // Reset system to make new TPM settings in effect
+  //
+  switch (TcgPpData->LastPPRequest) {
+    case TCG2_PHYSICAL_PRESENCE_CLEAR:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_2:
+    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_3:
+    case TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS:
+    case TCG2_PHYSICAL_PRESENCE_CHANGE_EPS:
+    case TCG2_PHYSICAL_PRESENCE_LOG_ALL_DIGESTS:
+      break;
+
+    default:
+      if (TcgPpData->LastPPRequest >= 
TCG2_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {
+        if (ResetRequired) {
+          break;
+        } else {
+          return ;
+        }
+      }
+      if (TcgPpData->PPRequest != TCG2_PHYSICAL_PRESENCE_NO_ACTION) {
+        break;
+      }
+      return;
+  }
+
+  Print (L"Rebooting system to make TPM2 settings in effect\n");
+  gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
+  ASSERT (FALSE);  
+}
+
+/**
+  Check and execute the pending TPM request.
+
+  The TPM request may come from OS or BIOS. This API will display request 
information and wait 
+  for user confirmation if TPM request exists. The TPM request will be sent to 
TPM device after
+  the TPM request is confirmed, and one or more reset may be required to make 
TPM request to 
+  take effect.
+  
+  This API should be invoked after console in and console out are all ready as 
they are required
+  to display request information and get user input to confirm the request.  
+
+  @param[in]  PlatformAuth                   platform auth value. NULL means 
no platform auth change.
+**/
+VOID
+EFIAPI
+Tcg2PhysicalPresenceLibProcessRequest (
+  IN      TPM2B_AUTH                     *PlatformAuth  OPTIONAL
+  )
+{
+  EFI_STATUS                        Status;
+  UINTN                             DataSize;
+  EFI_TCG2_PHYSICAL_PRESENCE        TcgPpData;
+  EFI_TCG2_PROTOCOL                 *Tcg2Protocol;
+  EDKII_VARIABLE_LOCK_PROTOCOL      *VariableLockProtocol;
+  EFI_TCG2_PHYSICAL_PRESENCE_FLAGS  PpiFlags;
+
+  Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) 
&Tcg2Protocol);
+  if (EFI_ERROR (Status)) {
+    return ;
+  }
+  
+  //
+  // Check S4 resume
+  //
+  if (GetBootModeHob () == BOOT_ON_S4_RESUME) {
+    DEBUG ((EFI_D_INFO, "S4 Resume, Skip TPM PP process!\n"));
+    return ;
+  }
+
+  mTcg2PpStringPackHandle = HiiAddPackages (&gEfiTcg2PhysicalPresenceGuid, 
gImageHandle, DxeTcg2PhysicalPresenceLibStrings, NULL);
+  ASSERT (mTcg2PpStringPackHandle != NULL);
+
+  //
+  // Initialize physical presence flags.
+  //
+  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE_FLAGS);
+  Status = gRT->GetVariable (
+                  TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE,
+                  &gEfiTcg2PhysicalPresenceGuid,
+                  NULL,
+                  &DataSize,
+                  &PpiFlags
+                  );
+  if (EFI_ERROR (Status)) {
+    PpiFlags.PPFlags = TCG2_BIOS_TPM_MANAGEMENT_FLAG_DEFAULT;
+    Status   = gRT->SetVariable (
+                      TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE,
+                      &gEfiTcg2PhysicalPresenceGuid,
+                      EFI_VARIABLE_NON_VOLATILE | 
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
+                      sizeof (EFI_TCG2_PHYSICAL_PRESENCE_FLAGS),
+                      &PpiFlags
+                      );
+    if (EFI_ERROR (Status)) {
+      DEBUG ((EFI_D_ERROR, "[TPM2] Set physical presence flag failed, Status = 
%r\n", Status));
+      return ;
+    }
+  }
+  DEBUG ((EFI_D_INFO, "[TPM2] PpiFlags = %x\n", PpiFlags.PPFlags));
+
+  //
+  // This flags variable controls whether physical presence is required for 
TPM command. 
+  // It should be protected from malicious software. We set it as read-only 
variable here.
+  //
+  Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID 
**)&VariableLockProtocol);
+  if (!EFI_ERROR (Status)) {
+    Status = VariableLockProtocol->RequestToLock (
+                                     VariableLockProtocol,
+                                     TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE,
+                                     &gEfiTcg2PhysicalPresenceGuid
+                                     );
+    if (EFI_ERROR (Status)) {
+      DEBUG ((EFI_D_ERROR, "[TPM2] Error when lock variable %s, Status = 
%r\n", TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE, Status));
+      ASSERT_EFI_ERROR (Status);
+    }
+  }
+  
+  //
+  // Initialize physical presence variable.
+  //
+  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);
+  Status = gRT->GetVariable (
+                  TCG2_PHYSICAL_PRESENCE_VARIABLE,
+                  &gEfiTcg2PhysicalPresenceGuid,
+                  NULL,
+                  &DataSize,
+                  &TcgPpData
+                  );
+  if (EFI_ERROR (Status)) {
+    ZeroMem ((VOID*)&TcgPpData, sizeof (TcgPpData));
+    DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);
+    Status   = gRT->SetVariable (
+                      TCG2_PHYSICAL_PRESENCE_VARIABLE,
+                      &gEfiTcg2PhysicalPresenceGuid,
+                      EFI_VARIABLE_NON_VOLATILE | 
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
+                      DataSize,
+                      &TcgPpData
+                      );
+    if (EFI_ERROR (Status)) {
+      DEBUG ((EFI_D_ERROR, "[TPM2] Set physical presence variable failed, 
Status = %r\n", Status));
+      return ;
+    }
+  }
+
+  DEBUG ((EFI_D_INFO, "[TPM2] Flags=%x, PPRequest=%x (LastPPRequest=%x)\n", 
PpiFlags.PPFlags, TcgPpData.PPRequest, TcgPpData.LastPPRequest));
+
+  //
+  // Execute pending TPM request.
+  //  
+  Tcg2ExecutePendingTpmRequest (PlatformAuth, &TcgPpData, PpiFlags);
+  DEBUG ((EFI_D_INFO, "[TPM2] PPResponse = %x (LastPPRequest=%x, Flags=%x)\n", 
TcgPpData.PPResponse, TcgPpData.LastPPRequest, PpiFlags.PPFlags));
+
+}
+
+/**
+  Check if the pending TPM request needs user input to confirm.
+
+  The TPM request may come from OS. This API will check if TPM request exists 
and need user
+  input to confirmation.
+  
+  @retval    TRUE        TPM needs input to confirm user physical presence.
+  @retval    FALSE       TPM doesn't need input to confirm user physical 
presence.
+
+**/
+BOOLEAN
+EFIAPI
+Tcg2PhysicalPresenceLibNeedUserConfirm(
+  VOID
+  )
+{
+  EFI_STATUS                        Status;
+  EFI_TCG2_PHYSICAL_PRESENCE        TcgPpData;
+  UINTN                             DataSize;
+  BOOLEAN                           RequestConfirmed;
+  EFI_TCG2_PROTOCOL                 *Tcg2Protocol;
+  EFI_TCG2_PHYSICAL_PRESENCE_FLAGS  PpiFlags;
+
+  Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) 
&Tcg2Protocol);
+  if (EFI_ERROR (Status)) {
+    return FALSE;
+  }
+
+  //
+  // Check S4 resume
+  //
+  if (GetBootModeHob () == BOOT_ON_S4_RESUME) {
+    DEBUG ((EFI_D_INFO, "S4 Resume, Skip TPM PP process!\n"));
+    return FALSE;
+  }
+
+  //
+  // Check Tpm requests
+  //
+  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);
+  Status = gRT->GetVariable (
+                  TCG2_PHYSICAL_PRESENCE_VARIABLE,
+                  &gEfiTcg2PhysicalPresenceGuid,
+                  NULL,
+                  &DataSize,
+                  &TcgPpData
+                  );
+  if (EFI_ERROR (Status)) {
+    return FALSE;
+  }
+
+  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE_FLAGS);
+  Status = gRT->GetVariable (
+                  TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE,
+                  &gEfiTcg2PhysicalPresenceGuid,
+                  NULL,
+                  &DataSize,
+                  &PpiFlags
+                  );
+  if (EFI_ERROR (Status)) {
+    return FALSE;
+  }
+  
+  if (TcgPpData.PPRequest == TCG2_PHYSICAL_PRESENCE_NO_ACTION) {
+    //
+    // No operation request
+    //
+    return FALSE;
+  }
+
+  if (!Tcg2HaveValidTpmRequest(&TcgPpData, PpiFlags, &RequestConfirmed)) {
+    //
+    // Invalid operation request.
+    //
+    return FALSE;
+  }
+
+  if (!RequestConfirmed) {
+    //
+    // Need UI to confirm
+    //
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+
+/**
+  The handler for TPM physical presence function:
+  Return TPM Operation Response to OS Environment.
+
+  @param[out]     MostRecentRequest Most recent operation request.
+  @param[out]     Response          Response to the most recent operation 
request.
+
+  @return Return Code for Return TPM Operation Response to OS Environment.
+**/
+UINT32
+EFIAPI
+Tcg2PhysicalPresenceLibReturnOperationResponseToOsFunction (
+  OUT UINT32                *MostRecentRequest,
+  OUT UINT32                *Response
+  )
+{
+  EFI_STATUS                        Status;
+  UINTN                             DataSize;
+  EFI_TCG2_PHYSICAL_PRESENCE        PpData;
+  
+  DEBUG ((EFI_D_INFO, "[TPM2] ReturnOperationResponseToOsFunction\n"));
+
+  //
+  // Get the Physical Presence variable
+  //
+  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);
+  Status = gRT->GetVariable (
+                  TCG2_PHYSICAL_PRESENCE_VARIABLE,
+                  &gEfiTcg2PhysicalPresenceGuid,
+                  NULL,
+                  &DataSize,
+                  &PpData
+                  );
+  if (EFI_ERROR (Status)) {
+    *MostRecentRequest = 0;
+    *Response          = 0;
+    DEBUG ((EFI_D_ERROR, "[TPM2] Get PP variable failure! Status = %r\n", 
Status));
+    return TCG_PP_RETURN_TPM_OPERATION_RESPONSE_FAILURE;
+  }
+  
+  *MostRecentRequest = PpData.LastPPRequest;
+  *Response          = PpData.PPResponse;
+
+  return TCG_PP_RETURN_TPM_OPERATION_RESPONSE_SUCCESS;
+}
+
+/**
+  The handler for TPM physical presence function:
+  Submit TPM Operation Request to Pre-OS Environment and
+  Submit TPM Operation Request to Pre-OS Environment 2.
+
+  Caution: This function may receive untrusted input.
+  
+  @param[in]      OperationRequest TPM physical presence operation request.
+  @param[in]      RequestParameter TPM physical presence operation request 
parameter.
+
+  @return Return Code for Submit TPM Operation Request to Pre-OS Environment 
and
+          Submit TPM Operation Request to Pre-OS Environment 2.
+**/
+UINT32
+EFIAPI
+Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (
+  IN UINT32                 OperationRequest,
+  IN UINT32                 RequestParameter
+  )
+{
+  EFI_STATUS                        Status;
+  UINTN                             DataSize;
+  EFI_TCG2_PHYSICAL_PRESENCE        PpData;
+  EFI_TCG2_PHYSICAL_PRESENCE_FLAGS  Flags;
+  
+  DEBUG ((EFI_D_INFO, "[TPM2] SubmitRequestToPreOSFunction, Request = %x, 
%x\n", OperationRequest, RequestParameter));
+  
+  //
+  // Get the Physical Presence variable
+  //
+  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);
+  Status = gRT->GetVariable (
+                  TCG2_PHYSICAL_PRESENCE_VARIABLE,
+                  &gEfiTcg2PhysicalPresenceGuid,
+                  NULL,
+                  &DataSize,
+                  &PpData
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((EFI_D_ERROR, "[TPM2] Get PP variable failure! Status = %r\n", 
Status));
+    return TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE;
+  }
+
+  if ((OperationRequest > TCG2_PHYSICAL_PRESENCE_NO_ACTION_MAX) &&
+      (OperationRequest < TCG2_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) ) {
+    //
+    // This command requires UI to prompt user for Auth data.
+    //
+    return TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED;
+  }
+
+  if (PpData.PPRequest != OperationRequest) {
+    PpData.PPRequest = (UINT8)OperationRequest;
+    PpData.PPRequestParameter = RequestParameter;
+    DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);
+    Status = gRT->SetVariable (
+                    TCG2_PHYSICAL_PRESENCE_VARIABLE,
+                    &gEfiTcg2PhysicalPresenceGuid,
+                    EFI_VARIABLE_NON_VOLATILE | 
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
+                    DataSize,
+                    &PpData
+                    );
+  }
+
+  if (EFI_ERROR (Status)) { 
+    DEBUG ((EFI_D_ERROR, "[TPM2] Set PP variable failure! Status = %r\n", 
Status));
+    return TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE;
+  }
+
+  if (OperationRequest >= TCG2_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {
+    DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE_FLAGS);
+    Status = gRT->GetVariable (
+                    TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE,
+                    &gEfiTcg2PhysicalPresenceGuid,
+                    NULL,
+                    &DataSize,
+                    &Flags
+                    );
+    if (EFI_ERROR (Status)) {
+      Flags.PPFlags = TCG2_BIOS_TPM_MANAGEMENT_FLAG_DEFAULT;
+    }
+    return Tcg2PpVendorLibSubmitRequestToPreOSFunction (OperationRequest, 
Flags.PPFlags, RequestParameter);
+  }
+
+  return TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS;
+}

Added: 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.inf
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.inf
                            (rev 0)
+++ 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.inf
    2015-08-13 08:24:17 UTC (rev 18219)
@@ -0,0 +1,69 @@
+## @file
+#  Executes TPM 2.0 requests from OS or BIOS
+#
+#  This library will check and execute TPM 2.0 request from OS or BIOS. The 
request may
+#  ask for user confirmation before execution.
+#
+#  Caution: This module requires additional review when modified.
+#  This driver will have external input - variable.
+#  This external input must be validated carefully to avoid security issue.
+#
+# Copyright (c) 2013 - 2015, 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                      = DxeTcg2PhysicalPresenceLib
+  MODULE_UNI_FILE                = DxeTcg2PhysicalPresenceLib.uni
+  FILE_GUID                      = 7E507A86-DE8B-4AD3-BC4C-0498389098D3
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = Tcg2PhysicalPresenceLib|DXE_DRIVER 
DXE_RUNTIME_DRIVER DXE_SAL_DRIVER UEFI_APPLICATION UEFI_DRIVER 
+
+#
+# The following information is for reference only and not required by the 
build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
+#
+
+[Sources]
+  DxeTcg2PhysicalPresenceLib.c
+  PhysicalPresenceStrings.uni
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  SecurityPkg/SecurityPkg.dec
+
+[LibraryClasses]
+  MemoryAllocationLib
+  UefiLib
+  UefiBootServicesTableLib
+  UefiDriverEntryPoint
+  UefiRuntimeServicesTableLib
+  BaseMemoryLib
+  DebugLib
+  PrintLib
+  HiiLib
+  HobLib
+  Tpm2CommandLib
+  Tcg2PpVendorLib
+
+[Protocols]
+  gEfiTcg2ProtocolGuid                 ## CONSUMES
+  gEdkiiVariableLockProtocolGuid       ## CONSUMES
+
+[Guids]
+  ## CONSUMES           ## HII
+  ## SOMETIMES_PRODUCES ## Variable:L"Tcg2PhysicalPresence"
+  ## SOMETIMES_CONSUMES ## Variable:L"Tcg2PhysicalPresence"
+  ## SOMETIMES_PRODUCES ## Variable:L"Tcg2PhysicalPresenceFlags"
+  ## SOMETIMES_CONSUMES ## Variable:L"Tcg2PhysicalPresenceFlags"
+  gEfiTcg2PhysicalPresenceGuid

Added: 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.uni
===================================================================
(Binary files differ)

Index: 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.uni
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.uni
    2015-08-13 08:22:05 UTC (rev 18218)
+++ 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.uni
    2015-08-13 08:24:17 UTC (rev 18219)

Property changes on: 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.uni
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/PhysicalPresenceStrings.uni
===================================================================
(Binary files differ)

Index: 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/PhysicalPresenceStrings.uni
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/PhysicalPresenceStrings.uni
       2015-08-13 08:22:05 UTC (rev 18218)
+++ 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/PhysicalPresenceStrings.uni
       2015-08-13 08:24:17 UTC (rev 18219)

Property changes on: 
trunk/edk2/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/PhysicalPresenceStrings.uni
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: 
trunk/edk2/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c    
    2015-08-13 08:22:05 UTC (rev 18218)
+++ 
trunk/edk2/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c    
    2015-08-13 08:24:17 UTC (rev 18219)
@@ -9,10 +9,10 @@
   DxeTpm2MeasureBootLibImageRead() function will make sure the PE/COFF image 
content
   read is within the image buffer.
 
-  TrEEMeasurePeImage() function will accept untrusted PE/COFF image and 
validate its
+  Tcg2MeasurePeImage() function will accept untrusted PE/COFF image and 
validate its
   data structure within this image buffer before use.
 
-  TrEEMeasureGptTable() function will receive untrusted GPT partition table, 
and parse
+  Tcg2MeasureGptTable() function will receive untrusted GPT partition table, 
and parse
   partition data carefully.
 
 Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>
@@ -28,7 +28,7 @@
 
 #include <PiDxe.h>
 
-#include <Protocol/TrEEProtocol.h>
+#include <Protocol/Tcg2Protocol.h>
 #include <Protocol/BlockIo.h>
 #include <Protocol/DiskIo.h>
 #include <Protocol/DevicePathToText.h>
@@ -51,15 +51,15 @@
 //
 // Flag to check GPT partition. It only need be measured once.
 //
-BOOLEAN                           mTrEEMeasureGptTableFlag = FALSE;
-UINTN                             mTrEEMeasureGptCount = 0;
-VOID                              *mTrEEFileBuffer;
-UINTN                             mTrEEImageSize;
+BOOLEAN                           mTcg2MeasureGptTableFlag = FALSE;
+UINTN                             mTcg2MeasureGptCount = 0;
+VOID                              *mTcg2FileBuffer;
+UINTN                             mTcg2ImageSize;
 //
 // Measured FV handle cache
 //
-EFI_HANDLE                        mTrEECacheMeasuredHandle  = NULL;
-MEASURED_HOB_DATA                 *mTrEEMeasuredHobData     = NULL;
+EFI_HANDLE                        mTcg2CacheMeasuredHandle  = NULL;
+MEASURED_HOB_DATA                 *mTcg2MeasuredHobData     = NULL;
 
 /**
   Reads contents of a PE/COFF image in memory buffer.
@@ -96,11 +96,11 @@
   }
 
   EndPosition = FileOffset + *ReadSize;
-  if (EndPosition > mTrEEImageSize) {
-    *ReadSize = (UINT32)(mTrEEImageSize - FileOffset);
+  if (EndPosition > mTcg2ImageSize) {
+    *ReadSize = (UINT32)(mTcg2ImageSize - FileOffset);
   }
 
-  if (FileOffset >= mTrEEImageSize) {
+  if (FileOffset >= mTcg2ImageSize) {
     *ReadSize = 0;
   }
 
@@ -115,7 +115,7 @@
   Caution: This function may receive untrusted input.
   The GPT partition table is external input, so this function should parse 
partition data carefully.
 
-  @param TreeProtocol            Pointer to the located TREE protocol instance.
+  @param Tcg2Protocol            Pointer to the located TCG2 protocol instance.
   @param GptHandle               Handle that GPT partition was installed.
 
   @retval EFI_SUCCESS            Successfully measure GPT table.
@@ -126,8 +126,8 @@
 **/
 EFI_STATUS
 EFIAPI
-TrEEMeasureGptTable (
-  IN  EFI_TREE_PROTOCOL  *TreeProtocol,
+Tcg2MeasureGptTable (
+  IN  EFI_TCG2_PROTOCOL  *Tcg2Protocol,
   IN  EFI_HANDLE         GptHandle
   )
 {
@@ -139,11 +139,11 @@
   UINT8                             *EntryPtr;
   UINTN                             NumberOfPartition;
   UINT32                            Index;
-  TrEE_EVENT                        *TreeEvent;
+  EFI_TCG2_EVENT                    *Tcg2Event;
   EFI_GPT_DATA                      *GptData;
   UINT32                            EventSize;
 
-  if (mTrEEMeasureGptCount > 0) {
+  if (mTcg2MeasureGptCount > 0) {
     return EFI_SUCCESS;
   }
 
@@ -212,19 +212,19 @@
   // 
   EventSize = (UINT32)(sizeof (EFI_GPT_DATA) - sizeof (GptData->Partitions) 
                         + NumberOfPartition * 
PrimaryHeader->SizeOfPartitionEntry);
-  TreeEvent = (TrEE_EVENT *) AllocateZeroPool (EventSize + sizeof (TrEE_EVENT) 
- sizeof(TreeEvent->Event));
-  if (TreeEvent == NULL) {
+  Tcg2Event = (EFI_TCG2_EVENT *) AllocateZeroPool (EventSize + sizeof 
(EFI_TCG2_EVENT) - sizeof(Tcg2Event->Event));
+  if (Tcg2Event == NULL) {
     FreePool (PrimaryHeader);
     FreePool (EntryPtr);
     return EFI_OUT_OF_RESOURCES;
   }
 
-  TreeEvent->Size = EventSize + sizeof (TrEE_EVENT) - sizeof(TreeEvent->Event);
-  TreeEvent->Header.HeaderSize    = sizeof(TrEE_EVENT_HEADER);
-  TreeEvent->Header.HeaderVersion = TREE_EVENT_HEADER_VERSION;
-  TreeEvent->Header.PCRIndex      = 5;
-  TreeEvent->Header.EventType     = EV_EFI_GPT_EVENT;
-  GptData = (EFI_GPT_DATA *) TreeEvent->Event;  
+  Tcg2Event->Size = EventSize + sizeof (EFI_TCG2_EVENT) - 
sizeof(Tcg2Event->Event);
+  Tcg2Event->Header.HeaderSize    = sizeof(EFI_TCG2_EVENT_HEADER);
+  Tcg2Event->Header.HeaderVersion = EFI_TCG2_EVENT_HEADER_VERSION;
+  Tcg2Event->Header.PCRIndex      = 5;
+  Tcg2Event->Header.EventType     = EV_EFI_GPT_EVENT;
+  GptData = (EFI_GPT_DATA *) Tcg2Event->Event;  
 
   //
   // Copy the EFI_PARTITION_TABLE_HEADER and NumberOfPartition
@@ -251,20 +251,20 @@
   //
   // Measure the GPT data
   //
-  Status = TreeProtocol->HashLogExtendEvent (
-             TreeProtocol,
+  Status = Tcg2Protocol->HashLogExtendEvent (
+             Tcg2Protocol,
              0,
              (EFI_PHYSICAL_ADDRESS) (UINTN) (VOID *) GptData,
              (UINT64) EventSize,
-             TreeEvent
+             Tcg2Event
              );
   if (!EFI_ERROR (Status)) {
-    mTrEEMeasureGptCount++;
+    mTcg2MeasureGptCount++;
   }
 
   FreePool (PrimaryHeader);
   FreePool (EntryPtr);
-  FreePool (TreeEvent);
+  FreePool (Tcg2Event);
 
   return Status;
 }
@@ -277,7 +277,7 @@
   PE/COFF image is external input, so this function will validate its data 
structure
   within this image buffer before use.
 
-  @param[in] TreeProtocol   Pointer to the located TREE protocol instance.
+  @param[in] Tcg2Protocol   Pointer to the located TCG2 protocol instance.
   @param[in] ImageAddress   Start address of image buffer.
   @param[in] ImageSize      Image size
   @param[in] LinkTimeBase   Address that the image is loaded into memory.
@@ -292,8 +292,8 @@
 **/
 EFI_STATUS
 EFIAPI
-TrEEMeasurePeImage (
-  IN  EFI_TREE_PROTOCOL         *TreeProtocol,
+Tcg2MeasurePeImage (
+  IN  EFI_TCG2_PROTOCOL         *Tcg2Protocol,
   IN  EFI_PHYSICAL_ADDRESS      ImageAddress,
   IN  UINTN                     ImageSize,
   IN  UINTN                     LinkTimeBase,
@@ -302,7 +302,7 @@
   )
 {
   EFI_STATUS                        Status;
-  TrEE_EVENT                        *TreeEvent;
+  EFI_TCG2_EVENT                    *Tcg2Event;
   EFI_IMAGE_LOAD_EVENT              *ImageLoad;
   UINT32                            FilePathSize;
   UINT32                            EventSize;
@@ -315,33 +315,33 @@
   // Determine destination PCR by BootPolicy
   //
   EventSize = sizeof (*ImageLoad) - sizeof (ImageLoad->DevicePath) + 
FilePathSize;
-  TreeEvent = AllocateZeroPool (EventSize + sizeof (TrEE_EVENT) - 
sizeof(TreeEvent->Event));
-  if (TreeEvent == NULL) {
+  Tcg2Event = AllocateZeroPool (EventSize + sizeof (EFI_TCG2_EVENT) - 
sizeof(Tcg2Event->Event));
+  if (Tcg2Event == NULL) {
     return EFI_OUT_OF_RESOURCES;
   }
 
-  TreeEvent->Size = EventSize + sizeof (TrEE_EVENT) - sizeof(TreeEvent->Event);
-  TreeEvent->Header.HeaderSize    = sizeof(TrEE_EVENT_HEADER);
-  TreeEvent->Header.HeaderVersion = TREE_EVENT_HEADER_VERSION;
-  ImageLoad           = (EFI_IMAGE_LOAD_EVENT *) TreeEvent->Event;
+  Tcg2Event->Size = EventSize + sizeof (EFI_TCG2_EVENT) - 
sizeof(Tcg2Event->Event);
+  Tcg2Event->Header.HeaderSize    = sizeof(EFI_TCG2_EVENT_HEADER);
+  Tcg2Event->Header.HeaderVersion = EFI_TCG2_EVENT_HEADER_VERSION;
+  ImageLoad           = (EFI_IMAGE_LOAD_EVENT *) Tcg2Event->Event;
 
   switch (ImageType) {
     case EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION:
-      TreeEvent->Header.EventType = EV_EFI_BOOT_SERVICES_APPLICATION;
-      TreeEvent->Header.PCRIndex  = 4;
+      Tcg2Event->Header.EventType = EV_EFI_BOOT_SERVICES_APPLICATION;
+      Tcg2Event->Header.PCRIndex  = 4;
       break;
     case EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
-      TreeEvent->Header.EventType = EV_EFI_BOOT_SERVICES_DRIVER;
-      TreeEvent->Header.PCRIndex  = 2;
+      Tcg2Event->Header.EventType = EV_EFI_BOOT_SERVICES_DRIVER;
+      Tcg2Event->Header.PCRIndex  = 2;
       break;
     case EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
-      TreeEvent->Header.EventType = EV_EFI_RUNTIME_SERVICES_DRIVER;
-      TreeEvent->Header.PCRIndex  = 2;
+      Tcg2Event->Header.EventType = EV_EFI_RUNTIME_SERVICES_DRIVER;
+      Tcg2Event->Header.PCRIndex  = 2;
       break;
     default:
       DEBUG ((
         EFI_D_ERROR,
-        "TrEEMeasurePeImage: Unknown subsystem type %d",
+        "Tcg2MeasurePeImage: Unknown subsystem type %d",
         ImageType
         ));
       goto Finish;
@@ -358,12 +358,12 @@
   //
   // Log the PE data
   //
-  Status = TreeProtocol->HashLogExtendEvent (
-             TreeProtocol,
+  Status = Tcg2Protocol->HashLogExtendEvent (
+             Tcg2Protocol,
              PE_COFF_IMAGE,
              ImageAddress,
              ImageSize,
-             TreeEvent
+             Tcg2Event
              );
   if (Status == EFI_VOLUME_FULL) {
     //
@@ -375,7 +375,7 @@
   }
 
 Finish:
-  FreePool (TreeEvent);
+  FreePool (Tcg2Event);
 
   return Status;
 }
@@ -428,9 +428,9 @@
   IN  BOOLEAN                          BootPolicy
   )
 {
-  EFI_TREE_PROTOCOL                   *TreeProtocol;
+  EFI_TCG2_PROTOCOL                   *Tcg2Protocol;
   EFI_STATUS                          Status;
-  TREE_BOOT_SERVICE_CAPABILITY        ProtocolCapability;
+  EFI_TCG2_BOOT_SERVICE_CAPABILITY    ProtocolCapability;
   EFI_DEVICE_PATH_PROTOCOL            *DevicePathNode;
   EFI_DEVICE_PATH_PROTOCOL            *OrigDevicePathNode;
   EFI_HANDLE                          Handle;
@@ -441,26 +441,26 @@
   EFI_PHYSICAL_ADDRESS                FvAddress;
   UINT32                              Index;
 
-  Status = gBS->LocateProtocol (&gEfiTrEEProtocolGuid, NULL, (VOID **) 
&TreeProtocol);
+  Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) 
&Tcg2Protocol);
   if (EFI_ERROR (Status)) {
     //
-    // TrEE protocol is not installed. So, TPM2 is not present.
+    // Tcg2 protocol is not installed. So, TPM2 is not present.
     // Don't do any measurement, and directly return EFI_SUCCESS.
     //
-    DEBUG ((EFI_D_INFO, "DxeTpm2MeasureBootHandler - TrEE - %r\n", Status));
+    DEBUG ((EFI_D_INFO, "DxeTpm2MeasureBootHandler - Tcg2 - %r\n", Status));
     return EFI_SUCCESS;
   }
 
   ProtocolCapability.Size = (UINT8) sizeof (ProtocolCapability);
-  Status = TreeProtocol->GetCapability (
-                           TreeProtocol, 
+  Status = Tcg2Protocol->GetCapability (
+                           Tcg2Protocol, 
                            &ProtocolCapability
                            );
-  if (EFI_ERROR (Status) || (!ProtocolCapability.TrEEPresentFlag)) {
+  if (EFI_ERROR (Status) || (!ProtocolCapability.TPMPresentFlag)) {
     //
     // TPM device doesn't work or activate.
     //
-    DEBUG ((EFI_D_ERROR, "DxeTpm2MeasureBootHandler (%r) - TrEEPresentFlag - 
%x\n", Status, ProtocolCapability.TrEEPresentFlag));
+    DEBUG ((EFI_D_ERROR, "DxeTpm2MeasureBootHandler (%r) - TPMPresentFlag - 
%x\n", Status, ProtocolCapability.TPMPresentFlag));
     return EFI_SUCCESS;
   }
 
@@ -475,7 +475,7 @@
   //
   DevicePathNode = OrigDevicePathNode;
   Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &DevicePathNode, 
&Handle);
-  if (!EFI_ERROR (Status) && !mTrEEMeasureGptTableFlag) {
+  if (!EFI_ERROR (Status) && !mTcg2MeasureGptTableFlag) {
     //
     // Find the gpt partion on the given devicepath
     //
@@ -508,13 +508,13 @@
             //
             // Measure GPT disk.
             //
-            Status = TrEEMeasureGptTable (TreeProtocol, Handle);
-            DEBUG ((EFI_D_INFO, "DxeTpm2MeasureBootHandler - 
TrEEMeasureGptTable - %r\n", Status));
+            Status = Tcg2MeasureGptTable (Tcg2Protocol, Handle);
+            DEBUG ((EFI_D_INFO, "DxeTpm2MeasureBootHandler - 
Tcg2MeasureGptTable - %r\n", Status));
             if (!EFI_ERROR (Status)) {
               //
               // GPT disk check done.
               //
-              mTrEEMeasureGptTableFlag = TRUE;
+              mTcg2MeasureGptTableFlag = TRUE;
             }
           }
           FreePool (OrigDevicePathNode);
@@ -553,7 +553,7 @@
     //
     ApplicationRequired = TRUE;
 
-    if (mTrEECacheMeasuredHandle != Handle && mTrEEMeasuredHobData != NULL) {
+    if (mTcg2CacheMeasuredHandle != Handle && mTcg2MeasuredHobData != NULL) {
       //
       // Search for Root FV of this PE image
       //
@@ -577,12 +577,12 @@
 
       ApplicationRequired = FALSE;
 
-      for (Index = 0; Index < mTrEEMeasuredHobData->Num; Index++) {
-        if(mTrEEMeasuredHobData->MeasuredFvBuf[Index].BlobBase == FvAddress) {
+      for (Index = 0; Index < mTcg2MeasuredHobData->Num; Index++) {
+        if(mTcg2MeasuredHobData->MeasuredFvBuf[Index].BlobBase == FvAddress) {
           //
           // Cache measured FV for next measurement
           //
-          mTrEECacheMeasuredHandle = Handle;
+          mTcg2CacheMeasuredHandle = Handle;
           ApplicationRequired  = TRUE;
           break;
         }
@@ -598,8 +598,8 @@
     goto Finish;
   }
 
-  mTrEEImageSize  = FileSize;
-  mTrEEFileBuffer = FileBuffer;
+  mTcg2ImageSize  = FileSize;
+  mTcg2FileBuffer = FileBuffer;
 
   //
   // Measure PE Image
@@ -645,15 +645,15 @@
     //
     // Measure PE image into TPM log.
     //
-    Status = TrEEMeasurePeImage (
-               TreeProtocol,
+    Status = Tcg2MeasurePeImage (
+               Tcg2Protocol,
                (EFI_PHYSICAL_ADDRESS) (UINTN) FileBuffer, 
                FileSize, 
                (UINTN) ImageContext.ImageAddress, 
                ImageContext.ImageType, 
                DevicePathNode
                );
-    DEBUG ((EFI_D_INFO, "DxeTpm2MeasureBootHandler - TrEEMeasurePeImage - 
%r\n", Status));
+    DEBUG ((EFI_D_INFO, "DxeTpm2MeasureBootHandler - Tcg2MeasurePeImage - 
%r\n", Status));
   }
 
   //
@@ -692,7 +692,7 @@
   GuidHob = GetFirstGuidHob (&gMeasuredFvHobGuid);
 
   if (GuidHob != NULL) {
-    mTrEEMeasuredHobData = GET_GUID_HOB_DATA (GuidHob);
+    mTcg2MeasuredHobData = GET_GUID_HOB_DATA (GuidHob);
   }
 
   return RegisterSecurity2Handler (

Modified: 
trunk/edk2/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf  
    2015-08-13 08:22:05 UTC (rev 18218)
+++ 
trunk/edk2/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf  
    2015-08-13 08:24:17 UTC (rev 18219)
@@ -61,7 +61,7 @@
   gZeroGuid                             ## SOMETIMES_CONSUMES ## GUID
 
 [Protocols]
-  gEfiTrEEProtocolGuid                  ## SOMETIMES_CONSUMES
+  gEfiTcg2ProtocolGuid                  ## SOMETIMES_CONSUMES
   gEfiFirmwareVolumeBlockProtocolGuid   ## SOMETIMES_CONSUMES
   gEfiBlockIoProtocolGuid               ## SOMETIMES_CONSUMES
   gEfiDiskIoProtocolGuid                ## SOMETIMES_CONSUMES

Modified: 
trunk/edk2/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c
===================================================================
--- trunk/edk2/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c  
2015-08-13 08:22:05 UTC (rev 18218)
+++ trunk/edk2/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c  
2015-08-13 08:24:17 UTC (rev 18219)
@@ -1,7 +1,7 @@
 /** @file
   This library is used by other modules to measure data to TPM.
 
-Copyright (c) 2012 - 2013, Intel Corporation. All rights reserved. <BR>
+Copyright (c) 2012 - 2015, 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
@@ -15,7 +15,7 @@
 #include <PiDxe.h>
 
 #include <Protocol/TcgService.h>
-#include <Protocol/TrEEProtocol.h>
+#include <Protocol/Tcg2Protocol.h>
 
 #include <Library/BaseMemoryLib.h>
 #include <Library/MemoryAllocationLib.h>
@@ -120,37 +120,37 @@
   )
 {
   EFI_STATUS                Status;
-  EFI_TREE_PROTOCOL         *TreeProtocol;
-  TrEE_EVENT                *TreeEvent;
+  EFI_TCG2_PROTOCOL         *Tcg2Protocol;
+  EFI_TCG2_EVENT            *Tcg2Event;
 
   //
-  // TrEEPresentFlag is checked in HashLogExtendEvent
+  // TPMPresentFlag is checked in HashLogExtendEvent
   //
-  Status = gBS->LocateProtocol (&gEfiTrEEProtocolGuid, NULL, (VOID **) 
&TreeProtocol);
+  Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) 
&Tcg2Protocol);
   if (EFI_ERROR (Status)) {
     return Status;
   }
 
-  TreeEvent = (TrEE_EVENT *) AllocateZeroPool (LogLen + sizeof (TrEE_EVENT));
-  if(TreeEvent == NULL) {
+  Tcg2Event = (EFI_TCG2_EVENT *) AllocateZeroPool (LogLen + sizeof 
(EFI_TCG2_EVENT));
+  if(Tcg2Event == NULL) {
     return EFI_OUT_OF_RESOURCES;
   }
 
-  TreeEvent->Size = (UINT32)LogLen + sizeof (TrEE_EVENT) - 
sizeof(TreeEvent->Event);
-  TreeEvent->Header.HeaderSize    = sizeof(TrEE_EVENT_HEADER);
-  TreeEvent->Header.HeaderVersion = TREE_EVENT_HEADER_VERSION;
-  TreeEvent->Header.PCRIndex      = PcrIndex;
-  TreeEvent->Header.EventType     = EventType;
-  CopyMem (&TreeEvent->Event[0], EventLog, LogLen);
+  Tcg2Event->Size = (UINT32)LogLen + sizeof (EFI_TCG2_EVENT) - 
sizeof(Tcg2Event->Event);
+  Tcg2Event->Header.HeaderSize    = sizeof(EFI_TCG2_EVENT_HEADER);
+  Tcg2Event->Header.HeaderVersion = EFI_TCG2_EVENT_HEADER_VERSION;
+  Tcg2Event->Header.PCRIndex      = PcrIndex;
+  Tcg2Event->Header.EventType     = EventType;
+  CopyMem (&Tcg2Event->Event[0], EventLog, LogLen);
 
-  Status = TreeProtocol->HashLogExtendEvent (
-                           TreeProtocol,
+  Status = Tcg2Protocol->HashLogExtendEvent (
+                           Tcg2Protocol,
                            0,
                            (EFI_PHYSICAL_ADDRESS)(UINTN)HashData,
                            HashDataLen,
-                           TreeEvent
+                           Tcg2Event
                            );
-  FreePool (TreeEvent);
+  FreePool (Tcg2Event);
 
   return Status;
 }

Modified: 
trunk/edk2/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.inf
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.inf    
    2015-08-13 08:22:05 UTC (rev 18218)
+++ 
trunk/edk2/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.inf    
    2015-08-13 08:24:17 UTC (rev 18219)
@@ -46,4 +46,4 @@
 
 [Protocols]
   gEfiTcgProtocolGuid           ## SOMETIMES_CONSUMES
-  gEfiTrEEProtocolGuid          ## SOMETIMES_CONSUMES
+  gEfiTcg2ProtocolGuid          ## SOMETIMES_CONSUMES

Modified: 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterCommon.c
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterCommon.c
      2015-08-13 08:22:05 UTC (rev 18218)
+++ 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterCommon.c
      2015-08-13 08:24:17 UTC (rev 18219)
@@ -1,7 +1,7 @@
 /** @file
   Ihis is BaseCrypto router support function.
 
-Copyright (c) 2013, Intel Corporation. All rights reserved. <BR>
+Copyright (c) 2013 - 2015, 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
@@ -19,7 +19,7 @@
 #include <Library/DebugLib.h>
 #include <Library/MemoryAllocationLib.h>
 #include <Library/HashLib.h>
-#include <Protocol/TrEEProtocol.h>
+#include <Protocol/Tcg2Protocol.h>
 
 typedef struct {
   EFI_GUID  Guid;
@@ -27,10 +27,10 @@
 } TPM2_HASH_MASK;
 
 TPM2_HASH_MASK mTpm2HashMask[] = {
-  {HASH_ALGORITHM_SHA1_GUID,         TREE_BOOT_HASH_ALG_SHA1},
-  {HASH_ALGORITHM_SHA256_GUID,       TREE_BOOT_HASH_ALG_SHA256},
-  {HASH_ALGORITHM_SHA384_GUID,       TREE_BOOT_HASH_ALG_SHA384},
-  {HASH_ALGORITHM_SHA512_GUID,       TREE_BOOT_HASH_ALG_SHA512},
+  {HASH_ALGORITHM_SHA1_GUID,         HASH_ALG_SHA1},
+  {HASH_ALGORITHM_SHA256_GUID,       HASH_ALG_SHA256},
+  {HASH_ALGORITHM_SHA384_GUID,       HASH_ALG_SHA384},
+  {HASH_ALGORITHM_SHA512_GUID,       HASH_ALG_SHA512},
 };
 
 /**

Modified: 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c
 2015-08-13 08:22:05 UTC (rev 18218)
+++ 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c
 2015-08-13 08:24:17 UTC (rev 18219)
@@ -3,7 +3,7 @@
   hash handler registerd, such as SHA1, SHA256.
   Platform can use PcdTpm2HashMask to mask some hash engines.
 
-Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved. <BR>
+Copyright (c) 2013 - 2015, 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
@@ -44,6 +44,7 @@
 {
   HASH_HANDLE  *HashCtx;
   UINTN        Index;
+  UINT32       HashMask;
 
   if (mHashInterfaceCount == 0) {
     return EFI_UNSUPPORTED;
@@ -53,7 +54,10 @@
   ASSERT (HashCtx != NULL);
 
   for (Index = 0; Index < mHashInterfaceCount; Index++) {
-    mHashInterface[Index].HashInit (&HashCtx[Index]);
+    HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid);
+    if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {
+      mHashInterface[Index].HashInit (&HashCtx[Index]);
+    }
   }
 
   *HashHandle = (HASH_HANDLE)HashCtx;
@@ -80,6 +84,7 @@
 {
   HASH_HANDLE  *HashCtx;
   UINTN        Index;
+  UINT32       HashMask;
 
   if (mHashInterfaceCount == 0) {
     return EFI_UNSUPPORTED;
@@ -88,7 +93,10 @@
   HashCtx = (HASH_HANDLE *)HashHandle;
 
   for (Index = 0; Index < mHashInterfaceCount; Index++) {
-    mHashInterface[Index].HashUpdate (HashCtx[Index], DataToHash, 
DataToHashLen);
+    HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid);
+    if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {
+      mHashInterface[Index].HashUpdate (HashCtx[Index], DataToHash, 
DataToHashLen);
+    }
   }
 
   return EFI_SUCCESS;
@@ -119,6 +127,7 @@
   HASH_HANDLE        *HashCtx;
   UINTN              Index;
   EFI_STATUS         Status;
+  UINT32             HashMask;
 
   if (mHashInterfaceCount == 0) {
     return EFI_UNSUPPORTED;
@@ -128,9 +137,12 @@
   ZeroMem (DigestList, sizeof(*DigestList));
 
   for (Index = 0; Index < mHashInterfaceCount; Index++) {
-    mHashInterface[Index].HashUpdate (HashCtx[Index], DataToHash, 
DataToHashLen);
-    mHashInterface[Index].HashFinal (HashCtx[Index], &Digest);
-    Tpm2SetHashToDigestList (DigestList, &Digest);
+    HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid);
+    if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {
+      mHashInterface[Index].HashUpdate (HashCtx[Index], DataToHash, 
DataToHashLen);
+      mHashInterface[Index].HashFinal (HashCtx[Index], &Digest);
+      Tpm2SetHashToDigestList (DigestList, &Digest);
+    }
   }
 
   FreePool (HashCtx);
@@ -192,6 +204,7 @@
 {
   UINTN              Index;
   UINT32             HashMask;
+  UINT32             BiosSupportedHashMask;
 
   //
   // Check allow
@@ -204,6 +217,8 @@
   if (mHashInterfaceCount >= sizeof(mHashInterface)/sizeof(mHashInterface[0])) 
{
     return EFI_OUT_OF_RESOURCES;
   }
+  BiosSupportedHashMask = PcdGet32 (PcdTcg2HashAlgorithmBitmap);
+  PcdSet32 (PcdTcg2HashAlgorithmBitmap, BiosSupportedHashMask | HashMask);
 
   //
   // Check duplication

Modified: 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.inf
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.inf
       2015-08-13 08:22:05 UTC (rev 18218)
+++ 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.inf
       2015-08-13 08:24:17 UTC (rev 18219)
@@ -5,7 +5,7 @@
 #  hash handler registered, such as SHA1, SHA256. Platform can use 
PcdTpm2HashMask to 
 #  mask some hash engines.
 #
-# Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2013 - 2015, 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
@@ -48,5 +48,6 @@
   PcdLib
 
 [Pcd]
-  gEfiSecurityPkgTokenSpaceGuid.PcdTpm2HashMask       ## CONSUMES
+  gEfiSecurityPkgTokenSpaceGuid.PcdTpm2HashMask             ## CONSUMES
+  gEfiSecurityPkgTokenSpaceGuid.PcdTcg2HashAlgorithmBitmap  ## CONSUMES
 

Modified: 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c
 2015-08-13 08:22:05 UTC (rev 18218)
+++ 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c
 2015-08-13 08:24:17 UTC (rev 18219)
@@ -3,7 +3,7 @@
   hash handler registerd, such as SHA1, SHA256.
   Platform can use PcdTpm2HashMask to mask some hash engines.
 
-Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved. <BR>
+Copyright (c) 2013 - 2015, 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
@@ -72,6 +72,7 @@
   HASH_INTERFACE_HOB *HashInterfaceHob;
   HASH_HANDLE        *HashCtx;
   UINTN              Index;
+  UINT32             HashMask;
 
   HashInterfaceHob = InternalGetHashInterface ();
   if (HashInterfaceHob == NULL) {
@@ -86,7 +87,10 @@
   ASSERT (HashCtx != NULL);
 
   for (Index = 0; Index < HashInterfaceHob->HashInterfaceCount; Index++) {
-    HashInterfaceHob->HashInterface[Index].HashInit (&HashCtx[Index]);
+    HashMask = Tpm2GetHashMaskFromAlgo 
(&HashInterfaceHob->HashInterface[Index].HashGuid);
+    if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {
+      HashInterfaceHob->HashInterface[Index].HashInit (&HashCtx[Index]);
+    }
   }
 
   *HashHandle = (HASH_HANDLE)HashCtx;
@@ -114,6 +118,7 @@
   HASH_INTERFACE_HOB *HashInterfaceHob;
   HASH_HANDLE        *HashCtx;
   UINTN              Index;
+  UINT32             HashMask;
 
   HashInterfaceHob = InternalGetHashInterface ();
   if (HashInterfaceHob == NULL) {
@@ -127,7 +132,10 @@
   HashCtx = (HASH_HANDLE *)HashHandle;
 
   for (Index = 0; Index < HashInterfaceHob->HashInterfaceCount; Index++) {
-    HashInterfaceHob->HashInterface[Index].HashUpdate (HashCtx[Index], 
DataToHash, DataToHashLen);
+    HashMask = Tpm2GetHashMaskFromAlgo 
(&HashInterfaceHob->HashInterface[Index].HashGuid);
+    if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {
+      HashInterfaceHob->HashInterface[Index].HashUpdate (HashCtx[Index], 
DataToHash, DataToHashLen);
+    }
   }
 
   return EFI_SUCCESS;
@@ -159,6 +167,7 @@
   HASH_HANDLE        *HashCtx;
   UINTN              Index;
   EFI_STATUS         Status;
+  UINT32             HashMask;
 
   HashInterfaceHob = InternalGetHashInterface ();
   if (HashInterfaceHob == NULL) {
@@ -173,9 +182,12 @@
   ZeroMem (DigestList, sizeof(*DigestList));
 
   for (Index = 0; Index < HashInterfaceHob->HashInterfaceCount; Index++) {
-    HashInterfaceHob->HashInterface[Index].HashUpdate (HashCtx[Index], 
DataToHash, DataToHashLen);
-    HashInterfaceHob->HashInterface[Index].HashFinal (HashCtx[Index], &Digest);
-    Tpm2SetHashToDigestList (DigestList, &Digest);
+    HashMask = Tpm2GetHashMaskFromAlgo 
(&HashInterfaceHob->HashInterface[Index].HashGuid);
+    if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {
+      HashInterfaceHob->HashInterface[Index].HashUpdate (HashCtx[Index], 
DataToHash, DataToHashLen);
+      HashInterfaceHob->HashInterface[Index].HashFinal (HashCtx[Index], 
&Digest);
+      Tpm2SetHashToDigestList (DigestList, &Digest);
+    }
   }
 
   FreePool (HashCtx);
@@ -245,6 +257,7 @@
   HASH_INTERFACE_HOB *HashInterfaceHob;
   HASH_INTERFACE_HOB LocalHashInterfaceHob;
   UINT32             HashMask;
+  UINT32             BiosSupportedHashMask;
 
   //
   // Check allow
@@ -266,6 +279,8 @@
   if (HashInterfaceHob->HashInterfaceCount >= HASH_COUNT) {
     return EFI_OUT_OF_RESOURCES;
   }
+  BiosSupportedHashMask = PcdGet32 (PcdTcg2HashAlgorithmBitmap);
+  PcdSet32 (PcdTcg2HashAlgorithmBitmap, BiosSupportedHashMask | HashMask);
 
   //
   // Check duplication

Modified: 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.inf
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.inf
       2015-08-13 08:22:05 UTC (rev 18218)
+++ 
trunk/edk2/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.inf
       2015-08-13 08:24:17 UTC (rev 18219)
@@ -5,7 +5,7 @@
 #  hash handler registered, such as SHA1, SHA256. Platform can use 
PcdTpm2HashMask to 
 #  mask some hash engines.
 #
-# Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2013 - 2015, 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
@@ -49,5 +49,6 @@
   HobLib
 
 [Pcd]
-  gEfiSecurityPkgTokenSpaceGuid.PcdTpm2HashMask        ## CONSUMES
+  gEfiSecurityPkgTokenSpaceGuid.PcdTpm2HashMask             ## CONSUMES
+  gEfiSecurityPkgTokenSpaceGuid.PcdTcg2HashAlgorithmBitmap  ## CONSUMES
 

Modified: trunk/edk2/SecurityPkg/Library/HashLibTpm2/HashLibTpm2.c
===================================================================
--- trunk/edk2/SecurityPkg/Library/HashLibTpm2/HashLibTpm2.c    2015-08-13 
08:22:05 UTC (rev 18218)
+++ trunk/edk2/SecurityPkg/Library/HashLibTpm2/HashLibTpm2.c    2015-08-13 
08:24:17 UTC (rev 18219)
@@ -1,7 +1,7 @@
 /** @file
   Ihis library uses TPM2 device to calculation hash.
 
-Copyright (c) 2013, Intel Corporation. All rights reserved. <BR>
+Copyright (c) 2013 - 2015, 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
@@ -20,7 +20,6 @@
 #include <Library/MemoryAllocationLib.h>
 #include <Library/HashLib.h>
 #include <Library/PcdLib.h>
-#include <Protocol/TrEEProtocol.h>
 
 typedef struct {
   TPM_ALG_ID AlgoId;
@@ -28,10 +27,10 @@
 } TPM2_HASH_MASK;
 
 TPM2_HASH_MASK mTpm2HashMask[] = {
-  {TPM_ALG_SHA1,         TREE_BOOT_HASH_ALG_SHA1},
-  {TPM_ALG_SHA256,       TREE_BOOT_HASH_ALG_SHA256},
-  {TPM_ALG_SHA384,       TREE_BOOT_HASH_ALG_SHA384},
-  {TPM_ALG_SHA512,       TREE_BOOT_HASH_ALG_SHA512},
+  {TPM_ALG_SHA1,         HASH_ALG_SHA1},
+  {TPM_ALG_SHA256,       HASH_ALG_SHA256},
+  {TPM_ALG_SHA384,       HASH_ALG_SHA384},
+  {TPM_ALG_SHA512,       HASH_ALG_SHA512},
 };
 
 /**

Added: 
trunk/edk2/SecurityPkg/Library/PeiTcg2PhysicalPresenceLib/PeiTcg2PhysicalPresenceLib.c
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/PeiTcg2PhysicalPresenceLib/PeiTcg2PhysicalPresenceLib.c
                              (rev 0)
+++ 
trunk/edk2/SecurityPkg/Library/PeiTcg2PhysicalPresenceLib/PeiTcg2PhysicalPresenceLib.c
      2015-08-13 08:24:17 UTC (rev 18219)
@@ -0,0 +1,59 @@
+/** @file
+  Get TPM 2.0 physical presence information.
+  
+  This library will get TPM 2.0 physical presence information.
+
+Copyright (c) 2015, 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 <PiPei.h>
+
+#include <Guid/Tcg2PhysicalPresenceData.h>
+#include <Ppi/ReadOnlyVariable2.h>
+
+#include <Library/DebugLib.h>
+#include <Library/PeiServicesLib.h>
+#include <Library/PeiServicesTablePointerLib.h>
+#include <Library/Tcg2PhysicalPresenceLib.h>
+
+/**
+  Return TPM2 ManagementFlags set by PP interface.
+
+  @retval    ManagementFlags    TPM2 Management Flags.
+**/
+UINT32
+EFIAPI
+Tcg2PhysicalPresenceLibGetManagementFlags (
+  VOID
+  )
+{
+  EFI_STATUS                        Status;
+  EFI_PEI_READ_ONLY_VARIABLE2_PPI   *VariablePpi;
+  EFI_TCG2_PHYSICAL_PRESENCE_FLAGS  PpiFlags;
+  UINTN                             DataSize;
+  
+  Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, 
(VOID **) &VariablePpi);
+  ASSERT_EFI_ERROR (Status);
+
+  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE_FLAGS);
+  Status = VariablePpi->GetVariable (
+                          VariablePpi,
+                          TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE,
+                          &gEfiTcg2PhysicalPresenceGuid,
+                          NULL,
+                          &DataSize,
+                          &PpiFlags
+                          );
+  if (EFI_ERROR (Status)) {
+    PpiFlags.PPFlags = TCG2_BIOS_TPM_MANAGEMENT_FLAG_DEFAULT;
+  }
+  return PpiFlags.PPFlags;
+}

Added: 
trunk/edk2/SecurityPkg/Library/PeiTcg2PhysicalPresenceLib/PeiTcg2PhysicalPresenceLib.inf
===================================================================
--- 
trunk/edk2/SecurityPkg/Library/PeiTcg2PhysicalPresenceLib/PeiTcg2PhysicalPresenceLib.inf
                            (rev 0)
+++ 
trunk/edk2/SecurityPkg/Library/PeiTcg2PhysicalPresenceLib/PeiTcg2PhysicalPresenceLib.inf
    2015-08-13 08:24:17 UTC (rev 18219)
@@ -0,0 +1,52 @@
+## @file
+#  Get TPM 2.0 physical presence information.
+#
+#  This library will get TPM 2.0 physical presence information.
+#
+# Copyright (c) 2015, 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                      = PeiTcg2PhysicalPresenceLib
+  MODULE_UNI_FILE                = PeiTcg2PhysicalPresenceLib.uni
+  FILE_GUID                      = AB82E7BE-0970-480b-93EB-3D332B89F99E
+  MODULE_TYPE                    = PEIM
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = Tcg2PhysicalPresenceLib|PEIM
+
+#
+# The following information is for reference only and not required by the 
build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
+#
+
+[Sources]
+  PeiTcg2PhysicalPresenceLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  SecurityPkg/SecurityPkg.dec
+
+[LibraryClasses]
+  DebugLib
+  PeiServicesLib
+  PeiServicesTablePointerLib
+  
+[Guids]
+  ## SOMETIMES_CONSUMES ## Variable:L"PhysicalPresenceFlags"
+  gEfiTcg2PhysicalPresenceGuid
+
+[Ppis]
+  gEfiPeiReadOnlyVariable2PpiGuid       ## CONSUMES
+
+[Depex]
+  gEfiPeiReadOnlyVariable2PpiGuid
\ No newline at end of file

Added: 
trunk/edk2/SecurityPkg/Library/PeiTcg2PhysicalPresenceLib/PeiTcg2PhysicalPresenceLib.uni

@@ Diff output truncated at 100000 characters. @@

------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to