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