178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
378ee8d1cSJulian Grajkowski 
478ee8d1cSJulian Grajkowski /**
578ee8d1cSJulian Grajkowski  *****************************************************************************
678ee8d1cSJulian Grajkowski  * @file lac_sym_qat_hash.h
778ee8d1cSJulian Grajkowski  *
878ee8d1cSJulian Grajkowski  * @defgroup LacSymQatHash  Hash QAT
978ee8d1cSJulian Grajkowski  *
1078ee8d1cSJulian Grajkowski  * @ingroup LacSymQat
1178ee8d1cSJulian Grajkowski  *
1278ee8d1cSJulian Grajkowski  * interfaces for populating qat structures for a hash operation
1378ee8d1cSJulian Grajkowski  *
1478ee8d1cSJulian Grajkowski  *****************************************************************************/
1578ee8d1cSJulian Grajkowski 
1678ee8d1cSJulian Grajkowski /*****************************************************************************/
1778ee8d1cSJulian Grajkowski 
1878ee8d1cSJulian Grajkowski #ifndef LAC_SYM_QAT_HASH_H
1978ee8d1cSJulian Grajkowski #define LAC_SYM_QAT_HASH_H
2078ee8d1cSJulian Grajkowski 
2178ee8d1cSJulian Grajkowski /*
2278ee8d1cSJulian Grajkowski ******************************************************************************
2378ee8d1cSJulian Grajkowski * Include public/global header files
2478ee8d1cSJulian Grajkowski ******************************************************************************
2578ee8d1cSJulian Grajkowski */
2678ee8d1cSJulian Grajkowski 
2778ee8d1cSJulian Grajkowski #include "cpa.h"
2878ee8d1cSJulian Grajkowski #include "cpa_cy_sym.h"
2978ee8d1cSJulian Grajkowski #include "icp_qat_fw_la.h"
3078ee8d1cSJulian Grajkowski #include "icp_qat_hw.h"
3178ee8d1cSJulian Grajkowski 
3278ee8d1cSJulian Grajkowski /*
3378ee8d1cSJulian Grajkowski *******************************************************************************
3478ee8d1cSJulian Grajkowski * Include private header files
3578ee8d1cSJulian Grajkowski *******************************************************************************
3678ee8d1cSJulian Grajkowski */
3778ee8d1cSJulian Grajkowski #include "lac_common.h"
3878ee8d1cSJulian Grajkowski 
3978ee8d1cSJulian Grajkowski /**
4078ee8d1cSJulian Grajkowski  ******************************************************************************
4178ee8d1cSJulian Grajkowski  * @ingroup LacSymQatHash
4278ee8d1cSJulian Grajkowski  *      hash precomputes
4378ee8d1cSJulian Grajkowski  *
4478ee8d1cSJulian Grajkowski  * @description
4578ee8d1cSJulian Grajkowski  *      This structure contains infomation on the hash precomputes
4678ee8d1cSJulian Grajkowski  *
4778ee8d1cSJulian Grajkowski  *****************************************************************************/
4878ee8d1cSJulian Grajkowski typedef struct lac_sym_qat_hash_precompute_info_s {
4978ee8d1cSJulian Grajkowski 	Cpa8U *pState1;
5078ee8d1cSJulian Grajkowski 	/**< state1 pointer */
5178ee8d1cSJulian Grajkowski 	Cpa32U state1Size;
5278ee8d1cSJulian Grajkowski 	/**< state1 size */
5378ee8d1cSJulian Grajkowski 	Cpa8U *pState2;
5478ee8d1cSJulian Grajkowski 	/**< state2 pointer */
5578ee8d1cSJulian Grajkowski 	Cpa32U state2Size;
5678ee8d1cSJulian Grajkowski 	/**< state2 size */
5778ee8d1cSJulian Grajkowski } lac_sym_qat_hash_precompute_info_t;
5878ee8d1cSJulian Grajkowski 
5978ee8d1cSJulian Grajkowski /**
6078ee8d1cSJulian Grajkowski  ******************************************************************************
6178ee8d1cSJulian Grajkowski  * @ingroup LacSymQatHash
6278ee8d1cSJulian Grajkowski  *      hash state prefix buffer info
6378ee8d1cSJulian Grajkowski  *
6478ee8d1cSJulian Grajkowski  * @description
6578ee8d1cSJulian Grajkowski  *      This structure contains infomation on the hash state prefix aad buffer
6678ee8d1cSJulian Grajkowski  *
6778ee8d1cSJulian Grajkowski  *****************************************************************************/
6878ee8d1cSJulian Grajkowski typedef struct lac_sym_qat_hash_state_buffer_info_s {
6978ee8d1cSJulian Grajkowski 	Cpa64U pDataPhys;
7078ee8d1cSJulian Grajkowski 	/**< Physical pointer to the hash state prefix buffer */
7178ee8d1cSJulian Grajkowski 	Cpa8U *pData;
7278ee8d1cSJulian Grajkowski 	/**< Virtual pointer to the hash state prefix buffer */
7378ee8d1cSJulian Grajkowski 	Cpa8U stateStorageSzQuadWords;
7478ee8d1cSJulian Grajkowski 	/**< hash state storage size in quad words */
7578ee8d1cSJulian Grajkowski 	Cpa8U prefixAadSzQuadWords;
7678ee8d1cSJulian Grajkowski 	/**< inner prefix/aad and outer prefix size in quad words */
7778ee8d1cSJulian Grajkowski } lac_sym_qat_hash_state_buffer_info_t;
7878ee8d1cSJulian Grajkowski 
7978ee8d1cSJulian Grajkowski /**
8078ee8d1cSJulian Grajkowski  ******************************************************************************
8178ee8d1cSJulian Grajkowski  * @ingroup LacSymQatHash
8278ee8d1cSJulian Grajkowski  *      Init the hash specific part of the content descriptor.
8378ee8d1cSJulian Grajkowski  *
8478ee8d1cSJulian Grajkowski  * @description
8578ee8d1cSJulian Grajkowski  *      This function populates the hash specific fields of the control block
8678ee8d1cSJulian Grajkowski  *      and the hardware setup block for a digest session. This function sets
8778ee8d1cSJulian Grajkowski  *      the size param to hold the size of the hash setup block.
8878ee8d1cSJulian Grajkowski  *
8978ee8d1cSJulian Grajkowski  *      In the case of hash only, the content descriptor will contain just a
9078ee8d1cSJulian Grajkowski  *      hash control block and hash setup block. In the case of chaining it
9178ee8d1cSJulian Grajkowski  *      will contain the hash control block and setup block along with the
9278ee8d1cSJulian Grajkowski  *      control block and setup blocks of additional services.
9378ee8d1cSJulian Grajkowski  *
9478ee8d1cSJulian Grajkowski  *      Note: The memory for the content descriptor MUST be allocated prior to
9578ee8d1cSJulian Grajkowski  *      calling this function. The memory for the hash control block and hash
9678ee8d1cSJulian Grajkowski  *      setup block MUST be set to 0 prior to calling this function.
9778ee8d1cSJulian Grajkowski  *
9878ee8d1cSJulian Grajkowski  * @image html contentDescriptor.png "Content Descriptor"
9978ee8d1cSJulian Grajkowski  *
10078ee8d1cSJulian Grajkowski  * @param[in] pMsg                      Pointer to req Parameter Footer
10178ee8d1cSJulian Grajkowski  *
10278ee8d1cSJulian Grajkowski  * @param[in] pHashSetupData            Pointer to the hash setup data as
10378ee8d1cSJulian Grajkowski  *                                      defined in the LAC API.
10478ee8d1cSJulian Grajkowski  *
10578ee8d1cSJulian Grajkowski  * @param[in] pHwBlockBase              Pointer to the base of the hardware
10678ee8d1cSJulian Grajkowski  *                                      setup block
10778ee8d1cSJulian Grajkowski  *
10878ee8d1cSJulian Grajkowski  * @param[in] hashBlkOffsetInHwBlock    Offset in quad-words from the base of
10978ee8d1cSJulian Grajkowski  *                                      the hardware setup block where the
11078ee8d1cSJulian Grajkowski  *                                      hash block will start. This offset
11178ee8d1cSJulian Grajkowski  *                                      is stored in the control block. It
11278ee8d1cSJulian Grajkowski  *                                      is used to figure out where to write
11378ee8d1cSJulian Grajkowski  *                                      that hash setup block.
11478ee8d1cSJulian Grajkowski  *
11578ee8d1cSJulian Grajkowski  * @param[in] nextSlice                 SliceID for next control block
11678ee8d1cSJulian Grajkowski  *                                      entry This value is known only by
11778ee8d1cSJulian Grajkowski  *                                      the calling component
11878ee8d1cSJulian Grajkowski  *
11978ee8d1cSJulian Grajkowski  * @param[in] qatHashMode               QAT hash mode
12078ee8d1cSJulian Grajkowski  *
12178ee8d1cSJulian Grajkowski  * @param[in] useSymConstantsTable      Indicate if Shared-SRAM constants table
12278ee8d1cSJulian Grajkowski  *                                      is used for this session. If TRUE, the
12378ee8d1cSJulian Grajkowski  *                                      h/w setup block is NOT populated
12478ee8d1cSJulian Grajkowski  *
12578ee8d1cSJulian Grajkowski  * @param[in] useOptimisedContentDesc   Indicate if optimised content desc
12678ee8d1cSJulian Grajkowski  *                                      is used for this session.
12778ee8d1cSJulian Grajkowski  *
128a977168cSMichal Gulbicki  * @param[in] useStatefulSha3ContentDesc
129a977168cSMichal Gulbicki  *                                      Indicate if stateful SHA3 content desc
130a977168cSMichal Gulbicki  *                                      is used for this session.
131a977168cSMichal Gulbicki  *
13278ee8d1cSJulian Grajkowski  * @param[in] pPrecompute               For auth mode, this is the pointer
13378ee8d1cSJulian Grajkowski  *                                      to the precompute data. Otherwise this
13478ee8d1cSJulian Grajkowski  *                                      should be set to NULL
13578ee8d1cSJulian Grajkowski  *
13678ee8d1cSJulian Grajkowski  * @param[out] pHashBlkSizeInBytes      size in bytes of hash setup block
13778ee8d1cSJulian Grajkowski  *
13878ee8d1cSJulian Grajkowski  * @return void
13978ee8d1cSJulian Grajkowski  *
14078ee8d1cSJulian Grajkowski  *****************************************************************************/
14178ee8d1cSJulian Grajkowski void
14278ee8d1cSJulian Grajkowski LacSymQat_HashContentDescInit(icp_qat_la_bulk_req_ftr_t *pMsg,
14378ee8d1cSJulian Grajkowski 			      CpaInstanceHandle instanceHandle,
14478ee8d1cSJulian Grajkowski 			      const CpaCySymHashSetupData *pHashSetupData,
14578ee8d1cSJulian Grajkowski 			      void *pHwBlockBase,
14678ee8d1cSJulian Grajkowski 			      Cpa32U hashBlkOffsetInHwBlock,
14778ee8d1cSJulian Grajkowski 			      icp_qat_fw_slice_t nextSlice,
14878ee8d1cSJulian Grajkowski 			      icp_qat_hw_auth_mode_t qatHashMode,
14978ee8d1cSJulian Grajkowski 			      CpaBoolean useSymConstantsTable,
15078ee8d1cSJulian Grajkowski 			      CpaBoolean useOptimisedContentDesc,
151a977168cSMichal Gulbicki 			      CpaBoolean useStatefulSha3ContentDesc,
15278ee8d1cSJulian Grajkowski 			      lac_sym_qat_hash_precompute_info_t *pPrecompute,
15378ee8d1cSJulian Grajkowski 			      Cpa32U *pHashBlkSizeInBytes);
15478ee8d1cSJulian Grajkowski 
15578ee8d1cSJulian Grajkowski /**
15678ee8d1cSJulian Grajkowski  ******************************************************************************
15778ee8d1cSJulian Grajkowski  * @ingroup LacSymQatHash
15878ee8d1cSJulian Grajkowski  *      Calculate the size of the hash state prefix aad buffer
15978ee8d1cSJulian Grajkowski  *
16078ee8d1cSJulian Grajkowski  * @description
16178ee8d1cSJulian Grajkowski  *      This function inspects the hash control block and based on the values
16278ee8d1cSJulian Grajkowski  *      in the fields, it calculates the size of the hash state prefix aad
16378ee8d1cSJulian Grajkowski  *      buffer.
16478ee8d1cSJulian Grajkowski  *
16578ee8d1cSJulian Grajkowski  *      A partial packet processing request is possible at any stage during a
16678ee8d1cSJulian Grajkowski  *      hash session. In this case, there will always be space for the hash
16778ee8d1cSJulian Grajkowski  *      state storage field of the hash state prefix buffer. When there is
16878ee8d1cSJulian Grajkowski  *      AAD data just the inner prefix AAD data field is used.
16978ee8d1cSJulian Grajkowski  *
17078ee8d1cSJulian Grajkowski  * @param[in]  pMsg                 Pointer to the Request Message
17178ee8d1cSJulian Grajkowski  *
17278ee8d1cSJulian Grajkowski  * @param[out] pHashStateBuf        Pointer to hash state prefix buffer info
17378ee8d1cSJulian Grajkowski  *                                  structure.
17478ee8d1cSJulian Grajkowski  *
17578ee8d1cSJulian Grajkowski  * @return None
17678ee8d1cSJulian Grajkowski  *
17778ee8d1cSJulian Grajkowski  *****************************************************************************/
17878ee8d1cSJulian Grajkowski void LacSymQat_HashStatePrefixAadBufferSizeGet(
17978ee8d1cSJulian Grajkowski     icp_qat_la_bulk_req_ftr_t *pMsg,
18078ee8d1cSJulian Grajkowski     lac_sym_qat_hash_state_buffer_info_t *pHashStateBuf);
18178ee8d1cSJulian Grajkowski 
18278ee8d1cSJulian Grajkowski /**
18378ee8d1cSJulian Grajkowski  ******************************************************************************
18478ee8d1cSJulian Grajkowski  * @ingroup LacSymQatHash
18578ee8d1cSJulian Grajkowski  *      Populate the fields of the hash state prefix buffer
18678ee8d1cSJulian Grajkowski  *
18778ee8d1cSJulian Grajkowski  * @description
18878ee8d1cSJulian Grajkowski  *      This function populates the inner prefix/aad fields and/or the outer
18978ee8d1cSJulian Grajkowski  *      prefix field of the hash state prefix buffer.
19078ee8d1cSJulian Grajkowski  *
19178ee8d1cSJulian Grajkowski  * @param[in] pHashStateBuf         Pointer to hash state prefix buffer info
19278ee8d1cSJulian Grajkowski  *                                  structure.
19378ee8d1cSJulian Grajkowski  *
19478ee8d1cSJulian Grajkowski  * @param[in] pMsg                  Pointer to the Request Message
19578ee8d1cSJulian Grajkowski  *
19678ee8d1cSJulian Grajkowski  * @param[in] pInnerPrefixAad       Pointer to the Inner Prefix or Aad data
19778ee8d1cSJulian Grajkowski  *                                  This is NULL where if the data size is 0
19878ee8d1cSJulian Grajkowski  *
19978ee8d1cSJulian Grajkowski  * @param[in] innerPrefixSize       Size of inner prefix/aad data in bytes
20078ee8d1cSJulian Grajkowski  *
20178ee8d1cSJulian Grajkowski  * @param[in] pOuterPrefix          Pointer to the Outer Prefix data. This is
20278ee8d1cSJulian Grajkowski  *                                  NULL where the data size is 0.
20378ee8d1cSJulian Grajkowski  *
20478ee8d1cSJulian Grajkowski  * @param[in] outerPrefixSize       Size of the outer prefix data in bytes
20578ee8d1cSJulian Grajkowski  *
20678ee8d1cSJulian Grajkowski  * @return void
20778ee8d1cSJulian Grajkowski  *
20878ee8d1cSJulian Grajkowski  *****************************************************************************/
20978ee8d1cSJulian Grajkowski void LacSymQat_HashStatePrefixAadBufferPopulate(
21078ee8d1cSJulian Grajkowski     lac_sym_qat_hash_state_buffer_info_t *pHashStateBuf,
21178ee8d1cSJulian Grajkowski     icp_qat_la_bulk_req_ftr_t *pMsg,
21278ee8d1cSJulian Grajkowski     Cpa8U *pInnerPrefixAad,
21378ee8d1cSJulian Grajkowski     Cpa8U innerPrefixSize,
21478ee8d1cSJulian Grajkowski     Cpa8U *pOuterPrefix,
21578ee8d1cSJulian Grajkowski     Cpa8U outerPrefixSize);
21678ee8d1cSJulian Grajkowski 
21778ee8d1cSJulian Grajkowski /**
21878ee8d1cSJulian Grajkowski  ******************************************************************************
21978ee8d1cSJulian Grajkowski  * @ingroup LacSymQatHash
22078ee8d1cSJulian Grajkowski  *      Populate the hash request params structure
22178ee8d1cSJulian Grajkowski  *
22278ee8d1cSJulian Grajkowski  * @description
22378ee8d1cSJulian Grajkowski  *      This function is passed a pointer to the 128B Request block.
22478ee8d1cSJulian Grajkowski  *      (This memory must be allocated prior to calling this function). It
22578ee8d1cSJulian Grajkowski  *      populates the fields of this block using the parameters as described
22678ee8d1cSJulian Grajkowski  *      below. It is also expected that this structure has been set to 0
22778ee8d1cSJulian Grajkowski  *      prior to calling this function.
22878ee8d1cSJulian Grajkowski  *
22978ee8d1cSJulian Grajkowski  *
23078ee8d1cSJulian Grajkowski  * @param[in] pReq                  Pointer to 128B request block.
23178ee8d1cSJulian Grajkowski  *
23278ee8d1cSJulian Grajkowski  * @param[in] authOffsetInBytes     start offset of data that the digest is to
23378ee8d1cSJulian Grajkowski  *                                  be computed on.
23478ee8d1cSJulian Grajkowski  *
23578ee8d1cSJulian Grajkowski  * @param[in] authLenInBytes        Length of data digest calculated on
23678ee8d1cSJulian Grajkowski  *
23778ee8d1cSJulian Grajkowski  * @param[in] pService              Pointer to service data
23878ee8d1cSJulian Grajkowski  *
23978ee8d1cSJulian Grajkowski  * @param[in] pHashStateBuf         Pointer to hash state buffer info. This
24078ee8d1cSJulian Grajkowski  *                                  structure contains the pointers and sizes.
24178ee8d1cSJulian Grajkowski  *                                  If there is no hash state prefix buffer
24278ee8d1cSJulian Grajkowski  *                                  required, this parameter can be set to NULL
24378ee8d1cSJulian Grajkowski  *
24478ee8d1cSJulian Grajkowski  * @param[in] qatPacketType         Packet type using QAT macros. The hash
24578ee8d1cSJulian Grajkowski  *                                  state buffer pointer and state size will be
24678ee8d1cSJulian Grajkowski  *                                  different depending on the packet type
24778ee8d1cSJulian Grajkowski  *
24878ee8d1cSJulian Grajkowski  * @param[in] hashResultSize        Size of the final hash result in bytes.
24978ee8d1cSJulian Grajkowski  *
25078ee8d1cSJulian Grajkowski  * @param[in] digestVerify          Indicates if verify is enabled or not
25178ee8d1cSJulian Grajkowski  *
25278ee8d1cSJulian Grajkowski  * @param[in] pAuthResult           Virtual pointer to digest
25378ee8d1cSJulian Grajkowski  *
25478ee8d1cSJulian Grajkowski  * @return CPA_STATUS_SUCCESS or CPA_STATUS_FAIL
25578ee8d1cSJulian Grajkowski  *
25678ee8d1cSJulian Grajkowski  *****************************************************************************/
25778ee8d1cSJulian Grajkowski CpaStatus LacSymQat_HashRequestParamsPopulate(
25878ee8d1cSJulian Grajkowski     icp_qat_fw_la_bulk_req_t *pReq,
25978ee8d1cSJulian Grajkowski     Cpa32U authOffsetInBytes,
26078ee8d1cSJulian Grajkowski     Cpa32U authLenInBytes,
26178ee8d1cSJulian Grajkowski     sal_service_t *pService,
26278ee8d1cSJulian Grajkowski     lac_sym_qat_hash_state_buffer_info_t *pHashStateBuf,
26378ee8d1cSJulian Grajkowski     Cpa32U qatPacketType,
26478ee8d1cSJulian Grajkowski     Cpa32U hashResultSize,
26578ee8d1cSJulian Grajkowski     CpaBoolean digestVerify,
26678ee8d1cSJulian Grajkowski     Cpa8U *pAuthResult,
26778ee8d1cSJulian Grajkowski     CpaCySymHashAlgorithm alg,
26878ee8d1cSJulian Grajkowski     void *data);
26978ee8d1cSJulian Grajkowski 
27078ee8d1cSJulian Grajkowski /**
27178ee8d1cSJulian Grajkowski  ******************************************************************************
27278ee8d1cSJulian Grajkowski  * @ingroup LacSymQatHash
27378ee8d1cSJulian Grajkowski  *
27478ee8d1cSJulian Grajkowski  *
27578ee8d1cSJulian Grajkowski  * @description
27678ee8d1cSJulian Grajkowski  *      This fn returns the QAT values for hash algorithm and nested fields
27778ee8d1cSJulian Grajkowski  *
27878ee8d1cSJulian Grajkowski  *
27978ee8d1cSJulian Grajkowski  * @param[in] pInstance              Pointer to service instance.
28078ee8d1cSJulian Grajkowski  *
28178ee8d1cSJulian Grajkowski  * @param[in] qatHashMode            value for hash mode on the fw qat
28278ee8d1cSJulian Grajkowski  *interface.
28378ee8d1cSJulian Grajkowski  *
28478ee8d1cSJulian Grajkowski  * @param[in] apiHashMode            value for hash mode on the QA API.
28578ee8d1cSJulian Grajkowski  *
28678ee8d1cSJulian Grajkowski  * @param[in] apiHashAlgorithm       value for hash algorithm on the QA API.
28778ee8d1cSJulian Grajkowski  *
28878ee8d1cSJulian Grajkowski  * @param[out] pQatAlgorithm         Pointer to return fw qat value for
28978ee8d1cSJulian Grajkowski  *algorithm.
29078ee8d1cSJulian Grajkowski  *
29178ee8d1cSJulian Grajkowski  * @param[out] pQatNested            Pointer to return fw qat value for nested.
29278ee8d1cSJulian Grajkowski  *
29378ee8d1cSJulian Grajkowski  *
29478ee8d1cSJulian Grajkowski  * @return
29578ee8d1cSJulian Grajkowski  *      none
29678ee8d1cSJulian Grajkowski  *
29778ee8d1cSJulian Grajkowski  *****************************************************************************/
29878ee8d1cSJulian Grajkowski void LacSymQat_HashGetCfgData(CpaInstanceHandle pInstance,
29978ee8d1cSJulian Grajkowski 			      icp_qat_hw_auth_mode_t qatHashMode,
30078ee8d1cSJulian Grajkowski 			      CpaCySymHashMode apiHashMode,
30178ee8d1cSJulian Grajkowski 			      CpaCySymHashAlgorithm apiHashAlgorithm,
30278ee8d1cSJulian Grajkowski 			      icp_qat_hw_auth_algo_t *pQatAlgorithm,
30378ee8d1cSJulian Grajkowski 			      CpaBoolean *pQatNested);
30478ee8d1cSJulian Grajkowski 
30578ee8d1cSJulian Grajkowski void LacSymQat_HashSetupReqParamsMetaData(
30678ee8d1cSJulian Grajkowski     icp_qat_la_bulk_req_ftr_t *pMsg,
30778ee8d1cSJulian Grajkowski     CpaInstanceHandle instanceHandle,
30878ee8d1cSJulian Grajkowski     const CpaCySymHashSetupData *pHashSetupData,
30978ee8d1cSJulian Grajkowski     CpaBoolean hashStateBuffer,
31078ee8d1cSJulian Grajkowski     icp_qat_hw_auth_mode_t qatHashMode,
31178ee8d1cSJulian Grajkowski     CpaBoolean digestVerify);
31278ee8d1cSJulian Grajkowski 
31378ee8d1cSJulian Grajkowski #endif /* LAC_SYM_QAT_HASH_H */
314