/** @file
  This is BaseCrypto router support function.

Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <PiPei.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/Tpm2CommandLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/HashLib.h>
#include <Protocol/Tcg2Protocol.h>

typedef struct {
  EFI_GUID    Guid;
  UINT32      Mask;
} TPM2_HASH_MASK;

TPM2_HASH_MASK  mTpm2HashMask[] = {
  { 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  },
  { HASH_ALGORITHM_SM3_256_GUID, HASH_ALG_SM3_256 },
};

/**
  The function get hash mask info from GUID.

  @param HashGuid Hash Guid

  @return HashMask
**/
UINT32
EFIAPI
Tpm2GetHashMaskFromGuid (
  IN EFI_GUID  *HashGuid
  )
{
  UINTN  Index;

  for (Index = 0; Index < sizeof (mTpm2HashMask)/sizeof (mTpm2HashMask[0]); Index++) {
    if (CompareGuid (HashGuid, &mTpm2HashMask[Index].Guid)) {
      return mTpm2HashMask[Index].Mask;
    }
  }

  return 0;
}

/**
  The function set digest to digest list.

  @param DigestList digest list
  @param Digest     digest data
**/
VOID
EFIAPI
Tpm2SetHashToDigestList (
  IN OUT TPML_DIGEST_VALUES  *DigestList,
  IN TPML_DIGEST_VALUES      *Digest
  )
{
  CopyMem (
    &DigestList->digests[DigestList->count],
    &Digest->digests[0],
    sizeof (Digest->digests[0])
    );
  DigestList->count++;
}
