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