Contributed-under: TianoCore Contribution Agreement 1.0 Signed off by: Jiewen Yao <jiewen.yao@intel.com> Reviewed by: Eric Dong <eric.dong@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15766 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			167 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Implement TPM2 help.
 | |
| 
 | |
| Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved. <BR>
 | |
| This program and the accompanying materials
 | |
| are licensed and made available under the terms and conditions of the BSD License
 | |
| which accompanies this distribution.  The full text of the license may be found at
 | |
| http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include <IndustryStandard/UefiTcgPlatform.h>
 | |
| #include <Library/Tpm2CommandLib.h>
 | |
| #include <Library/Tpm2DeviceLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| 
 | |
| typedef struct {
 | |
|   TPMI_ALG_HASH              HashAlgo;
 | |
|   UINT16                     HashSize;
 | |
| } INTERNAL_HASH_INFO;
 | |
| 
 | |
| STATIC INTERNAL_HASH_INFO mHashInfo[] = {
 | |
|   {TPM_ALG_SHA1,          SHA1_DIGEST_SIZE},
 | |
|   {TPM_ALG_SHA256,        SHA256_DIGEST_SIZE},
 | |
|   {TPM_ALG_SM3_256,       SM3_256_DIGEST_SIZE},
 | |
|   {TPM_ALG_SHA384,        SHA384_DIGEST_SIZE},
 | |
|   {TPM_ALG_SHA512,        SHA512_DIGEST_SIZE},
 | |
| };
 | |
| 
 | |
| /**
 | |
|   Return size of digest.
 | |
| 
 | |
|   @param[in] HashAlgo  Hash algorithm
 | |
| 
 | |
|   @return size of digest
 | |
| **/
 | |
| UINT16
 | |
| EFIAPI
 | |
| GetHashSizeFromAlgo (
 | |
|   IN TPMI_ALG_HASH    HashAlgo
 | |
|   )
 | |
| {
 | |
|   UINTN  Index;
 | |
| 
 | |
|   for (Index = 0; Index < sizeof(mHashInfo)/sizeof(mHashInfo[0]); Index++) {
 | |
|     if (mHashInfo[Index].HashAlgo == HashAlgo) {
 | |
|       return mHashInfo[Index].HashSize;
 | |
|     }
 | |
|   }
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Copy AuthSessionIn to TPM2 command buffer.
 | |
| 
 | |
|   @param [in]  AuthSessionIn   Input AuthSession data
 | |
|   @param [out] AuthSessionOut  Output AuthSession data in TPM2 command buffer
 | |
| 
 | |
|   @return AuthSession size
 | |
| **/
 | |
| UINT32
 | |
| EFIAPI
 | |
| CopyAuthSessionCommand (
 | |
|   IN      TPMS_AUTH_COMMAND         *AuthSessionIn, OPTIONAL
 | |
|   OUT     UINT8                     *AuthSessionOut
 | |
|   )
 | |
| {
 | |
|   UINT8  *Buffer;
 | |
| 
 | |
|   Buffer = (UINT8 *)AuthSessionOut;
 | |
|   
 | |
|   //
 | |
|   // Add in Auth session
 | |
|   //
 | |
|   if (AuthSessionIn != NULL) {
 | |
|     //  sessionHandle
 | |
|     WriteUnaligned32 ((UINT32 *)Buffer, SwapBytes32(AuthSessionIn->sessionHandle));
 | |
|     Buffer += sizeof(UINT32);
 | |
| 
 | |
|     // nonce
 | |
|     WriteUnaligned16 ((UINT16 *)Buffer, SwapBytes16 (AuthSessionIn->nonce.size));
 | |
|     Buffer += sizeof(UINT16);
 | |
| 
 | |
|     CopyMem (Buffer, AuthSessionIn->nonce.buffer, AuthSessionIn->nonce.size);
 | |
|     Buffer += AuthSessionIn->nonce.size;
 | |
| 
 | |
|     // sessionAttributes
 | |
|     *(UINT8 *)Buffer = *(UINT8 *)&AuthSessionIn->sessionAttributes;
 | |
|     Buffer++;
 | |
| 
 | |
|     // hmac
 | |
|     WriteUnaligned16 ((UINT16 *)Buffer, SwapBytes16 (AuthSessionIn->hmac.size));
 | |
|     Buffer += sizeof(UINT16);
 | |
| 
 | |
|     CopyMem (Buffer, AuthSessionIn->hmac.buffer, AuthSessionIn->hmac.size);
 | |
|     Buffer += AuthSessionIn->hmac.size;
 | |
|   } else {
 | |
|     //  sessionHandle
 | |
|     WriteUnaligned32 ((UINT32 *)Buffer, SwapBytes32(TPM_RS_PW));
 | |
|     Buffer += sizeof(UINT32);
 | |
| 
 | |
|     // nonce = nullNonce
 | |
|     WriteUnaligned16 ((UINT16 *)Buffer, SwapBytes16(0));
 | |
|     Buffer += sizeof(UINT16);
 | |
| 
 | |
|     // sessionAttributes = 0
 | |
|     *(UINT8 *)Buffer = 0x00;
 | |
|     Buffer++;
 | |
| 
 | |
|     // hmac = nullAuth
 | |
|     WriteUnaligned16 ((UINT16 *)Buffer, SwapBytes16(0));
 | |
|     Buffer += sizeof(UINT16);
 | |
|   }
 | |
| 
 | |
|   return (UINT32)(UINTN)(Buffer - (UINT8 *)AuthSessionOut);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Copy AuthSessionIn from TPM2 response buffer.
 | |
| 
 | |
|   @param [in]  AuthSessionIn   Input AuthSession data in TPM2 response buffer
 | |
|   @param [out] AuthSessionOut  Output AuthSession data
 | |
| 
 | |
|   @return AuthSession size
 | |
| **/
 | |
| UINT32
 | |
| EFIAPI
 | |
| CopyAuthSessionResponse (
 | |
|   IN      UINT8                      *AuthSessionIn,
 | |
|   OUT     TPMS_AUTH_RESPONSE         *AuthSessionOut OPTIONAL
 | |
|   )
 | |
| {
 | |
|   UINT8                      *Buffer;
 | |
|   TPMS_AUTH_RESPONSE         LocalAuthSessionOut;
 | |
| 
 | |
|   if (AuthSessionOut == NULL) {
 | |
|     AuthSessionOut = &LocalAuthSessionOut;
 | |
|   }
 | |
| 
 | |
|   Buffer = (UINT8 *)AuthSessionIn;
 | |
| 
 | |
|   // nonce
 | |
|   AuthSessionOut->nonce.size = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));
 | |
|   Buffer += sizeof(UINT16);
 | |
| 
 | |
|   CopyMem (AuthSessionOut->nonce.buffer, Buffer, AuthSessionOut->nonce.size);
 | |
|   Buffer += AuthSessionOut->nonce.size;
 | |
| 
 | |
|   // sessionAttributes
 | |
|   *(UINT8 *)&AuthSessionOut->sessionAttributes = *(UINT8 *)Buffer;
 | |
|   Buffer++;
 | |
| 
 | |
|   // hmac
 | |
|   AuthSessionOut->hmac.size = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));
 | |
|   Buffer += sizeof(UINT16);
 | |
| 
 | |
|   CopyMem (AuthSessionOut->hmac.buffer, Buffer, AuthSessionOut->hmac.size);
 | |
|   Buffer += AuthSessionOut->hmac.size;
 | |
| 
 | |
|   return (UINT32)(UINTN)(Buffer - (UINT8 *)AuthSessionIn);
 | |
| }
 |