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_hash_precomputes.h
778ee8d1cSJulian Grajkowski  *
878ee8d1cSJulian Grajkowski  * @defgroup LacHashDefs Hash Definitions
978ee8d1cSJulian Grajkowski  *
1078ee8d1cSJulian Grajkowski  * @ingroup  LacHash
1178ee8d1cSJulian Grajkowski  *
1278ee8d1cSJulian Grajkowski  * Constants for hash algorithms
1378ee8d1cSJulian Grajkowski  *
1478ee8d1cSJulian Grajkowski  ***************************************************************************/
1578ee8d1cSJulian Grajkowski #ifndef LAC_SYM_HASH_PRECOMPUTES_H
1678ee8d1cSJulian Grajkowski #define LAC_SYM_HASH_PRECOMPUTES_H
1778ee8d1cSJulian Grajkowski 
1878ee8d1cSJulian Grajkowski #include "lac_sym_hash.h"
1978ee8d1cSJulian Grajkowski 
2078ee8d1cSJulian Grajkowski #define LAC_SYM_AES_CMAC_RB_128 0x87 /* constant used for   */
2178ee8d1cSJulian Grajkowski 				     /* CMAC calculation    */
2278ee8d1cSJulian Grajkowski 
2378ee8d1cSJulian Grajkowski #define LAC_SYM_HASH_MSBIT_MASK 0x80 /* Mask to check MSB top bit */
2478ee8d1cSJulian Grajkowski 				     /* zero or one */
2578ee8d1cSJulian Grajkowski 
2678ee8d1cSJulian Grajkowski #define LAC_SINGLE_BUFFER_HW_META_SIZE                                         \
2778ee8d1cSJulian Grajkowski 	(sizeof(icp_buffer_list_desc_t) + sizeof(icp_flat_buffer_desc_t))
2878ee8d1cSJulian Grajkowski /**< size of memory to allocate for the HW buffer list that is sent to the
2978ee8d1cSJulian Grajkowski  * QAT */
3078ee8d1cSJulian Grajkowski 
3178ee8d1cSJulian Grajkowski #define LAC_SYM_HASH_PRECOMP_MAX_WORKING_BUFFER                                \
3278ee8d1cSJulian Grajkowski 	((sizeof(lac_sym_hash_precomp_op_data_t) * 2) +                        \
3378ee8d1cSJulian Grajkowski 	 sizeof(lac_sym_hash_precomp_op_t))
3478ee8d1cSJulian Grajkowski /**< maximum size of the working data for the HMAC precompute operations
3578ee8d1cSJulian Grajkowski  *
3678ee8d1cSJulian Grajkowski  * Maximum size of lac_sym_hash_precomp_op_data_t is 264 bytes. For hash
3778ee8d1cSJulian Grajkowski  * precomputes there are 2 of these structrues and a further
3878ee8d1cSJulian Grajkowski  * lac_sym_hash_precomp_op_t structure required. This comes to a total of 536
3978ee8d1cSJulian Grajkowski  * bytes.
4078ee8d1cSJulian Grajkowski  * For the asynchronous version of the precomputes, the memory for the hash
4178ee8d1cSJulian Grajkowski  * state prefix buffer is used as the working memory. There are 584 bytes
4278ee8d1cSJulian Grajkowski  * which are alloacted for the hash state prefix buffer which is enough to
4378ee8d1cSJulian Grajkowski  * carve up for the precomputes.
4478ee8d1cSJulian Grajkowski  */
4578ee8d1cSJulian Grajkowski 
4678ee8d1cSJulian Grajkowski #define LAC_SYM_HASH_PRECOMP_MAX_AES_ECB_DATA                                  \
4778ee8d1cSJulian Grajkowski 	((ICP_QAT_HW_AES_128_KEY_SZ) * (3))
4878ee8d1cSJulian Grajkowski /**< Maximum size for the data that an AES ECB precompute is generated on */
4978ee8d1cSJulian Grajkowski 
5078ee8d1cSJulian Grajkowski /**
5178ee8d1cSJulian Grajkowski  *****************************************************************************
5278ee8d1cSJulian Grajkowski  * @ingroup LacHashDefs
5378ee8d1cSJulian Grajkowski  *      Precompute type enum
5478ee8d1cSJulian Grajkowski  * @description
5578ee8d1cSJulian Grajkowski  *      Enum used to distinguish between precompute types
5678ee8d1cSJulian Grajkowski  *
5778ee8d1cSJulian Grajkowski  *****************************************************************************/
5878ee8d1cSJulian Grajkowski typedef enum {
5978ee8d1cSJulian Grajkowski 	LAC_SYM_HASH_PRECOMP_HMAC = 1,
6078ee8d1cSJulian Grajkowski 	/**< Hmac precompute operation. Copy state from hash state buffer */
6178ee8d1cSJulian Grajkowski 	LAC_SYM_HASH_PRECOMP_AES_ECB,
6278ee8d1cSJulian Grajkowski 	/**< XCBC/CGM precompute, Copy state from data buffer */
6378ee8d1cSJulian Grajkowski } lac_sym_hash_precomp_type_t;
6478ee8d1cSJulian Grajkowski 
6578ee8d1cSJulian Grajkowski /**
6678ee8d1cSJulian Grajkowski  *****************************************************************************
6778ee8d1cSJulian Grajkowski  * @ingroup LacHashDefs
6878ee8d1cSJulian Grajkowski  *      overall precompute management structure
6978ee8d1cSJulian Grajkowski  * @description
7078ee8d1cSJulian Grajkowski  *      structure used to manage the precompute operations for a session
7178ee8d1cSJulian Grajkowski  *
7278ee8d1cSJulian Grajkowski  *****************************************************************************/
7378ee8d1cSJulian Grajkowski typedef struct lac_sym_hash_precomp_op_s {
7478ee8d1cSJulian Grajkowski 	lac_hash_precompute_done_cb_t callbackFn;
7578ee8d1cSJulian Grajkowski 	/**< Callback function to be invoked when the final precompute completes
7678ee8d1cSJulian Grajkowski 	 */
7778ee8d1cSJulian Grajkowski 
7878ee8d1cSJulian Grajkowski 	void *pCallbackTag;
7978ee8d1cSJulian Grajkowski 	/**< Opaque data to be passed back as a parameter in the callback */
8078ee8d1cSJulian Grajkowski 
8178ee8d1cSJulian Grajkowski 	QatUtilsAtomic opsPending;
8278ee8d1cSJulian Grajkowski 	/**< counter used to determine if the current precompute is the
8378ee8d1cSJulian Grajkowski 	 * final one. */
8478ee8d1cSJulian Grajkowski 
8578ee8d1cSJulian Grajkowski } lac_sym_hash_precomp_op_t;
8678ee8d1cSJulian Grajkowski 
8778ee8d1cSJulian Grajkowski /**
8878ee8d1cSJulian Grajkowski  *****************************************************************************
8978ee8d1cSJulian Grajkowski  * @ingroup LacHashDefs
9078ee8d1cSJulian Grajkowski  *      hmac precompute structure as used by the QAT
9178ee8d1cSJulian Grajkowski  * @description
9278ee8d1cSJulian Grajkowski  *      data used by the QAT for HMAC precomputes
9378ee8d1cSJulian Grajkowski  *
9478ee8d1cSJulian Grajkowski  *      Must be allocated on an 8-byte aligned memory address.
9578ee8d1cSJulian Grajkowski  *
9678ee8d1cSJulian Grajkowski  *****************************************************************************/
9778ee8d1cSJulian Grajkowski typedef struct lac_sym_hash_hmac_precomp_qat_s {
9878ee8d1cSJulian Grajkowski 	Cpa8U data[LAC_HASH_SHA512_BLOCK_SIZE];
9978ee8d1cSJulian Grajkowski 	/**< data to be hashed - block size of data for the algorithm */
10078ee8d1cSJulian Grajkowski 	/* NOTE: to save space we could have got the QAT to overwrite
10178ee8d1cSJulian Grajkowski 	 * this with the hash state storage */
10278ee8d1cSJulian Grajkowski 	icp_qat_fw_la_auth_req_params_t hashReqParams;
10378ee8d1cSJulian Grajkowski 	/**< Request parameters as read in by the QAT */
10478ee8d1cSJulian Grajkowski 	Cpa8U bufferDesc[LAC_SINGLE_BUFFER_HW_META_SIZE];
10578ee8d1cSJulian Grajkowski 	/**< Buffer descriptor structure */
10678ee8d1cSJulian Grajkowski 	Cpa8U hashStateStorage[LAC_MAX_HASH_STATE_STORAGE_SIZE];
10778ee8d1cSJulian Grajkowski 	/**< Internal buffer where QAT writes the intermediate partial
10878ee8d1cSJulian Grajkowski 	 * state that is used in the precompute */
10978ee8d1cSJulian Grajkowski } lac_sym_hash_hmac_precomp_qat_t;
11078ee8d1cSJulian Grajkowski 
11178ee8d1cSJulian Grajkowski /**
11278ee8d1cSJulian Grajkowski  *****************************************************************************
11378ee8d1cSJulian Grajkowski  * @ingroup LacHashDefs
11478ee8d1cSJulian Grajkowski  *      AES ECB precompute structure as used by the QAT
11578ee8d1cSJulian Grajkowski  * @description
11678ee8d1cSJulian Grajkowski  *      data used by the QAT for AES ECB precomptes
11778ee8d1cSJulian Grajkowski  *
11878ee8d1cSJulian Grajkowski  *      Must be allocated on an 8-byte aligned memory address.
11978ee8d1cSJulian Grajkowski  *
12078ee8d1cSJulian Grajkowski  *****************************************************************************/
12178ee8d1cSJulian Grajkowski typedef struct lac_sym_hash_aes_precomp_qat_s {
12278ee8d1cSJulian Grajkowski 	Cpa8U contentDesc[LAC_SYM_QAT_MAX_CIPHER_SETUP_BLK_SZ];
12378ee8d1cSJulian Grajkowski 	/**< Content descriptor for a cipher operation */
12478ee8d1cSJulian Grajkowski 	Cpa8U data[LAC_SYM_HASH_PRECOMP_MAX_AES_ECB_DATA];
12578ee8d1cSJulian Grajkowski 	/**< The data to be ciphered is conatined here and the result is
12678ee8d1cSJulian Grajkowski 	 * written in place back into this buffer */
12778ee8d1cSJulian Grajkowski 	icp_qat_fw_la_cipher_req_params_t cipherReqParams;
12878ee8d1cSJulian Grajkowski 	/**< Request parameters as read in by the QAT */
12978ee8d1cSJulian Grajkowski 	Cpa8U bufferDesc[LAC_SINGLE_BUFFER_HW_META_SIZE];
13078ee8d1cSJulian Grajkowski 	/**< Buffer descriptor structure */
13178ee8d1cSJulian Grajkowski } lac_sym_hash_aes_precomp_qat_t;
13278ee8d1cSJulian Grajkowski 
13378ee8d1cSJulian Grajkowski /**
13478ee8d1cSJulian Grajkowski  *****************************************************************************
13578ee8d1cSJulian Grajkowski  * @ingroup LacHashDefs
13678ee8d1cSJulian Grajkowski  *      overall structure for managing a single precompute operation
13778ee8d1cSJulian Grajkowski  * @description
13878ee8d1cSJulian Grajkowski  *      overall structure for managing a single precompute operation
13978ee8d1cSJulian Grajkowski  *
14078ee8d1cSJulian Grajkowski  *      Must be allocated on an 8-byte aligned memory address.
14178ee8d1cSJulian Grajkowski  *
14278ee8d1cSJulian Grajkowski  *****************************************************************************/
14378ee8d1cSJulian Grajkowski typedef struct lac_sym_hash_precomp_op_data_s {
14478ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pInstance;
14578ee8d1cSJulian Grajkowski 	/**< Instance handle for the operation */
14678ee8d1cSJulian Grajkowski 	Cpa8U reserved[4];
14778ee8d1cSJulian Grajkowski 	/**< padding to align later structures on minimum 8-Byte address */
14878ee8d1cSJulian Grajkowski 	lac_sym_hash_precomp_type_t opType;
14978ee8d1cSJulian Grajkowski 	/**< operation type to determine the precompute type in the callback */
15078ee8d1cSJulian Grajkowski 	lac_sym_hash_precomp_op_t *pOpStatus;
15178ee8d1cSJulian Grajkowski 	/**< structure containing the counter and the condition for the overall
15278ee8d1cSJulian Grajkowski 	 * precompute operation. This is a pointer because the memory structure
15378ee8d1cSJulian Grajkowski 	 * may be shared between precomputes when there are more than 1 as in
15478ee8d1cSJulian Grajkowski 	 * the
15578ee8d1cSJulian Grajkowski 	 * case of HMAC */
15678ee8d1cSJulian Grajkowski 	union {
15778ee8d1cSJulian Grajkowski 		lac_sym_hash_hmac_precomp_qat_t hmacQatData;
15878ee8d1cSJulian Grajkowski 		/**< Data sent to the QAT for hmac precomputes */
15978ee8d1cSJulian Grajkowski 		lac_sym_hash_aes_precomp_qat_t aesQatData;
16078ee8d1cSJulian Grajkowski 		/**< Data sent to the QAT for AES ECB precomputes */
16178ee8d1cSJulian Grajkowski 	} u;
16278ee8d1cSJulian Grajkowski 
16378ee8d1cSJulian Grajkowski 	/**< ASSUMPTION: The above structures are 8 byte aligned if the overall
16478ee8d1cSJulian Grajkowski 	 * struct is 8 byte aligned, as there are two 4 byte fields before this
16578ee8d1cSJulian Grajkowski 	 * union */
16678ee8d1cSJulian Grajkowski 	Cpa32U stateSize;
16778ee8d1cSJulian Grajkowski 	/**< Size of the state to be copied into the state pointer in the
16878ee8d1cSJulian Grajkowski 	 * content
16978ee8d1cSJulian Grajkowski 	 * descriptor */
17078ee8d1cSJulian Grajkowski 	Cpa8U *pState;
17178ee8d1cSJulian Grajkowski 	/**< pointer to the state in the content descriptor where the result of
17278ee8d1cSJulian Grajkowski 	 * the precompute should be copied to */
17378ee8d1cSJulian Grajkowski } lac_sym_hash_precomp_op_data_t;
17478ee8d1cSJulian Grajkowski 
17578ee8d1cSJulian Grajkowski #endif /* LAC_SYM_HASH_PRECOMPUTES_H */
176