#include "cpa.h"
#include "cpa_cy_sym.h"
#include "icp_accel_devices.h"
#include "icp_adf_debug.h"
#include "lac_log.h"
#include "lac_mem.h"
#include "lac_sym.h"
#include "lac_common.h"
#include "lac_sym_qat.h"
#include "lac_list.h"
#include "lac_sal_types.h"
#include "lac_sal_types_crypto.h"
#include "lac_sym_qat_hash.h"
#include "lac_sym_qat_hash_defs_lookup.h"
#include "sal_hw_gen.h"
typedef struct lac_hash_blk_ptrs_s {
icp_qat_hw_auth_setup_t *pInHashSetup;
Cpa8U *pInHashInitState1;
Cpa8U *pInHashInitState2;
icp_qat_hw_auth_setup_t *pOutHashSetup;
Cpa8U *pOutHashInitState1;
} lac_hash_blk_ptrs_t;
typedef struct lac_hash_blk_ptrs_optimised_s {
Cpa8U *pInHashInitState1;
Cpa8U *pInHashInitState2;
} lac_hash_blk_ptrs_optimised_t;
static void
LacSymQat_HashHwBlockPtrsInit(icp_qat_fw_auth_cd_ctrl_hdr_t *pHashControlBlock,
void *pHwBlockBase,
lac_hash_blk_ptrs_t *pHashBlkPtrs);
static void
LacSymQat_HashSetupBlockOptimisedFormatInit(
const CpaCySymHashSetupData *pHashSetupData,
icp_qat_fw_auth_cd_ctrl_hdr_t *pHashControlBlock,
void *pHwBlockBase,
icp_qat_hw_auth_mode_t qatHashMode,
lac_sym_qat_hash_precompute_info_t *pPrecompute,
lac_sym_qat_hash_defs_t *pHashDefs,
lac_sym_qat_hash_defs_t *pOuterHashDefs);
static void
LacSymQat_HashSetupBlockInit(const CpaCySymHashSetupData *pHashSetupData,
icp_qat_fw_auth_cd_ctrl_hdr_t *pHashControlBlock,
void *pHwBlockBase,
icp_qat_hw_auth_mode_t qatHashMode,
lac_sym_qat_hash_precompute_info_t *pPrecompute,
lac_sym_qat_hash_defs_t *pHashDefs,
lac_sym_qat_hash_defs_t *pOuterHashDefs);
void
LacSymQat_HashGetCfgData(CpaInstanceHandle pInstance,
icp_qat_hw_auth_mode_t qatHashMode,
CpaCySymHashMode apiHashMode,
CpaCySymHashAlgorithm apiHashAlgorithm,
icp_qat_hw_auth_algo_t *pQatAlgorithm,
CpaBoolean *pQatNested)
{
lac_sym_qat_hash_defs_t *pHashDefs = NULL;
LacSymQat_HashDefsLookupGet(pInstance, apiHashAlgorithm, &pHashDefs);
*pQatAlgorithm = pHashDefs->qatInfo->algoEnc;
if (IS_HASH_MODE_2(qatHashMode)) {
*pQatNested = ICP_QAT_FW_AUTH_HDR_FLAG_DO_NESTED;
}
else if (CPA_CY_SYM_HASH_MODE_NESTED == apiHashMode) {
*pQatNested = ICP_QAT_FW_AUTH_HDR_FLAG_DO_NESTED;
}
else {
*pQatNested = ICP_QAT_FW_AUTH_HDR_FLAG_NO_NESTED;
}
}
void
LacSymQat_HashContentDescInit(icp_qat_la_bulk_req_ftr_t *pMsg,
CpaInstanceHandle instanceHandle,
const CpaCySymHashSetupData *pHashSetupData,
void *pHwBlockBase,
Cpa32U hwBlockOffsetInQuadWords,
icp_qat_fw_slice_t nextSlice,
icp_qat_hw_auth_mode_t qatHashMode,
CpaBoolean useSymConstantsTable,
CpaBoolean useOptimisedContentDesc,
CpaBoolean useStatefulSha3ContentDesc,
lac_sym_qat_hash_precompute_info_t *pPrecompute,
Cpa32U *pHashBlkSizeInBytes)
{
icp_qat_fw_auth_cd_ctrl_hdr_t *cd_ctrl =
(icp_qat_fw_auth_cd_ctrl_hdr_t *)&(pMsg->cd_ctrl);
lac_sym_qat_hash_defs_t *pHashDefs = NULL;
lac_sym_qat_hash_defs_t *pOuterHashDefs = NULL;
Cpa32U hashSetupBlkSize = 0;
cd_ctrl->hash_cfg_offset = (Cpa8U)hwBlockOffsetInQuadWords;
ICP_QAT_FW_COMN_NEXT_ID_SET(cd_ctrl, nextSlice);
ICP_QAT_FW_COMN_CURR_ID_SET(cd_ctrl, ICP_QAT_FW_SLICE_AUTH);
LacSymQat_HashDefsLookupGet(instanceHandle,
pHashSetupData->hashAlgorithm,
&pHashDefs);
if (IS_HASH_MODE_2(qatHashMode)) {
if (isCyGen4x((sal_crypto_service_t *)instanceHandle)) {
ICP_QAT_FW_HASH_FLAG_MODE2_SET(cd_ctrl->hash_flags,
QAT_FW_LA_MODE2);
} else {
ICP_QAT_FW_HASH_FLAG_AUTH_HDR_NESTED_SET(
cd_ctrl->hash_flags,
ICP_QAT_FW_AUTH_HDR_FLAG_DO_NESTED);
}
}
else if (CPA_CY_SYM_HASH_MODE_NESTED == pHashSetupData->hashMode) {
ICP_QAT_FW_HASH_FLAG_AUTH_HDR_NESTED_SET(
cd_ctrl->hash_flags, ICP_QAT_FW_AUTH_HDR_FLAG_DO_NESTED);
}
else {
ICP_QAT_FW_HASH_FLAG_AUTH_HDR_NESTED_SET(
cd_ctrl->hash_flags, ICP_QAT_FW_AUTH_HDR_FLAG_NO_NESTED);
}
if (useStatefulSha3ContentDesc) {
ICP_QAT_FW_HASH_FLAG_SKIP_INNER_STATE1_LOAD_SET(
cd_ctrl->hash_flags, QAT_FW_LA_SKIP_INNER_STATE1_LOAD);
ICP_QAT_FW_HASH_FLAG_SKIP_OUTER_STATE1_LOAD_SET(
cd_ctrl->hash_flags, QAT_FW_LA_SKIP_OUTER_STATE1_LOAD);
}
cd_ctrl->final_sz = (Cpa8U)pHashSetupData->digestResultLenInBytes;
if (useStatefulSha3ContentDesc) {
cd_ctrl->inner_state1_sz =
LAC_ALIGN_POW2_ROUNDUP(LAC_HASH_SHA3_STATEFUL_STATE_SIZE,
LAC_QUAD_WORD_IN_BYTES);
} else {
cd_ctrl->inner_state1_sz =
LAC_ALIGN_POW2_ROUNDUP(pHashDefs->qatInfo->state1Length,
LAC_QUAD_WORD_IN_BYTES);
}
cd_ctrl->inner_res_sz = (Cpa8U)pHashDefs->algInfo->digestLength;
if (IS_HASH_MODE_1(qatHashMode) ||
pHashSetupData->hashAlgorithm == CPA_CY_SYM_HASH_AES_CBC_MAC ||
pHashSetupData->hashAlgorithm == CPA_CY_SYM_HASH_ZUC_EIA3) {
cd_ctrl->inner_state2_sz =
LAC_ALIGN_POW2_ROUNDUP(pHashDefs->qatInfo->state2Length,
LAC_QUAD_WORD_IN_BYTES);
} else {
cd_ctrl->inner_state2_sz = 0;
}
if (useSymConstantsTable) {
cd_ctrl->inner_state2_offset =
LAC_BYTES_TO_QUADWORDS(cd_ctrl->inner_state1_sz);
hashSetupBlkSize =
cd_ctrl->inner_state1_sz + cd_ctrl->inner_state2_sz;
} else {
cd_ctrl->inner_state2_offset = cd_ctrl->hash_cfg_offset +
LAC_BYTES_TO_QUADWORDS(sizeof(icp_qat_hw_auth_setup_t) +
cd_ctrl->inner_state1_sz);
hashSetupBlkSize = sizeof(icp_qat_hw_auth_setup_t) +
cd_ctrl->inner_state1_sz + cd_ctrl->inner_state2_sz;
}
if (CPA_CY_SYM_HASH_MODE_NESTED == pHashSetupData->hashMode ||
IS_HASH_MODE_2(qatHashMode)) {
CpaCySymHashAlgorithm outerAlg =
(CPA_CY_SYM_HASH_MODE_NESTED == pHashSetupData->hashMode) ?
pHashSetupData->nestedModeSetupData.outerHashAlgorithm :
pHashSetupData->hashAlgorithm;
LacSymQat_HashDefsLookupGet(instanceHandle,
outerAlg,
&pOuterHashDefs);
cd_ctrl->outer_config_offset = cd_ctrl->inner_state2_offset +
LAC_BYTES_TO_QUADWORDS(cd_ctrl->inner_state2_sz);
if (useStatefulSha3ContentDesc) {
cd_ctrl->outer_state1_sz = LAC_ALIGN_POW2_ROUNDUP(
LAC_HASH_SHA3_STATEFUL_STATE_SIZE,
LAC_QUAD_WORD_IN_BYTES);
} else {
cd_ctrl->outer_state1_sz = LAC_ALIGN_POW2_ROUNDUP(
pOuterHashDefs->algInfo->stateSize,
LAC_QUAD_WORD_IN_BYTES);
}
cd_ctrl->outer_res_sz =
(Cpa8U)pOuterHashDefs->algInfo->digestLength;
hashSetupBlkSize +=
sizeof(icp_qat_hw_auth_setup_t) + cd_ctrl->outer_state1_sz;
} else {
cd_ctrl->outer_config_offset = 0;
cd_ctrl->outer_state1_sz = 0;
cd_ctrl->outer_res_sz = 0;
}
if (CPA_CY_SYM_HASH_SNOW3G_UIA2 == pHashSetupData->hashAlgorithm) {
hashSetupBlkSize += sizeof(icp_qat_hw_cipher_config_t) +
pHashSetupData->authModeSetupData.authKeyLenInBytes +
ICP_QAT_HW_SNOW_3G_UEA2_IV_SZ;
}
*pHashBlkSizeInBytes = hashSetupBlkSize;
if (useOptimisedContentDesc) {
LacSymQat_HashSetupBlockOptimisedFormatInit(pHashSetupData,
cd_ctrl,
pHwBlockBase,
qatHashMode,
pPrecompute,
pHashDefs,
pOuterHashDefs);
} else if (!useSymConstantsTable) {
LacSymQat_HashSetupBlockInit(pHashSetupData,
cd_ctrl,
pHwBlockBase,
qatHashMode,
pPrecompute,
pHashDefs,
pOuterHashDefs);
}
}
void
LacSymQat_HashSetupReqParamsMetaData(
icp_qat_la_bulk_req_ftr_t *pMsg,
CpaInstanceHandle instanceHandle,
const CpaCySymHashSetupData *pHashSetupData,
CpaBoolean hashStateBuffer,
icp_qat_hw_auth_mode_t qatHashMode,
CpaBoolean digestVerify)
{
icp_qat_fw_auth_cd_ctrl_hdr_t *cd_ctrl = NULL;
icp_qat_la_auth_req_params_t *pHashReqParams = NULL;
lac_sym_qat_hash_defs_t *pHashDefs = NULL;
cd_ctrl = (icp_qat_fw_auth_cd_ctrl_hdr_t *)&(pMsg->cd_ctrl);
pHashReqParams =
(icp_qat_la_auth_req_params_t *)(&(pMsg->serv_specif_rqpars));
LacSymQat_HashDefsLookupGet(instanceHandle,
pHashSetupData->hashAlgorithm,
&pHashDefs);
if (IS_HASH_MODE_2(qatHashMode)) {
pHashReqParams->u2.inner_prefix_sz =
(Cpa8U)pHashDefs->algInfo->blockLength;
cd_ctrl->outer_prefix_sz =
(Cpa8U)pHashDefs->algInfo->blockLength;
cd_ctrl->outer_prefix_offset = LAC_BYTES_TO_QUADWORDS(
LAC_ALIGN_POW2_ROUNDUP((pHashReqParams->u2.inner_prefix_sz),
LAC_QUAD_WORD_IN_BYTES));
}
else if (CPA_CY_SYM_HASH_MODE_NESTED == pHashSetupData->hashMode) {
pHashReqParams->u2.inner_prefix_sz =
(Cpa8U)pHashSetupData->nestedModeSetupData
.innerPrefixLenInBytes;
cd_ctrl->outer_prefix_sz =
(Cpa8U)pHashSetupData->nestedModeSetupData
.outerPrefixLenInBytes;
cd_ctrl->outer_prefix_offset = LAC_BYTES_TO_QUADWORDS(
LAC_ALIGN_POW2_ROUNDUP((pHashReqParams->u2.inner_prefix_sz),
LAC_QUAD_WORD_IN_BYTES));
}
else {
Cpa16U aadDataSize = 0;
if (CPA_CY_SYM_HASH_AES_CCM == pHashSetupData->hashAlgorithm) {
aadDataSize = LAC_HASH_AES_CCM_BLOCK_SIZE;
if (pHashSetupData->authModeSetupData.aadLenInBytes >
0) {
aadDataSize += sizeof(Cpa16U);
aadDataSize +=
(Cpa16U)pHashSetupData->authModeSetupData
.aadLenInBytes;
}
pHashReqParams->u2.aad_sz =
LAC_ALIGN_POW2_ROUNDUP(aadDataSize,
LAC_HASH_AES_CCM_BLOCK_SIZE);
} else if (CPA_CY_SYM_HASH_AES_GCM ==
pHashSetupData->hashAlgorithm) {
aadDataSize =
(Cpa16U)
pHashSetupData->authModeSetupData.aadLenInBytes;
pHashReqParams->u2.aad_sz =
LAC_ALIGN_POW2_ROUNDUP(aadDataSize,
LAC_HASH_AES_GCM_BLOCK_SIZE);
} else {
pHashReqParams->u2.aad_sz = 0;
}
cd_ctrl->outer_prefix_sz = 0;
cd_ctrl->outer_prefix_offset = 0;
}
if (CPA_TRUE == hashStateBuffer) {
pHashReqParams->hash_state_sz = LAC_BYTES_TO_QUADWORDS(
LAC_ALIGN_POW2_ROUNDUP(pHashReqParams->u2.inner_prefix_sz,
LAC_QUAD_WORD_IN_BYTES) +
LAC_ALIGN_POW2_ROUNDUP(cd_ctrl->outer_prefix_sz,
LAC_QUAD_WORD_IN_BYTES));
} else {
pHashReqParams->hash_state_sz = 0;
}
if (CPA_TRUE == digestVerify) {
pHashReqParams->auth_res_sz =
(Cpa8U)pHashSetupData->digestResultLenInBytes;
} else {
pHashReqParams->auth_res_sz = 0;
}
pHashReqParams->resrvd1 = 0;
}
void
LacSymQat_HashHwBlockPtrsInit(icp_qat_fw_auth_cd_ctrl_hdr_t *cd_ctrl,
void *pHwBlockBase,
lac_hash_blk_ptrs_t *pHashBlkPtrs)
{
pHashBlkPtrs->pInHashSetup =
(icp_qat_hw_auth_setup_t *)((Cpa8U *)pHwBlockBase +
(cd_ctrl->hash_cfg_offset *
LAC_QUAD_WORD_IN_BYTES));
pHashBlkPtrs->pInHashInitState1 = (Cpa8U *)pHashBlkPtrs->pInHashSetup +
sizeof(icp_qat_hw_auth_setup_t);
pHashBlkPtrs->pInHashInitState2 =
(Cpa8U *)(pHashBlkPtrs->pInHashInitState1) +
cd_ctrl->inner_state1_sz;
pHashBlkPtrs->pOutHashSetup =
(icp_qat_hw_auth_setup_t *)((Cpa8U *)(pHashBlkPtrs
->pInHashInitState2) +
cd_ctrl->inner_state2_sz);
pHashBlkPtrs->pOutHashInitState1 =
(Cpa8U *)(pHashBlkPtrs->pOutHashSetup) +
sizeof(icp_qat_hw_auth_setup_t);
}
static void
LacSymQat_HashSetupBlockInit(const CpaCySymHashSetupData *pHashSetupData,
icp_qat_fw_auth_cd_ctrl_hdr_t *pHashControlBlock,
void *pHwBlockBase,
icp_qat_hw_auth_mode_t qatHashMode,
lac_sym_qat_hash_precompute_info_t *pPrecompute,
lac_sym_qat_hash_defs_t *pHashDefs,
lac_sym_qat_hash_defs_t *pOuterHashDefs)
{
Cpa32U innerConfig = 0;
lac_hash_blk_ptrs_t hashBlkPtrs = { 0 };
Cpa32U aedHashCmpLength = 0;
LacSymQat_HashHwBlockPtrsInit(pHashControlBlock,
pHwBlockBase,
&hashBlkPtrs);
innerConfig = ICP_QAT_HW_AUTH_CONFIG_BUILD(
qatHashMode,
pHashDefs->qatInfo->algoEnc,
pHashSetupData->digestResultLenInBytes);
hashBlkPtrs.pInHashSetup->auth_config.config = innerConfig;
hashBlkPtrs.pInHashSetup->auth_config.reserved = 0;
if (IS_HASH_MODE_1(qatHashMode) ||
CPA_CY_SYM_HASH_AES_CBC_MAC == pHashSetupData->hashAlgorithm ||
CPA_CY_SYM_HASH_ZUC_EIA3 == pHashSetupData->hashAlgorithm) {
LAC_MEM_SHARED_WRITE_SWAP(
hashBlkPtrs.pInHashSetup->auth_counter.counter,
pHashDefs->qatInfo->authCounter);
if ((CPA_CY_SYM_HASH_AES_XCBC ==
pHashSetupData->hashAlgorithm) ||
(CPA_CY_SYM_HASH_AES_CMAC ==
pHashSetupData->hashAlgorithm) ||
(CPA_CY_SYM_HASH_AES_CBC_MAC ==
pHashSetupData->hashAlgorithm) ||
(CPA_CY_SYM_HASH_KASUMI_F9 ==
pHashSetupData->hashAlgorithm) ||
(CPA_CY_SYM_HASH_SNOW3G_UIA2 ==
pHashSetupData->hashAlgorithm) ||
(CPA_CY_SYM_HASH_AES_CCM ==
pHashSetupData->hashAlgorithm) ||
(CPA_CY_SYM_HASH_AES_GMAC ==
pHashSetupData->hashAlgorithm) ||
(CPA_CY_SYM_HASH_AES_GCM ==
pHashSetupData->hashAlgorithm) ||
(CPA_CY_SYM_HASH_ZUC_EIA3 ==
pHashSetupData->hashAlgorithm)) {
LAC_OS_BZERO(hashBlkPtrs.pInHashInitState1,
pHashDefs->qatInfo->state1Length);
}
if (CPA_CY_SYM_HASH_SHA1 == pHashSetupData->hashAlgorithm) {
Cpa32U state1PadLen = 0;
Cpa32U state2PadLen = 0;
if (pHashControlBlock->inner_state1_sz >
pHashDefs->algInfo->stateSize) {
state1PadLen =
pHashControlBlock->inner_state1_sz -
pHashDefs->algInfo->stateSize;
}
if (pHashControlBlock->inner_state2_sz >
pHashDefs->algInfo->stateSize) {
state2PadLen =
pHashControlBlock->inner_state2_sz -
pHashDefs->algInfo->stateSize;
}
if (state1PadLen > 0) {
LAC_OS_BZERO(hashBlkPtrs.pInHashInitState1 +
pHashDefs->algInfo->stateSize,
state1PadLen);
}
if (state2PadLen > 0) {
LAC_OS_BZERO(hashBlkPtrs.pInHashInitState2 +
pHashDefs->algInfo->stateSize,
state2PadLen);
}
}
pPrecompute->state1Size = pHashDefs->qatInfo->state1Length;
pPrecompute->state2Size = pHashDefs->qatInfo->state2Length;
pPrecompute->pState1 = hashBlkPtrs.pInHashInitState1;
pPrecompute->pState2 = hashBlkPtrs.pInHashInitState2;
}
else {
Cpa32U padLen = pHashControlBlock->inner_state1_sz -
pHashDefs->algInfo->stateSize;
hashBlkPtrs.pInHashSetup->auth_counter.counter = 0;
memcpy(hashBlkPtrs.pInHashInitState1,
pHashDefs->algInfo->initState,
pHashDefs->algInfo->stateSize);
if (padLen > 0) {
LAC_OS_BZERO(hashBlkPtrs.pInHashInitState1 +
pHashDefs->algInfo->stateSize,
padLen);
}
}
hashBlkPtrs.pInHashSetup->auth_counter.reserved = 0;
if ((CPA_CY_SYM_HASH_MODE_NESTED == pHashSetupData->hashMode ||
IS_HASH_MODE_2(qatHashMode)) &&
(NULL != pOuterHashDefs)) {
Cpa32U outerConfig = ICP_QAT_HW_AUTH_CONFIG_BUILD(
qatHashMode,
pOuterHashDefs->qatInfo->algoEnc,
pHashSetupData->digestResultLenInBytes);
Cpa32U padLen = pHashControlBlock->outer_state1_sz -
pOuterHashDefs->algInfo->stateSize;
hashBlkPtrs.pOutHashSetup->auth_config.config = outerConfig;
hashBlkPtrs.pOutHashSetup->auth_config.reserved = 0;
hashBlkPtrs.pOutHashSetup->auth_counter.counter = 0;
hashBlkPtrs.pOutHashSetup->auth_counter.reserved = 0;
memcpy(hashBlkPtrs.pOutHashInitState1,
pOuterHashDefs->algInfo->initState,
pOuterHashDefs->algInfo->stateSize);
if (padLen > 0) {
LAC_OS_BZERO(hashBlkPtrs.pOutHashInitState1 +
pOuterHashDefs->algInfo->stateSize,
padLen);
}
}
if (CPA_CY_SYM_HASH_SNOW3G_UIA2 == pHashSetupData->hashAlgorithm) {
icp_qat_hw_cipher_config_t *pCipherConfig =
(icp_qat_hw_cipher_config_t *)hashBlkPtrs.pOutHashSetup;
pCipherConfig->val = ICP_QAT_HW_CIPHER_CONFIG_BUILD(
ICP_QAT_HW_CIPHER_ECB_MODE,
ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2,
ICP_QAT_HW_CIPHER_KEY_CONVERT,
ICP_QAT_HW_CIPHER_ENCRYPT,
aedHashCmpLength);
pCipherConfig->reserved = 0;
memcpy((Cpa8U *)pCipherConfig +
sizeof(icp_qat_hw_cipher_config_t),
pHashSetupData->authModeSetupData.authKey,
pHashSetupData->authModeSetupData.authKeyLenInBytes);
LAC_OS_BZERO(
(Cpa8U *)pCipherConfig +
sizeof(icp_qat_hw_cipher_config_t) +
pHashSetupData->authModeSetupData.authKeyLenInBytes,
ICP_QAT_HW_SNOW_3G_UEA2_IV_SZ);
} else if (CPA_CY_SYM_HASH_ZUC_EIA3 == pHashSetupData->hashAlgorithm) {
icp_qat_hw_cipher_config_t *pCipherConfig =
(icp_qat_hw_cipher_config_t *)hashBlkPtrs.pOutHashSetup;
pCipherConfig->val = ICP_QAT_HW_CIPHER_CONFIG_BUILD(
ICP_QAT_HW_CIPHER_ECB_MODE,
ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3,
ICP_QAT_HW_CIPHER_KEY_CONVERT,
ICP_QAT_HW_CIPHER_ENCRYPT,
aedHashCmpLength);
pCipherConfig->reserved = 0;
memcpy((Cpa8U *)pCipherConfig +
sizeof(icp_qat_hw_cipher_config_t),
pHashSetupData->authModeSetupData.authKey,
pHashSetupData->authModeSetupData.authKeyLenInBytes);
LAC_OS_BZERO(
(Cpa8U *)pCipherConfig +
sizeof(icp_qat_hw_cipher_config_t) +
pHashSetupData->authModeSetupData.authKeyLenInBytes,
ICP_QAT_HW_ZUC_3G_EEA3_IV_SZ);
}
}
static void
LacSymQat_HashOpHwBlockPtrsInit(icp_qat_fw_auth_cd_ctrl_hdr_t *cd_ctrl,
void *pHwBlockBase,
lac_hash_blk_ptrs_optimised_t *pHashBlkPtrs)
{
pHashBlkPtrs->pInHashInitState1 = (((Cpa8U *)pHwBlockBase) + 16);
pHashBlkPtrs->pInHashInitState2 =
(Cpa8U *)(pHashBlkPtrs->pInHashInitState1) +
cd_ctrl->inner_state1_sz;
}
static void
LacSymQat_HashSetupBlockOptimisedFormatInit(
const CpaCySymHashSetupData *pHashSetupData,
icp_qat_fw_auth_cd_ctrl_hdr_t *pHashControlBlock,
void *pHwBlockBase,
icp_qat_hw_auth_mode_t qatHashMode,
lac_sym_qat_hash_precompute_info_t *pPrecompute,
lac_sym_qat_hash_defs_t *pHashDefs,
lac_sym_qat_hash_defs_t *pOuterHashDefs)
{
Cpa32U state1PadLen = 0;
Cpa32U state2PadLen = 0;
lac_hash_blk_ptrs_optimised_t pHashBlkPtrs = { 0 };
LacSymQat_HashOpHwBlockPtrsInit(pHashControlBlock,
pHwBlockBase,
&pHashBlkPtrs);
if (pHashControlBlock->inner_state1_sz >
pHashDefs->algInfo->stateSize) {
state1PadLen = pHashControlBlock->inner_state1_sz -
pHashDefs->algInfo->stateSize;
}
if (pHashControlBlock->inner_state2_sz >
pHashDefs->algInfo->stateSize) {
state2PadLen = pHashControlBlock->inner_state2_sz -
pHashDefs->algInfo->stateSize;
}
if (state1PadLen > 0) {
LAC_OS_BZERO(pHashBlkPtrs.pInHashInitState1 +
pHashDefs->algInfo->stateSize,
state1PadLen);
}
if (state2PadLen > 0) {
LAC_OS_BZERO(pHashBlkPtrs.pInHashInitState2 +
pHashDefs->algInfo->stateSize,
state2PadLen);
}
pPrecompute->state1Size = pHashDefs->qatInfo->state1Length;
pPrecompute->state2Size = pHashDefs->qatInfo->state2Length;
pPrecompute->pState1 = pHashBlkPtrs.pInHashInitState1;
pPrecompute->pState2 = pHashBlkPtrs.pInHashInitState2;
}
void
LacSymQat_HashStatePrefixAadBufferSizeGet(
icp_qat_la_bulk_req_ftr_t *pMsg,
lac_sym_qat_hash_state_buffer_info_t *pHashStateBuf)
{
const icp_qat_fw_auth_cd_ctrl_hdr_t *cd_ctrl;
icp_qat_la_auth_req_params_t *pHashReqParams;
cd_ctrl = (icp_qat_fw_auth_cd_ctrl_hdr_t *)&(pMsg->cd_ctrl);
pHashReqParams =
(icp_qat_la_auth_req_params_t *)(&(pMsg->serv_specif_rqpars));
pHashStateBuf->stateStorageSzQuadWords = LAC_BYTES_TO_QUADWORDS(
sizeof(icp_qat_hw_auth_counter_t) + cd_ctrl->inner_state1_sz);
pHashStateBuf->prefixAadSzQuadWords = pHashReqParams->hash_state_sz;
}
void
LacSymQat_HashStatePrefixAadBufferPopulate(
lac_sym_qat_hash_state_buffer_info_t *pHashStateBuf,
icp_qat_la_bulk_req_ftr_t *pMsg,
Cpa8U *pInnerPrefixAad,
Cpa8U innerPrefixSize,
Cpa8U *pOuterPrefix,
Cpa8U outerPrefixSize)
{
const icp_qat_fw_auth_cd_ctrl_hdr_t *cd_ctrl =
(icp_qat_fw_auth_cd_ctrl_hdr_t *)&(pMsg->cd_ctrl);
icp_qat_la_auth_req_params_t *pHashReqParams =
(icp_qat_la_auth_req_params_t *)(&(pMsg->serv_specif_rqpars));
if (NULL != pInnerPrefixAad) {
Cpa8U *pLocalInnerPrefix =
(Cpa8U *)(pHashStateBuf->pData) +
LAC_QUADWORDS_TO_BYTES(
pHashStateBuf->stateStorageSzQuadWords);
Cpa8U padding =
pHashReqParams->u2.inner_prefix_sz - innerPrefixSize;
memcpy(pLocalInnerPrefix, pInnerPrefixAad, innerPrefixSize);
if (0 < padding) {
LAC_OS_BZERO(pLocalInnerPrefix + innerPrefixSize,
padding);
}
}
if (NULL != pOuterPrefix) {
Cpa8U *pLocalOuterPrefix =
(Cpa8U *)pHashStateBuf->pData +
LAC_QUADWORDS_TO_BYTES(
pHashStateBuf->stateStorageSzQuadWords +
cd_ctrl->outer_prefix_offset);
Cpa8U padding = LAC_QUADWORDS_TO_BYTES(
pHashStateBuf->prefixAadSzQuadWords) -
pHashReqParams->u2.inner_prefix_sz - outerPrefixSize;
memcpy(pLocalOuterPrefix, pOuterPrefix, outerPrefixSize);
if (0 < padding) {
LAC_OS_BZERO(pLocalOuterPrefix + outerPrefixSize,
padding);
}
}
}
inline CpaStatus
LacSymQat_HashRequestParamsPopulate(
icp_qat_fw_la_bulk_req_t *pReq,
Cpa32U authOffsetInBytes,
Cpa32U authLenInBytes,
sal_service_t *pService,
lac_sym_qat_hash_state_buffer_info_t *pHashStateBuf,
Cpa32U packetType,
Cpa32U hashResultSize,
CpaBoolean digestVerify,
Cpa8U *pAuthResult,
CpaCySymHashAlgorithm alg,
void *pHKDFSecret)
{
Cpa64U authResultPhys = 0;
icp_qat_fw_la_auth_req_params_t *pHashReqParams;
pHashReqParams = (icp_qat_fw_la_auth_req_params_t
*)((Cpa8U *)&(pReq->serv_specif_rqpars) +
ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET);
pHashReqParams->auth_off = authOffsetInBytes;
pHashReqParams->auth_len = authLenInBytes;
if (NULL != pHKDFSecret) {
LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL(
(*pService), pHashReqParams->u1.aad_adr, pHKDFSecret);
if (0 == pHashReqParams->u1.aad_adr) {
LAC_LOG_ERROR(
"Unable to get the physical address of the"
" HKDF secret\n");
return CPA_STATUS_FAIL;
}
}
if (NULL != pAuthResult) {
authResultPhys =
LAC_OS_VIRT_TO_PHYS_EXTERNAL((*pService),
(void *)pAuthResult);
if (authResultPhys == 0) {
LAC_LOG_ERROR(
"Unable to get the physical address of the"
" auth result\n");
return CPA_STATUS_FAIL;
}
pHashReqParams->auth_res_addr = authResultPhys;
} else {
pHashReqParams->auth_res_addr = 0;
}
if (CPA_TRUE == digestVerify) {
pHashReqParams->auth_res_sz = (Cpa8U)hashResultSize;
} else {
pHashReqParams->auth_res_sz = 0;
}
if (NULL != pHashStateBuf) {
if ((pHashStateBuf->stateStorageSzQuadWords +
pHashStateBuf->prefixAadSzQuadWords) > 0) {
if ((ICP_QAT_FW_LA_PARTIAL_START == packetType) ||
(ICP_QAT_FW_LA_PARTIAL_NONE == packetType)) {
pHashReqParams->u1.auth_partial_st_prefix =
((pHashStateBuf->pDataPhys) +
LAC_QUADWORDS_TO_BYTES(
pHashStateBuf
->stateStorageSzQuadWords));
} else {
pHashReqParams->u1.auth_partial_st_prefix =
pHashStateBuf->pDataPhys;
}
}
else {
pHashReqParams->u1.auth_partial_st_prefix = 0;
}
if ((ICP_QAT_FW_LA_PARTIAL_MID == packetType) ||
(ICP_QAT_FW_LA_PARTIAL_END == packetType)) {
pHashReqParams->hash_state_sz =
(pHashStateBuf->stateStorageSzQuadWords +
pHashStateBuf->prefixAadSzQuadWords);
}
else {
pHashReqParams->hash_state_sz =
pHashStateBuf->prefixAadSzQuadWords;
}
} else {
pHashReqParams->u1.auth_partial_st_prefix = 0;
pHashReqParams->hash_state_sz = 0;
}
if (CPA_CY_SYM_HASH_AES_GMAC == alg) {
pHashReqParams->hash_state_sz = 0;
pHashReqParams->u1.aad_adr = 0;
}
pHashReqParams->resrvd1 = 0;
return CPA_STATUS_SUCCESS;
}