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_sw_precomputes.c
778ee8d1cSJulian Grajkowski  *
878ee8d1cSJulian Grajkowski  * @ingroup LacHashDefs
978ee8d1cSJulian Grajkowski  *
1078ee8d1cSJulian Grajkowski  * Hash Software
1178ee8d1cSJulian Grajkowski  ***************************************************************************/
1278ee8d1cSJulian Grajkowski 
1378ee8d1cSJulian Grajkowski /*
1478ee8d1cSJulian Grajkowski ******************************************************************************
1578ee8d1cSJulian Grajkowski * Include public/global header files
1678ee8d1cSJulian Grajkowski ******************************************************************************
1778ee8d1cSJulian Grajkowski */
1878ee8d1cSJulian Grajkowski 
1978ee8d1cSJulian Grajkowski #include "cpa.h"
2078ee8d1cSJulian Grajkowski #include "cpa_cy_sym.h"
2178ee8d1cSJulian Grajkowski 
2278ee8d1cSJulian Grajkowski #include "icp_accel_devices.h"
2378ee8d1cSJulian Grajkowski #include "icp_adf_init.h"
2478ee8d1cSJulian Grajkowski #include "icp_adf_transport.h"
2578ee8d1cSJulian Grajkowski #include "icp_adf_debug.h"
2678ee8d1cSJulian Grajkowski 
2778ee8d1cSJulian Grajkowski /*
2878ee8d1cSJulian Grajkowski *******************************************************************************
2978ee8d1cSJulian Grajkowski * Include private header files
3078ee8d1cSJulian Grajkowski *******************************************************************************
3178ee8d1cSJulian Grajkowski */
3278ee8d1cSJulian Grajkowski 
3378ee8d1cSJulian Grajkowski #include "qat_utils.h"
3478ee8d1cSJulian Grajkowski #include "lac_mem.h"
3578ee8d1cSJulian Grajkowski #include "lac_sym.h"
3678ee8d1cSJulian Grajkowski #include "lac_log.h"
3778ee8d1cSJulian Grajkowski #include "lac_mem_pools.h"
3878ee8d1cSJulian Grajkowski #include "lac_list.h"
3978ee8d1cSJulian Grajkowski #include "lac_sym_hash_defs.h"
4078ee8d1cSJulian Grajkowski #include "lac_sym_qat_hash_defs_lookup.h"
4178ee8d1cSJulian Grajkowski #include "lac_sal_types_crypto.h"
4278ee8d1cSJulian Grajkowski #include "lac_sal.h"
4378ee8d1cSJulian Grajkowski #include "lac_session.h"
4478ee8d1cSJulian Grajkowski #include "lac_sym_hash_precomputes.h"
4578ee8d1cSJulian Grajkowski 
4678ee8d1cSJulian Grajkowski static CpaStatus
LacSymHash_Compute(CpaCySymHashAlgorithm hashAlgorithm,lac_sym_qat_hash_alg_info_t * pHashAlgInfo,Cpa8U * in,Cpa8U * out)4778ee8d1cSJulian Grajkowski LacSymHash_Compute(CpaCySymHashAlgorithm hashAlgorithm,
4878ee8d1cSJulian Grajkowski 		   lac_sym_qat_hash_alg_info_t *pHashAlgInfo,
4978ee8d1cSJulian Grajkowski 		   Cpa8U *in,
5078ee8d1cSJulian Grajkowski 		   Cpa8U *out)
5178ee8d1cSJulian Grajkowski {
5278ee8d1cSJulian Grajkowski 	/*
5378ee8d1cSJulian Grajkowski 	 * Note: from SHA hashes appropriate endian swapping is required.
5478ee8d1cSJulian Grajkowski 	 * For sha1, sha224 and sha256 double words based swapping.
5578ee8d1cSJulian Grajkowski 	 * For sha384 and sha512 quad words swapping.
5678ee8d1cSJulian Grajkowski 	 * No endianes swapping for md5 is required.
5778ee8d1cSJulian Grajkowski 	 */
5878ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_FAIL;
5978ee8d1cSJulian Grajkowski 	Cpa32U i = 0;
6078ee8d1cSJulian Grajkowski 	switch (hashAlgorithm) {
6178ee8d1cSJulian Grajkowski 	case CPA_CY_SYM_HASH_MD5:
6278ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != qatUtilsHashMD5(in, out)) {
6378ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR("qatUtilsHashMD5 Failed\n");
6478ee8d1cSJulian Grajkowski 			return status;
6578ee8d1cSJulian Grajkowski 		}
6678ee8d1cSJulian Grajkowski 		status = CPA_STATUS_SUCCESS;
6778ee8d1cSJulian Grajkowski 		break;
6878ee8d1cSJulian Grajkowski 	case CPA_CY_SYM_HASH_SHA1:
6978ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != qatUtilsHashSHA1(in, out)) {
7078ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR("qatUtilsHashSHA1 Failed\n");
7178ee8d1cSJulian Grajkowski 			return status;
7278ee8d1cSJulian Grajkowski 		}
7378ee8d1cSJulian Grajkowski 		for (i = 0; i < LAC_BYTES_TO_LONGWORDS(pHashAlgInfo->stateSize);
7478ee8d1cSJulian Grajkowski 		     i++) {
7578ee8d1cSJulian Grajkowski 			((Cpa32U *)(out))[i] =
7678ee8d1cSJulian Grajkowski 			    LAC_MEM_WR_32(((Cpa32U *)(out))[i]);
7778ee8d1cSJulian Grajkowski 		}
7878ee8d1cSJulian Grajkowski 		status = CPA_STATUS_SUCCESS;
7978ee8d1cSJulian Grajkowski 		break;
8078ee8d1cSJulian Grajkowski 	case CPA_CY_SYM_HASH_SHA224:
8178ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != qatUtilsHashSHA224(in, out)) {
8278ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR("qatUtilsHashSHA224 Failed\n");
8378ee8d1cSJulian Grajkowski 			return status;
8478ee8d1cSJulian Grajkowski 		}
8578ee8d1cSJulian Grajkowski 		for (i = 0; i < LAC_BYTES_TO_LONGWORDS(pHashAlgInfo->stateSize);
8678ee8d1cSJulian Grajkowski 		     i++) {
8778ee8d1cSJulian Grajkowski 			((Cpa32U *)(out))[i] =
8878ee8d1cSJulian Grajkowski 			    LAC_MEM_WR_32(((Cpa32U *)(out))[i]);
8978ee8d1cSJulian Grajkowski 		}
9078ee8d1cSJulian Grajkowski 		status = CPA_STATUS_SUCCESS;
9178ee8d1cSJulian Grajkowski 		break;
9278ee8d1cSJulian Grajkowski 	case CPA_CY_SYM_HASH_SHA256:
9378ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != qatUtilsHashSHA256(in, out)) {
9478ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR("qatUtilsHashSHA256 Failed\n");
9578ee8d1cSJulian Grajkowski 			return status;
9678ee8d1cSJulian Grajkowski 		}
9778ee8d1cSJulian Grajkowski 		for (i = 0; i < LAC_BYTES_TO_LONGWORDS(pHashAlgInfo->stateSize);
9878ee8d1cSJulian Grajkowski 		     i++) {
9978ee8d1cSJulian Grajkowski 			((Cpa32U *)(out))[i] =
10078ee8d1cSJulian Grajkowski 			    LAC_MEM_WR_32(((Cpa32U *)(out))[i]);
10178ee8d1cSJulian Grajkowski 		}
10278ee8d1cSJulian Grajkowski 		status = CPA_STATUS_SUCCESS;
10378ee8d1cSJulian Grajkowski 		break;
10478ee8d1cSJulian Grajkowski 	case CPA_CY_SYM_HASH_SHA384:
10578ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != qatUtilsHashSHA384(in, out)) {
10678ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR("qatUtilsHashSHA384 Failed\n");
10778ee8d1cSJulian Grajkowski 			return status;
10878ee8d1cSJulian Grajkowski 		}
10978ee8d1cSJulian Grajkowski 		for (i = 0; i < LAC_BYTES_TO_QUADWORDS(pHashAlgInfo->stateSize);
11078ee8d1cSJulian Grajkowski 		     i++) {
11178ee8d1cSJulian Grajkowski 			((Cpa64U *)(out))[i] =
11278ee8d1cSJulian Grajkowski 			    LAC_MEM_WR_64(((Cpa64U *)(out))[i]);
11378ee8d1cSJulian Grajkowski 		}
11478ee8d1cSJulian Grajkowski 		status = CPA_STATUS_SUCCESS;
11578ee8d1cSJulian Grajkowski 		break;
11678ee8d1cSJulian Grajkowski 	case CPA_CY_SYM_HASH_SHA512:
11778ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != qatUtilsHashSHA512(in, out)) {
11878ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR("qatUtilsHashSHA512 Failed\n");
11978ee8d1cSJulian Grajkowski 			return status;
12078ee8d1cSJulian Grajkowski 		}
12178ee8d1cSJulian Grajkowski 		for (i = 0; i < LAC_BYTES_TO_QUADWORDS(pHashAlgInfo->stateSize);
12278ee8d1cSJulian Grajkowski 		     i++) {
12378ee8d1cSJulian Grajkowski 			((Cpa64U *)(out))[i] =
12478ee8d1cSJulian Grajkowski 			    LAC_MEM_WR_64(((Cpa64U *)(out))[i]);
12578ee8d1cSJulian Grajkowski 		}
12678ee8d1cSJulian Grajkowski 		status = CPA_STATUS_SUCCESS;
12778ee8d1cSJulian Grajkowski 		break;
12878ee8d1cSJulian Grajkowski 	default:
12978ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
13078ee8d1cSJulian Grajkowski 	}
13178ee8d1cSJulian Grajkowski 	return status;
13278ee8d1cSJulian Grajkowski }
13378ee8d1cSJulian Grajkowski 
13478ee8d1cSJulian Grajkowski CpaStatus
LacSymHash_HmacPreComputes(CpaInstanceHandle instanceHandle,CpaCySymHashAlgorithm hashAlgorithm,Cpa32U authKeyLenInBytes,Cpa8U * pAuthKey,Cpa8U * pWorkingMemory,Cpa8U * pState1,Cpa8U * pState2,lac_hash_precompute_done_cb_t callbackFn,void * pCallbackTag)13578ee8d1cSJulian Grajkowski LacSymHash_HmacPreComputes(CpaInstanceHandle instanceHandle,
13678ee8d1cSJulian Grajkowski 			   CpaCySymHashAlgorithm hashAlgorithm,
13778ee8d1cSJulian Grajkowski 			   Cpa32U authKeyLenInBytes,
13878ee8d1cSJulian Grajkowski 			   Cpa8U *pAuthKey,
13978ee8d1cSJulian Grajkowski 			   Cpa8U *pWorkingMemory,
14078ee8d1cSJulian Grajkowski 			   Cpa8U *pState1,
14178ee8d1cSJulian Grajkowski 			   Cpa8U *pState2,
14278ee8d1cSJulian Grajkowski 			   lac_hash_precompute_done_cb_t callbackFn,
14378ee8d1cSJulian Grajkowski 			   void *pCallbackTag)
14478ee8d1cSJulian Grajkowski {
14578ee8d1cSJulian Grajkowski 	Cpa8U *pIpadData = NULL;
14678ee8d1cSJulian Grajkowski 	Cpa8U *pOpadData = NULL;
14778ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_FAIL;
14878ee8d1cSJulian Grajkowski 	lac_sym_hash_precomp_op_data_t *pHmacIpadOpData =
14978ee8d1cSJulian Grajkowski 	    (lac_sym_hash_precomp_op_data_t *)pWorkingMemory;
15078ee8d1cSJulian Grajkowski 	lac_sym_hash_precomp_op_data_t *pHmacOpadOpData = pHmacIpadOpData + 1;
15178ee8d1cSJulian Grajkowski 
15278ee8d1cSJulian Grajkowski 	/* Convenience pointers */
15378ee8d1cSJulian Grajkowski 	lac_sym_hash_hmac_precomp_qat_t *pHmacIpadQatData =
15478ee8d1cSJulian Grajkowski 	    &pHmacIpadOpData->u.hmacQatData;
15578ee8d1cSJulian Grajkowski 	lac_sym_hash_hmac_precomp_qat_t *pHmacOpadQatData =
15678ee8d1cSJulian Grajkowski 	    &pHmacOpadOpData->u.hmacQatData;
15778ee8d1cSJulian Grajkowski 
15878ee8d1cSJulian Grajkowski 	lac_sym_qat_hash_alg_info_t *pHashAlgInfo = NULL;
15978ee8d1cSJulian Grajkowski 	Cpa32U i = 0;
16078ee8d1cSJulian Grajkowski 	Cpa32U padLenBytes = 0;
16178ee8d1cSJulian Grajkowski 
16278ee8d1cSJulian Grajkowski 	LacSymQat_HashAlgLookupGet(instanceHandle,
16378ee8d1cSJulian Grajkowski 				   hashAlgorithm,
16478ee8d1cSJulian Grajkowski 				   &pHashAlgInfo);
16578ee8d1cSJulian Grajkowski 	pHmacIpadOpData->stateSize = pHashAlgInfo->stateSize;
16678ee8d1cSJulian Grajkowski 	pHmacOpadOpData->stateSize = pHashAlgInfo->stateSize;
16778ee8d1cSJulian Grajkowski 
16878ee8d1cSJulian Grajkowski 	/* Copy HMAC key into buffers */
16978ee8d1cSJulian Grajkowski 	if (authKeyLenInBytes > 0) {
17078ee8d1cSJulian Grajkowski 		memcpy(pHmacIpadQatData->data, pAuthKey, authKeyLenInBytes);
17178ee8d1cSJulian Grajkowski 		memcpy(pHmacOpadQatData->data, pAuthKey, authKeyLenInBytes);
17278ee8d1cSJulian Grajkowski 	}
17378ee8d1cSJulian Grajkowski 
17478ee8d1cSJulian Grajkowski 	padLenBytes = pHashAlgInfo->blockLength - authKeyLenInBytes;
17578ee8d1cSJulian Grajkowski 
17678ee8d1cSJulian Grajkowski 	/* Clear the remaining buffer space */
17778ee8d1cSJulian Grajkowski 	if (padLenBytes > 0) {
17878ee8d1cSJulian Grajkowski 		LAC_OS_BZERO(pHmacIpadQatData->data + authKeyLenInBytes,
17978ee8d1cSJulian Grajkowski 			     padLenBytes);
18078ee8d1cSJulian Grajkowski 		LAC_OS_BZERO(pHmacOpadQatData->data + authKeyLenInBytes,
18178ee8d1cSJulian Grajkowski 			     padLenBytes);
18278ee8d1cSJulian Grajkowski 	}
18378ee8d1cSJulian Grajkowski 
18478ee8d1cSJulian Grajkowski 	/* XOR Key with IPAD at 4-byte level */
18578ee8d1cSJulian Grajkowski 	for (i = 0; i < pHashAlgInfo->blockLength; i++) {
18678ee8d1cSJulian Grajkowski 		Cpa8U *ipad = pHmacIpadQatData->data + i;
18778ee8d1cSJulian Grajkowski 		Cpa8U *opad = pHmacOpadQatData->data + i;
18878ee8d1cSJulian Grajkowski 
18978ee8d1cSJulian Grajkowski 		*ipad ^= LAC_HASH_IPAD_BYTE;
19078ee8d1cSJulian Grajkowski 		*opad ^= LAC_HASH_OPAD_BYTE;
19178ee8d1cSJulian Grajkowski 	}
19278ee8d1cSJulian Grajkowski 	pIpadData = (Cpa8U *)pHmacIpadQatData->data;
19378ee8d1cSJulian Grajkowski 	pOpadData = (Cpa8U *)pHmacOpadQatData->data;
19478ee8d1cSJulian Grajkowski 
19578ee8d1cSJulian Grajkowski 	status = LacSymHash_Compute(hashAlgorithm,
19678ee8d1cSJulian Grajkowski 				    pHashAlgInfo,
19778ee8d1cSJulian Grajkowski 				    (Cpa8U *)pIpadData,
19878ee8d1cSJulian Grajkowski 				    pState1);
19978ee8d1cSJulian Grajkowski 
20078ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
20178ee8d1cSJulian Grajkowski 		status = LacSymHash_Compute(hashAlgorithm,
20278ee8d1cSJulian Grajkowski 					    pHashAlgInfo,
20378ee8d1cSJulian Grajkowski 					    (Cpa8U *)pOpadData,
20478ee8d1cSJulian Grajkowski 					    pState2);
20578ee8d1cSJulian Grajkowski 	}
20678ee8d1cSJulian Grajkowski 
20778ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
20878ee8d1cSJulian Grajkowski 		callbackFn(pCallbackTag);
20978ee8d1cSJulian Grajkowski 	}
21078ee8d1cSJulian Grajkowski 	return status;
21178ee8d1cSJulian Grajkowski }
21278ee8d1cSJulian Grajkowski 
21378ee8d1cSJulian Grajkowski CpaStatus
LacSymHash_AesECBPreCompute(CpaInstanceHandle instanceHandle,CpaCySymHashAlgorithm hashAlgorithm,Cpa32U authKeyLenInBytes,Cpa8U * pAuthKey,Cpa8U * pWorkingMemory,Cpa8U * pState,lac_hash_precompute_done_cb_t callbackFn,void * pCallbackTag)21478ee8d1cSJulian Grajkowski LacSymHash_AesECBPreCompute(CpaInstanceHandle instanceHandle,
21578ee8d1cSJulian Grajkowski 			    CpaCySymHashAlgorithm hashAlgorithm,
21678ee8d1cSJulian Grajkowski 			    Cpa32U authKeyLenInBytes,
21778ee8d1cSJulian Grajkowski 			    Cpa8U *pAuthKey,
21878ee8d1cSJulian Grajkowski 			    Cpa8U *pWorkingMemory,
21978ee8d1cSJulian Grajkowski 			    Cpa8U *pState,
22078ee8d1cSJulian Grajkowski 			    lac_hash_precompute_done_cb_t callbackFn,
22178ee8d1cSJulian Grajkowski 			    void *pCallbackTag)
22278ee8d1cSJulian Grajkowski {
22378ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_FAIL;
22478ee8d1cSJulian Grajkowski 	Cpa32U stateSize = 0, x = 0;
22578ee8d1cSJulian Grajkowski 	lac_sym_qat_hash_alg_info_t *pHashAlgInfo = NULL;
22678ee8d1cSJulian Grajkowski 
22778ee8d1cSJulian Grajkowski 	if (CPA_CY_SYM_HASH_AES_XCBC == hashAlgorithm) {
22878ee8d1cSJulian Grajkowski 		Cpa8U *in = pWorkingMemory;
22978ee8d1cSJulian Grajkowski 		Cpa8U *out = pState;
23078ee8d1cSJulian Grajkowski 		LacSymQat_HashAlgLookupGet(instanceHandle,
23178ee8d1cSJulian Grajkowski 					   hashAlgorithm,
23278ee8d1cSJulian Grajkowski 					   &pHashAlgInfo);
23378ee8d1cSJulian Grajkowski 		stateSize = pHashAlgInfo->stateSize;
23478ee8d1cSJulian Grajkowski 		memcpy(pWorkingMemory, pHashAlgInfo->initState, stateSize);
23578ee8d1cSJulian Grajkowski 
23678ee8d1cSJulian Grajkowski 		for (x = 0; x < LAC_HASH_XCBC_PRECOMP_KEY_NUM; x++) {
23778ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS !=
23878ee8d1cSJulian Grajkowski 			    qatUtilsAESEncrypt(
23978ee8d1cSJulian Grajkowski 				pAuthKey, authKeyLenInBytes, in, out)) {
24078ee8d1cSJulian Grajkowski 				return status;
24178ee8d1cSJulian Grajkowski 			}
24278ee8d1cSJulian Grajkowski 			in += LAC_HASH_XCBC_MAC_BLOCK_SIZE;
24378ee8d1cSJulian Grajkowski 			out += LAC_HASH_XCBC_MAC_BLOCK_SIZE;
24478ee8d1cSJulian Grajkowski 		}
24578ee8d1cSJulian Grajkowski 		status = CPA_STATUS_SUCCESS;
24678ee8d1cSJulian Grajkowski 	} else if (CPA_CY_SYM_HASH_AES_CMAC == hashAlgorithm) {
24778ee8d1cSJulian Grajkowski 		Cpa8U *out = pState;
24878ee8d1cSJulian Grajkowski 		Cpa8U k1[LAC_HASH_CMAC_BLOCK_SIZE],
24978ee8d1cSJulian Grajkowski 		    k2[LAC_HASH_CMAC_BLOCK_SIZE];
25078ee8d1cSJulian Grajkowski 		Cpa8U *ptr = NULL, i = 0;
25178ee8d1cSJulian Grajkowski 		stateSize = LAC_HASH_CMAC_BLOCK_SIZE;
25278ee8d1cSJulian Grajkowski 		LacSymQat_HashAlgLookupGet(instanceHandle,
25378ee8d1cSJulian Grajkowski 					   hashAlgorithm,
25478ee8d1cSJulian Grajkowski 					   &pHashAlgInfo);
25578ee8d1cSJulian Grajkowski 		/* Original state size includes K, K1 and K2 which are of equal
25678ee8d1cSJulian Grajkowski 		 * length.
25778ee8d1cSJulian Grajkowski 		 * For precompute state size is only of the length of K which is
25878ee8d1cSJulian Grajkowski 		 * equal
25978ee8d1cSJulian Grajkowski 		 * to the block size for CPA_CY_SYM_HASH_AES_CMAC.
26078ee8d1cSJulian Grajkowski 		 * The algorithm is described in rfc4493
26178ee8d1cSJulian Grajkowski 		 * K is just copeid, K1 and K2 need to be single inplace encrypt
26278ee8d1cSJulian Grajkowski 		 * with AES.
26378ee8d1cSJulian Grajkowski 		 * */
26478ee8d1cSJulian Grajkowski 		memcpy(out, pHashAlgInfo->initState, stateSize);
26578ee8d1cSJulian Grajkowski 		memcpy(out, pAuthKey, authKeyLenInBytes);
26678ee8d1cSJulian Grajkowski 		out += LAC_HASH_CMAC_BLOCK_SIZE;
26778ee8d1cSJulian Grajkowski 
26878ee8d1cSJulian Grajkowski 		for (x = 0; x < LAC_HASH_XCBC_PRECOMP_KEY_NUM - 1; x++) {
26978ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS !=
27078ee8d1cSJulian Grajkowski 			    qatUtilsAESEncrypt(
27178ee8d1cSJulian Grajkowski 				pAuthKey, authKeyLenInBytes, out, out)) {
27278ee8d1cSJulian Grajkowski 				return status;
27378ee8d1cSJulian Grajkowski 			}
27478ee8d1cSJulian Grajkowski 			out += LAC_HASH_CMAC_BLOCK_SIZE;
27578ee8d1cSJulian Grajkowski 		}
27678ee8d1cSJulian Grajkowski 
27778ee8d1cSJulian Grajkowski 		ptr = pState + LAC_HASH_CMAC_BLOCK_SIZE;
27878ee8d1cSJulian Grajkowski 
27978ee8d1cSJulian Grajkowski 		/* Derived keys (k1 and k2), copy them to
28078ee8d1cSJulian Grajkowski 		 * pPrecompOpData->pState,
28178ee8d1cSJulian Grajkowski 		 * but remember that at the beginning is original key (K0)
28278ee8d1cSJulian Grajkowski 		 */
28378ee8d1cSJulian Grajkowski 		/* Calculating K1 */
28478ee8d1cSJulian Grajkowski 		for (i = 0; i < LAC_HASH_CMAC_BLOCK_SIZE; i++, ptr++) {
28578ee8d1cSJulian Grajkowski 			k1[i] = (*ptr) << 1;
28678ee8d1cSJulian Grajkowski 			if (i != 0) {
28778ee8d1cSJulian Grajkowski 				k1[i - 1] |=
28878ee8d1cSJulian Grajkowski 				    (*ptr) >> (LAC_NUM_BITS_IN_BYTE - 1);
28978ee8d1cSJulian Grajkowski 			}
29078ee8d1cSJulian Grajkowski 			if (i + 1 == LAC_HASH_CMAC_BLOCK_SIZE) {
29178ee8d1cSJulian Grajkowski 				/* If msb of pState + LAC_HASH_CMAC_BLOCK_SIZE
29278ee8d1cSJulian Grajkowski 				   is set xor
29378ee8d1cSJulian Grajkowski 				   with RB. Because only the final byte of RB is
29478ee8d1cSJulian Grajkowski 				   non-zero
29578ee8d1cSJulian Grajkowski 				   this is all we need to xor */
29678ee8d1cSJulian Grajkowski 				if ((*(pState + LAC_HASH_CMAC_BLOCK_SIZE)) &
29778ee8d1cSJulian Grajkowski 				    LAC_SYM_HASH_MSBIT_MASK) {
29878ee8d1cSJulian Grajkowski 					k1[i] ^= LAC_SYM_AES_CMAC_RB_128;
29978ee8d1cSJulian Grajkowski 				}
30078ee8d1cSJulian Grajkowski 			}
30178ee8d1cSJulian Grajkowski 		}
30278ee8d1cSJulian Grajkowski 
30378ee8d1cSJulian Grajkowski 		/* Calculating K2 */
30478ee8d1cSJulian Grajkowski 		for (i = 0; i < LAC_HASH_CMAC_BLOCK_SIZE; i++) {
30578ee8d1cSJulian Grajkowski 			k2[i] = (k1[i]) << 1;
30678ee8d1cSJulian Grajkowski 			if (i != 0) {
30778ee8d1cSJulian Grajkowski 				k2[i - 1] |=
30878ee8d1cSJulian Grajkowski 				    (k1[i]) >> (LAC_NUM_BITS_IN_BYTE - 1);
30978ee8d1cSJulian Grajkowski 			}
31078ee8d1cSJulian Grajkowski 			if (i + 1 == LAC_HASH_CMAC_BLOCK_SIZE) {
31178ee8d1cSJulian Grajkowski 				/* If msb of k1 is set xor last byte with RB */
31278ee8d1cSJulian Grajkowski 				if (k1[0] & LAC_SYM_HASH_MSBIT_MASK) {
31378ee8d1cSJulian Grajkowski 					k2[i] ^= LAC_SYM_AES_CMAC_RB_128;
31478ee8d1cSJulian Grajkowski 				}
31578ee8d1cSJulian Grajkowski 			}
31678ee8d1cSJulian Grajkowski 		}
31778ee8d1cSJulian Grajkowski 		/* Now, when we have K1 & K2 lets copy them to the state2 */
31878ee8d1cSJulian Grajkowski 		ptr = pState + LAC_HASH_CMAC_BLOCK_SIZE;
31978ee8d1cSJulian Grajkowski 		memcpy(ptr, k1, LAC_HASH_CMAC_BLOCK_SIZE);
32078ee8d1cSJulian Grajkowski 		ptr += LAC_HASH_CMAC_BLOCK_SIZE;
32178ee8d1cSJulian Grajkowski 		memcpy(ptr, k2, LAC_HASH_CMAC_BLOCK_SIZE);
32278ee8d1cSJulian Grajkowski 		status = CPA_STATUS_SUCCESS;
32378ee8d1cSJulian Grajkowski 	} else if (CPA_CY_SYM_HASH_AES_GCM == hashAlgorithm ||
32478ee8d1cSJulian Grajkowski 		   CPA_CY_SYM_HASH_AES_GMAC == hashAlgorithm) {
32578ee8d1cSJulian Grajkowski 		Cpa8U *in = pWorkingMemory;
32678ee8d1cSJulian Grajkowski 		Cpa8U *out = pState;
32778ee8d1cSJulian Grajkowski 		LAC_OS_BZERO(pWorkingMemory, ICP_QAT_HW_GALOIS_H_SZ);
32878ee8d1cSJulian Grajkowski 
32978ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS !=
33078ee8d1cSJulian Grajkowski 		    qatUtilsAESEncrypt(pAuthKey, authKeyLenInBytes, in, out)) {
33178ee8d1cSJulian Grajkowski 			return status;
33278ee8d1cSJulian Grajkowski 		}
33378ee8d1cSJulian Grajkowski 		status = CPA_STATUS_SUCCESS;
33478ee8d1cSJulian Grajkowski 	} else {
33578ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
33678ee8d1cSJulian Grajkowski 	}
33778ee8d1cSJulian Grajkowski 	callbackFn(pCallbackTag);
33878ee8d1cSJulian Grajkowski 	return status;
33978ee8d1cSJulian Grajkowski }
34078ee8d1cSJulian Grajkowski 
34178ee8d1cSJulian Grajkowski CpaStatus
LacSymHash_HmacPrecompInit(CpaInstanceHandle instanceHandle)34278ee8d1cSJulian Grajkowski LacSymHash_HmacPrecompInit(CpaInstanceHandle instanceHandle)
34378ee8d1cSJulian Grajkowski {
34478ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
34578ee8d1cSJulian Grajkowski 	return status;
34678ee8d1cSJulian Grajkowski }
34778ee8d1cSJulian Grajkowski 
34878ee8d1cSJulian Grajkowski void
LacSymHash_HmacPrecompShutdown(CpaInstanceHandle instanceHandle)34978ee8d1cSJulian Grajkowski LacSymHash_HmacPrecompShutdown(CpaInstanceHandle instanceHandle)
35078ee8d1cSJulian Grajkowski {
35178ee8d1cSJulian Grajkowski 	return;
35278ee8d1cSJulian Grajkowski }
353