Home | History | Annotate | Download | only in Tpm2CommandLib
      1 /** @file
      2   Implement TPM2 help.
      3 
      4 Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved. <BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #include <IndustryStandard/UefiTcgPlatform.h>
     16 #include <Library/Tpm2CommandLib.h>
     17 #include <Library/Tpm2DeviceLib.h>
     18 #include <Library/BaseMemoryLib.h>
     19 #include <Library/BaseLib.h>
     20 #include <Library/DebugLib.h>
     21 
     22 typedef struct {
     23   TPMI_ALG_HASH              HashAlgo;
     24   UINT16                     HashSize;
     25 } INTERNAL_HASH_INFO;
     26 
     27 STATIC INTERNAL_HASH_INFO mHashInfo[] = {
     28   {TPM_ALG_SHA1,          SHA1_DIGEST_SIZE},
     29   {TPM_ALG_SHA256,        SHA256_DIGEST_SIZE},
     30   {TPM_ALG_SM3_256,       SM3_256_DIGEST_SIZE},
     31   {TPM_ALG_SHA384,        SHA384_DIGEST_SIZE},
     32   {TPM_ALG_SHA512,        SHA512_DIGEST_SIZE},
     33 };
     34 
     35 /**
     36   Return size of digest.
     37 
     38   @param[in] HashAlgo  Hash algorithm
     39 
     40   @return size of digest
     41 **/
     42 UINT16
     43 EFIAPI
     44 GetHashSizeFromAlgo (
     45   IN TPMI_ALG_HASH    HashAlgo
     46   )
     47 {
     48   UINTN  Index;
     49 
     50   for (Index = 0; Index < sizeof(mHashInfo)/sizeof(mHashInfo[0]); Index++) {
     51     if (mHashInfo[Index].HashAlgo == HashAlgo) {
     52       return mHashInfo[Index].HashSize;
     53     }
     54   }
     55   return 0;
     56 }
     57 
     58 /**
     59   Copy AuthSessionIn to TPM2 command buffer.
     60 
     61   @param [in]  AuthSessionIn   Input AuthSession data
     62   @param [out] AuthSessionOut  Output AuthSession data in TPM2 command buffer
     63 
     64   @return AuthSession size
     65 **/
     66 UINT32
     67 EFIAPI
     68 CopyAuthSessionCommand (
     69   IN      TPMS_AUTH_COMMAND         *AuthSessionIn, OPTIONAL
     70   OUT     UINT8                     *AuthSessionOut
     71   )
     72 {
     73   UINT8  *Buffer;
     74 
     75   Buffer = (UINT8 *)AuthSessionOut;
     76 
     77   //
     78   // Add in Auth session
     79   //
     80   if (AuthSessionIn != NULL) {
     81     //  sessionHandle
     82     WriteUnaligned32 ((UINT32 *)Buffer, SwapBytes32(AuthSessionIn->sessionHandle));
     83     Buffer += sizeof(UINT32);
     84 
     85     // nonce
     86     WriteUnaligned16 ((UINT16 *)Buffer, SwapBytes16 (AuthSessionIn->nonce.size));
     87     Buffer += sizeof(UINT16);
     88 
     89     CopyMem (Buffer, AuthSessionIn->nonce.buffer, AuthSessionIn->nonce.size);
     90     Buffer += AuthSessionIn->nonce.size;
     91 
     92     // sessionAttributes
     93     *(UINT8 *)Buffer = *(UINT8 *)&AuthSessionIn->sessionAttributes;
     94     Buffer++;
     95 
     96     // hmac
     97     WriteUnaligned16 ((UINT16 *)Buffer, SwapBytes16 (AuthSessionIn->hmac.size));
     98     Buffer += sizeof(UINT16);
     99 
    100     CopyMem (Buffer, AuthSessionIn->hmac.buffer, AuthSessionIn->hmac.size);
    101     Buffer += AuthSessionIn->hmac.size;
    102   } else {
    103     //  sessionHandle
    104     WriteUnaligned32 ((UINT32 *)Buffer, SwapBytes32(TPM_RS_PW));
    105     Buffer += sizeof(UINT32);
    106 
    107     // nonce = nullNonce
    108     WriteUnaligned16 ((UINT16 *)Buffer, SwapBytes16(0));
    109     Buffer += sizeof(UINT16);
    110 
    111     // sessionAttributes = 0
    112     *(UINT8 *)Buffer = 0x00;
    113     Buffer++;
    114 
    115     // hmac = nullAuth
    116     WriteUnaligned16 ((UINT16 *)Buffer, SwapBytes16(0));
    117     Buffer += sizeof(UINT16);
    118   }
    119 
    120   return (UINT32)(UINTN)(Buffer - (UINT8 *)AuthSessionOut);
    121 }
    122 
    123 /**
    124   Copy AuthSessionIn from TPM2 response buffer.
    125 
    126   @param [in]  AuthSessionIn   Input AuthSession data in TPM2 response buffer
    127   @param [out] AuthSessionOut  Output AuthSession data
    128 
    129   @return AuthSession size
    130 **/
    131 UINT32
    132 EFIAPI
    133 CopyAuthSessionResponse (
    134   IN      UINT8                      *AuthSessionIn,
    135   OUT     TPMS_AUTH_RESPONSE         *AuthSessionOut OPTIONAL
    136   )
    137 {
    138   UINT8                      *Buffer;
    139   TPMS_AUTH_RESPONSE         LocalAuthSessionOut;
    140 
    141   if (AuthSessionOut == NULL) {
    142     AuthSessionOut = &LocalAuthSessionOut;
    143   }
    144 
    145   Buffer = (UINT8 *)AuthSessionIn;
    146 
    147   // nonce
    148   AuthSessionOut->nonce.size = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));
    149   Buffer += sizeof(UINT16);
    150 
    151   CopyMem (AuthSessionOut->nonce.buffer, Buffer, AuthSessionOut->nonce.size);
    152   Buffer += AuthSessionOut->nonce.size;
    153 
    154   // sessionAttributes
    155   *(UINT8 *)&AuthSessionOut->sessionAttributes = *(UINT8 *)Buffer;
    156   Buffer++;
    157 
    158   // hmac
    159   AuthSessionOut->hmac.size = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));
    160   Buffer += sizeof(UINT16);
    161 
    162   CopyMem (AuthSessionOut->hmac.buffer, Buffer, AuthSessionOut->hmac.size);
    163   Buffer += AuthSessionOut->hmac.size;
    164 
    165   return (UINT32)(UINTN)(Buffer - (UINT8 *)AuthSessionIn);
    166 }
    167