/* SPDX-License-Identifier: BSD-3-Clause */ /* Copyright(c) 2007-2025 Intel Corporation */ /** ***************************************************************************** * @file lac_sym_qat_hash.h * * @defgroup LacSymQatHash Hash QAT * * @ingroup LacSymQat * * interfaces for populating qat structures for a hash operation * *****************************************************************************/ /*****************************************************************************/ #ifndef LAC_SYM_QAT_HASH_H #define LAC_SYM_QAT_HASH_H /* ****************************************************************************** * Include public/global header files ****************************************************************************** */ #include "cpa.h" #include "cpa_cy_sym.h" #include "icp_qat_fw_la.h" #include "icp_qat_hw.h" /* ******************************************************************************* * Include private header files ******************************************************************************* */ #include "lac_common.h" /** ****************************************************************************** * @ingroup LacSymQatHash * hash precomputes * * @description * This structure contains information on the hash precomputes * *****************************************************************************/ typedef struct lac_sym_qat_hash_precompute_info_s { Cpa8U *pState1; /**< state1 pointer */ Cpa32U state1Size; /**< state1 size */ Cpa8U *pState2; /**< state2 pointer */ Cpa32U state2Size; /**< state2 size */ } lac_sym_qat_hash_precompute_info_t; /** ****************************************************************************** * @ingroup LacSymQatHash * hash state prefix buffer info * * @description * This structure contains information on the hash state prefix aad buffer * *****************************************************************************/ typedef struct lac_sym_qat_hash_state_buffer_info_s { Cpa64U pDataPhys; /**< Physical pointer to the hash state prefix buffer */ Cpa8U *pData; /**< Virtual pointer to the hash state prefix buffer */ Cpa8U stateStorageSzQuadWords; /**< hash state storage size in quad words */ Cpa8U prefixAadSzQuadWords; /**< inner prefix/aad and outer prefix size in quad words */ } lac_sym_qat_hash_state_buffer_info_t; /** ****************************************************************************** * @ingroup LacSymQatHash * Init the hash specific part of the content descriptor. * * @description * This function populates the hash specific fields of the control block * and the hardware setup block for a digest session. This function sets * the size param to hold the size of the hash setup block. * * In the case of hash only, the content descriptor will contain just a * hash control block and hash setup block. In the case of chaining it * will contain the hash control block and setup block along with the * control block and setup blocks of additional services. * * Note: The memory for the content descriptor MUST be allocated prior to * calling this function. The memory for the hash control block and hash * setup block MUST be set to 0 prior to calling this function. * * @image html contentDescriptor.png "Content Descriptor" * * @param[in] pMsg Pointer to req Parameter Footer * * @param[in] pHashSetupData Pointer to the hash setup data as * defined in the LAC API. * * @param[in] pHwBlockBase Pointer to the base of the hardware * setup block * * @param[in] hashBlkOffsetInHwBlock Offset in quad-words from the base of * the hardware setup block where the * hash block will start. This offset * is stored in the control block. It * is used to figure out where to write * that hash setup block. * * @param[in] nextSlice SliceID for next control block * entry This value is known only by * the calling component * * @param[in] qatHashMode QAT hash mode * * @param[in] useSymConstantsTable Indicate if Shared-SRAM constants table * is used for this session. If TRUE, the * h/w setup block is NOT populated * * @param[in] useOptimisedContentDesc Indicate if optimised content desc * is used for this session. * * @param[in] useStatefulSha3ContentDesc * Indicate if stateful SHA3 content desc * is used for this session. * * @param[in] pPrecompute For auth mode, this is the pointer * to the precompute data. Otherwise this * should be set to NULL * * @param[out] pHashBlkSizeInBytes size in bytes of hash setup block * * @return void * *****************************************************************************/ void LacSymQat_HashContentDescInit(icp_qat_la_bulk_req_ftr_t *pMsg, CpaInstanceHandle instanceHandle, const CpaCySymHashSetupData *pHashSetupData, void *pHwBlockBase, Cpa32U hashBlkOffsetInHwBlock, icp_qat_fw_slice_t nextSlice, icp_qat_hw_auth_mode_t qatHashMode, CpaBoolean useSymConstantsTable, CpaBoolean useOptimisedContentDesc, CpaBoolean useStatefulSha3ContentDesc, lac_sym_qat_hash_precompute_info_t *pPrecompute, Cpa32U *pHashBlkSizeInBytes); /** ****************************************************************************** * @ingroup LacSymQatHash * Calculate the size of the hash state prefix aad buffer * * @description * This function inspects the hash control block and based on the values * in the fields, it calculates the size of the hash state prefix aad * buffer. * * A partial packet processing request is possible at any stage during a * hash session. In this case, there will always be space for the hash * state storage field of the hash state prefix buffer. When there is * AAD data just the inner prefix AAD data field is used. * * @param[in] pMsg Pointer to the Request Message * * @param[out] pHashStateBuf Pointer to hash state prefix buffer info * structure. * * @return None * *****************************************************************************/ void LacSymQat_HashStatePrefixAadBufferSizeGet( icp_qat_la_bulk_req_ftr_t *pMsg, lac_sym_qat_hash_state_buffer_info_t *pHashStateBuf); /** ****************************************************************************** * @ingroup LacSymQatHash * Populate the fields of the hash state prefix buffer * * @description * This function populates the inner prefix/aad fields and/or the outer * prefix field of the hash state prefix buffer. * * @param[in] pHashStateBuf Pointer to hash state prefix buffer info * structure. * * @param[in] pMsg Pointer to the Request Message * * @param[in] pInnerPrefixAad Pointer to the Inner Prefix or Aad data * This is NULL where if the data size is 0 * * @param[in] innerPrefixSize Size of inner prefix/aad data in bytes * * @param[in] pOuterPrefix Pointer to the Outer Prefix data. This is * NULL where the data size is 0. * * @param[in] outerPrefixSize Size of the outer prefix data in bytes * * @return void * *****************************************************************************/ void LacSymQat_HashStatePrefixAadBufferPopulate( lac_sym_qat_hash_state_buffer_info_t *pHashStateBuf, icp_qat_la_bulk_req_ftr_t *pMsg, Cpa8U *pInnerPrefixAad, Cpa8U innerPrefixSize, Cpa8U *pOuterPrefix, Cpa8U outerPrefixSize); /** ****************************************************************************** * @ingroup LacSymQatHash * Populate the hash request params structure * * @description * This function is passed a pointer to the 128B Request block. * (This memory must be allocated prior to calling this function). It * populates the fields of this block using the parameters as described * below. It is also expected that this structure has been set to 0 * prior to calling this function. * * * @param[in] pReq Pointer to 128B request block. * * @param[in] authOffsetInBytes start offset of data that the digest is to * be computed on. * * @param[in] authLenInBytes Length of data digest calculated on * * @param[in] pService Pointer to service data * * @param[in] pHashStateBuf Pointer to hash state buffer info. This * structure contains the pointers and sizes. * If there is no hash state prefix buffer * required, this parameter can be set to NULL * * @param[in] qatPacketType Packet type using QAT macros. The hash * state buffer pointer and state size will be * different depending on the packet type * * @param[in] hashResultSize Size of the final hash result in bytes. * * @param[in] digestVerify Indicates if verify is enabled or not * * @param[in] pAuthResult Virtual pointer to digest * * @return CPA_STATUS_SUCCESS or CPA_STATUS_FAIL * *****************************************************************************/ CpaStatus LacSymQat_HashRequestParamsPopulate( icp_qat_fw_la_bulk_req_t *pReq, Cpa32U authOffsetInBytes, Cpa32U authLenInBytes, sal_service_t *pService, lac_sym_qat_hash_state_buffer_info_t *pHashStateBuf, Cpa32U qatPacketType, Cpa32U hashResultSize, CpaBoolean digestVerify, Cpa8U *pAuthResult, CpaCySymHashAlgorithm alg, void *data); /** ****************************************************************************** * @ingroup LacSymQatHash * * * @description * This fn returns the QAT values for hash algorithm and nested fields * * * @param[in] pInstance Pointer to service instance. * * @param[in] qatHashMode value for hash mode on the fw qat *interface. * * @param[in] apiHashMode value for hash mode on the QA API. * * @param[in] apiHashAlgorithm value for hash algorithm on the QA API. * * @param[out] pQatAlgorithm Pointer to return fw qat value for *algorithm. * * @param[out] pQatNested Pointer to return fw qat value for nested. * * * @return * none * *****************************************************************************/ void LacSymQat_HashGetCfgData(CpaInstanceHandle pInstance, icp_qat_hw_auth_mode_t qatHashMode, CpaCySymHashMode apiHashMode, CpaCySymHashAlgorithm apiHashAlgorithm, icp_qat_hw_auth_algo_t *pQatAlgorithm, CpaBoolean *pQatNested); void LacSymQat_HashSetupReqParamsMetaData( icp_qat_la_bulk_req_ftr_t *pMsg, CpaInstanceHandle instanceHandle, const CpaCySymHashSetupData *pHashSetupData, CpaBoolean hashStateBuffer, icp_qat_hw_auth_mode_t qatHashMode, CpaBoolean digestVerify); #endif /* LAC_SYM_QAT_HASH_H */