text: /** @file
  
    Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
    SPDX-License-Identifier: BSD-2-Clause-Patent
  
  **/
  
  
  #include "owndefs.h"
  #include "owncp.h"
  #include "pcphash.h"
  #include "pcptool.h"
  #include "pcphash_rmf.h"
  
  #include <Library/CryptoLib.h>
  
  
  
  /**
    Computes the SHA-384 message digest of a input data buffer.
  
    This function performs the SHA-384 message digest of a given data buffer, and places
    the digest value into the specified memory.
  
    @param[in]   pMsg        Pointer to the buffer containing the data to be hashed.
    @param[in]   msgLen      Length of Data buffer in bytes.
    @param[out]  pMD         Pointer to a buffer that receives the SHA-384 digest
                             value (48 bytes).
  
    @retval                  A pointer to SHA-384 digest value
  **/
  Ipp8u* Sha384 (const Ipp8u* pMsg, Ipp32u msgLen, Ipp8u* pMD)
  {
    if (FixedPcdGet8(PcdIppHashLibSupportedMask) & IPP_HASHLIB_SHA2_384) {
      ippsHashMessage_rmf(pMsg, msgLen, pMD, ippsHashMethod_SHA384 ());
      return pMD;
  
    } else {
      pMD = NULL;
      return pMD;
    }
  }
  
  /**
    Initializes the hash context for SHA384 hashing.
  
    @param[in]   HashCtx       Pointer to the hash context buffer.
    @param[in]   HashCtxSize   Length of the hash context.
  
    @retval  RETURN_SUCCESS             Success.
    @retval  RETURN_BUFFER_TOO_SMALL    Hash context buffer size is not large enough.
    @retval  RETURN_SECURITY_VIOLATION  All other errors.
  **/
  RETURN_STATUS
  Sha384Init (
    IN      HASH_CTX   *HashCtx,
    IN      Ipp32u      HashCtxSize
    )
  {
    if (FixedPcdGet8(PcdIppHashLibSupportedMask) & IPP_HASHLIB_SHA2_384) {
      if (HashCtxSize < sizeof(IppsHashState_rmf)) {
        return RETURN_BUFFER_TOO_SMALL;
      }
  
      if (ippsHashInit_rmf((IppsHashState_rmf*)HashCtx, ippsHashMethod_SHA384 ()) == ippStsNoErr) {
        return RETURN_SUCCESS;
      }
  
      return RETURN_SECURITY_VIOLATION;
  
    } else {
      return RETURN_UNSUPPORTED;
    }
  }
  
  /**
    Consumes the data for SHA384 hashing.
    This method can be called multiple times to hash separate pieces of data.
  
    @param[in]   HashCtx     Pointer to the hash context buffer.
    @param[in]   Msg         Data to be hashed.
    @param[in]   MsgLen      Length of data to be hashed.
  
    @retval  RETURN_SUCCESS             Success.
    @retval  RETURN_SECURITY_VIOLATION  All other errors.
  **/
  RETURN_STATUS
  Sha384Update (
    IN        HASH_CTX   *HashCtx,
    IN CONST  Ipp8u      *Msg,
    IN        Ipp32u      MsgLen
    )
  {
    if (FixedPcdGet8(PcdIppHashLibSupportedMask) & IPP_HASHLIB_SHA2_384) {
      if (ippsHashUpdate_rmf(Msg, MsgLen, (IppsHashState_rmf*)HashCtx) == ippStsNoErr) {
        return RETURN_SUCCESS;
      }
  
      return RETURN_SECURITY_VIOLATION;
  
    } else {
        return RETURN_UNSUPPORTED;
    }
  }
  
  
  /**
    Finalizes the SHA384 hashing and returns the hash.
  
    @param[in]   HashCtx     Pointer to the hash context buffer.
    @param[out]  Hash        Sha384 hash of the data.
  
    @retval  RETURN_SUCCESS             Success.
    @retval  RETURN_SECURITY_VIOLATION  All other errors.
  **/
  RETURN_STATUS
  Sha384Final (
    IN       HASH_CTX   *HashCtx,
    OUT      Ipp8u      *Hash
    )
  {
    if (FixedPcdGet8(PcdIppHashLibSupportedMask) & IPP_HASHLIB_SHA2_384) {
      if (ippsHashFinal_rmf(Hash, (IppsHashState_rmf*)HashCtx) == ippStsNoErr) {
        return RETURN_SUCCESS;
      }
  
      return RETURN_SECURITY_VIOLATION;
  
    } else {
      return RETURN_UNSUPPORTED;
    }
  }
  