PeripheralDriver_Flagchip_F.../Src/module_driver_hsm_level1.c

13910 lines
514 KiB
C

/**
* @file Crypto_Level1Api.c
* @version 0.8.0
*
* @brief AUTOSAR Crypto - Low level part of CRY driver.
* @details Hardware security module (HSM) provides several standards based cryptographic
* services and security services.
*
* @addtogroup CRYPTO
* @{
*/
/*==================================================================================================
* PERIPHERAL : CRYPTO,MAILBOX
* PLATFORM : Flagchip FC7300
* AUTOSAR VERSION : 4.6.0
* AUTOSAR REVISION : ASR_REL_R20-11
* SOFTWARE VERSION : 0.8.0
* VENDOR : Flagchip Semiconductors
*
* Copyright 2020-2023 Flagchip Semiconductors Co., Ltd.
* All Rights Reserved.
==================================================================================================*/
/*==================================================================================================
* Revision History:
*
* Version Date Initials CR# Descriptions
* --------- ---------- ------------- ---------- ---------------
* 0.1.0 15/02/2024 QXW0051 N/A CRYPTO Initial Version
* 0.6.0 23/03/2024 QXW0071 N/A Add Support For FC7240
==================================================================================================*/
#include "module_driver_hsm.h"
#include "module_driver_hsm_level1_leveln.h"
/********************************************* Level0 function
* *********************************************************/
HSM_StatusType HSM_TrueRandGetSrc0(HSM_CmdType *pCmd, const HSMCom_TrueRandType *pCfg);
HSM_StatusType HSM_TrueRandGetSrc1(HSM_CmdType *pCmd, const HSMCom_TrueRandType *pCfg);
HSM_StatusType HSM_TrueRandGetSrcXor(HSM_CmdType *pCmd, const HSMCom_TrueRandType *pCfg);
HSM_StatusType HSM_TrueRandGetSrcShiftXor(HSM_CmdType *pCmd, const HSMCom_TrueRandType *pCfg);
HSM_StatusType HSM_TrueRandGet(HSM_CmdType *pCmd, const HSMCom_TrueRandExType *pCfg);
HSM_StatusType HSM_TrueRandGetAny(HSM_CmdType *pCmd, const HSMCom_TrueRandType *pCfg);
HSM_StatusType HSM_Sha(HSM_CmdType *pCmd, const HSMCom_ShaType *pCfg);
HSM_StatusType HSM_FW_ShaEx(HSM_CmdType *pCmd, const HSMCom_ShaExType *pCfg, HSM_BoolType bKeyUseId);
HSM_StatusType HSM_EccVerify(HSM_CmdType *pCmd, const HSMCom_EccVerifyType *pCfg);
HSM_StatusType HSM_EccCalculateEx(HSM_CmdType *pCmd, const HSMCom_EccCalcType *pCfg);
HSM_StatusType HSM_Sm2Decry(HSM_CmdType *pCmd, const HSMCom_Sm2DecryptType *pCfg);
HSM_StatusType HSM_Sm2Verify(HSM_CmdType *pCmd, const HSMCom_Sm2VerifyType *pCfg);
HSM_StatusType HSM_Sm2GenZa(HSM_CmdType *pCmd, const HSMCom_Sm2GenZaType *pCfg);
HSM_StatusType HSM_Sm2GenHash(HSM_CmdType *pCmd, const HSMCom_Sm2GenHashType *pCfg);
HSM_StatusType HSM_Sm4EncryptStart(HSM_CmdType *pCmd,
HSMWrap_Sm4EncryptType *pCtx,
HSMCom_Sm4EncryptType *pDecrypt);
HSM_StatusType HSM_Sm4EncryptUpdate(HSM_CmdType *pCmd, HSMWrap_Sm4EncryptType *pCtx);
HSM_StatusType HSM_Sm4DecryptEx(HSM_CmdType *pCmd, const HSMCom_Sm4DecryptExType *pCfg);
HSM_StatusType HSM_Sm4EncryptExStart(HSM_CmdType *pCmd,
HSMWrap_Sm4EncryptExType *pCtx,
HSMCom_Sm4EncryptExType *pCfg);
HSM_StatusType HSM_Sm4EncryptExUpdate(HSM_CmdType *pCmd, HSMWrap_Sm4EncryptExType *pCtx);
HSM_StatusType HSM_Sm4Decrypt(HSM_CmdType *pCmd, const HSMCom_Sm4DecryptType *pCfg);
HSM_StatusType HSM_EccEasyDecry(HSM_CmdType *pCmd, const HSMCom_EccEasyDecryType *pCfg);
HSM_StatusType HSM_RequestAuthorization(HSM_CmdType *pCmd, const HSMCom_RequestAuthType *pCfg);
HSM_StatusType HSM_LifeCycleTakeEffect(HSM_CmdType *pCmd, HSMCom_LifeCycleTakeEffectType *pCfg);
HSM_StatusType HSM_OemDevEnter(HSM_CmdType *pCmd, const HSMCom_AuthCheckType *pCfg);
HSM_StatusType HSM_OemPdtEnter(HSM_CmdType *pCmd, const HSMCom_AuthCheckType *pCfg);
HSM_StatusType HSM_InFieldEnter(HSM_CmdType *pCmd, const HSMCom_AuthCheckType *pCfg);
HSM_StatusType HSM_CancelJob(HSM_CmdType *pCmd, const HSMCom_CancelJobType *pCfg);
HSM_StatusType HSM_SelfTest(HSM_CmdType *pCmd, volatile HSMCom_SelfTestType *pCfg);
HSM_StatusType HSM_NvrOtpProgram(HSM_CmdType *pCmd, const HSMCom_NvrOtpType *pCfg);
HSM_StatusType HSM_NvrOtpRead(HSM_CmdType *pCmd, const HSMCom_NvrOtpType *pCfg);
HSM_StatusType HSM_UserKeyImport(HSM_CmdType *pCmd, const HSMCom_UserKeyManageType *pCfg);
HSM_StatusType HSM_UserKeyExport(HSM_CmdType *pCmd, const HSMCom_UserKeyManageType *pCfg);
HSM_StatusType HSM_GetKeySpaceStat(HSM_CmdType *pCmd, const HSMCom_KeySpaceStatusType *pCfg);
HSM_StatusType HSM_TidyUpKeySpace(HSM_CmdType *pCmd, const HSMCom_KeySpaceStatusType *pCfg);
HSM_StatusType HSM_UserKeyRevoke(HSM_CmdType *pCmd, const HSMCom_UserKeyManageType *pCfg);
HSM_StatusType HSM_AesEncrypt(HSM_CmdType *pCmd, const HSMCom_AesEncryptType *pCfg);
HSM_StatusType HSM_AesEncryptEx(HSM_CmdType *pCmd, const HSMCom_FlexAesEncryptType *pCfg);
HSM_StatusType HSM_AesDecrypt(HSM_CmdType *pCmd, const HSMCom_AesDecryptType *pCfg);
HSM_StatusType HSM_AesDecryptEx(HSM_CmdType *pCmd, const HSMCom_FlexAesDecryptType *pCfg);
HSM_StatusType HSM_CMac(HSM_CmdType *pCmd, const HSMCom_CMacType *pCfg);
HSM_StatusType HSM_CMacEx(HSM_CmdType *pCmd, const HSMCom_CMacExType *pCfg);
HSM_StatusType HSM_XMac(HSM_CmdType *pCmd, const HSMCom_XMacType *pCfg);
HSM_StatusType HSM_CcmEncry(HSM_CmdType *pCmd, const HSMCom_CcmEncryptType *pCfg);
HSM_StatusType HSM_CcmDecry(HSM_CmdType *pCmd, const HSMCom_CcmDecryptType *pCfg);
HSM_StatusType HSM_GcmEncry(HSM_CmdType *pCmd, const HSMCom_GcmEncryptType *pCfg);
HSM_StatusType HSM_GcmDecry(HSM_CmdType *pCmd, const HSMCom_GcmDecryptType *pCfg);
HSM_StatusType HSM_Md5(HSM_CmdType *pCmd, const HSMCom_Md5Type *pCfg);
HSM_StatusType HSM_FW_Md5Ex(HSM_CmdType *pCmd, const HSMCom_Md5ExType *pCfg, HSM_BoolType bKeyUseId);
HSM_StatusType HSM_Sm3(HSM_CmdType *pCmd, const HSMCom_Sm3Type *pCfg);
HSM_StatusType HSM_FW_Sm3Ex(HSM_CmdType *pCmd, const HSMCom_Sm3ExType *pCfg, HSM_BoolType bKeyUseId);
HSM_StatusType HSM_MonotonicCounterIncrease(HSM_CmdType *pCmd, const HSMCom_MonCountType *pCfg);
HSM_StatusType HSM_MonotonicCounterRead(HSM_CmdType *pCmd, const HSMCom_MonCountType *pCfg);
HSM_StatusType HSM_Rsa(HSM_CmdType *pCmd, const HSMCom_RsaType *pCfg);
HSM_StatusType HSM_BigNumberCalculateEx(HSM_CmdType *pCmd, const HSMCom_BigNumberCalcType *pCfg);
HSM_StatusType HSM_LoadFirmware(HSM_CmdType *pCmd, HSMCom_LoadFirmwareType *pCfg);
HSM_StatusType HSM_FW_ScatterHashInit(HSM_CmdType *pCmd,
const HSMCom_ScatterHashType *pCfg,
HSM_BoolType bKeyUseId,
HSM_DataFormatType eInputFmt);
HSM_StatusType HSM_FW_ScatterHashUpdate(HSM_CmdType *pCmd,
const HSMCom_ScatterHashType *pCfg,
HSM_BoolType bKeyUseId,
HSM_DataFormatType eInputFmt);
HSM_StatusType HSM_FW_ScatterHashFinal(HSM_CmdType *pCmd,
const HSMCom_ScatterHashType *pCfg,
HSM_BoolType bKeyUseId,
HSM_DataFormatType eInputFmt);
HSM_StatusType HSM_FW_EccEncrypt(HSM_CmdType *pCmd, const HSMCom_EccEasyEncryType *pCfg);
HSM_StatusType HSM_FW_UserKeyGenPair(HSM_CmdType *pCmd, const HSMCom_UserKeyManageType *pCfg);
HSM_StatusType HSM_FW_EccSign(HSM_CmdType *pCmd, const HSMCom_EccSignType *pCfg);
HSM_StatusType HSM_FW_Sm2GenKeyPair(HSM_CmdType *pCmd, const HSMCom_Sm2GenKeyPairType *pCfg);
HSM_StatusType HSM_FW_Sm2Encry(HSM_CmdType *pCmd, const HSMCom_Sm2EncryptType *pCfg);
HSM_StatusType HSM_FW_EccEncrypt(HSM_CmdType *pCmd, const HSMCom_EccEasyEncryType *pCfg);
HSM_StatusType HSM_FW_Sm2Sign(HSM_CmdType *pCmd, const HSMCom_Sm2SignType *pCfg);
HSM_StatusType HSM_FW_UserKeyRevoke(HSM_CmdType *pCmd, const HSMCom_UserKeyManageType *pCfg);
HSM_StatusType HSM_FW_ScatterCMacInit(HSM_CmdType *pCmd,
const HSMCom_AesmRawApiType *pCfg,
HSM_DataFormatType eInputFmt,
HSM_DataFormatType eKeyFmt);
HSM_StatusType HSM_FW_ScatterCMacUpdate(HSM_CmdType *pCmd,
const HSMCom_AesmRawApiType *pCfg,
HSM_DataFormatType eInputFmt,
HSM_DataFormatType eKeyFmt);
HSM_StatusType HSM_FW_ScatterCMacFinal(HSM_CmdType *pCmd,
const HSMCom_AesmRawApiType *pCfg,
HSM_DataFormatType eInputFmt,
HSM_DataFormatType eKeyFmt);
HSM_StatusType HSM_FW_RsaSsaPssVerify(HSM_CmdType *pCmd, const HSMCom_RsaSsaPssVerifyType *pCfg);
HSM_StatusType HSM_FW_RsaSsaPkcs1v15Verify(HSM_CmdType *pCmd,
const HSMCom_RsaSsaPkcs1V15VerifyType *pCfg);
HSM_StatusType HSM_FW_UserKeyImportNew(HSM_CmdType *pCmd, const HSMCom_UserKeyManageType *pCfg);
HSM_StatusType HSM_FW_CheckKeyIdExt(HSM_CmdType *pCmd, const HSMCom_UserKeyManageType *pCfg);
HSM_StatusType HSM_FW_CopyKeyExt(HSM_CmdType *pCmd, const HSMCom_UserKeyManageType *pCfg);
HSM_StatusType HSM_FW_BigNumberCalculateEx(HSM_CmdType *pCmd,
const HSMCom_BigNumberCalcExtType *pCfg);
HSM_StatusType HSM_FW_RsaSsaPssSign(HSM_CmdType *pCmd, const HSMCom_RsaSsaPssSignType *pCfg);
HSM_StatusType HSM_FW_RsaSsaPkcs1v15Sign(HSM_CmdType *pCmd,
const HSMCom_RsaSsaPkcs1v15SignType *pCfg);
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
HSM_StatusType HSM_FW_GetKeyIdStatus(HSM_CmdType *pCmd, const HSMCom_UserKeyManageType *pCfg);
#endif
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
#else
HSM_StatusType HSM_UpdateKeyContentOfSpecificKeyId(HSM_CmdType *pCmd,
const HSMCom_UserKeyManageType *pCfg);
#endif
/****************************************** Local function declarations
* ***********************************************/
HSM_StatusType hsm_1B4B_convert_from_idx(HSM_DataFormatType eDstFmt,
void *pDst,
hsm_uint32_t u32DstStartIdx,
hsm_uint32_t u32DstBufByteSize,
HSM_DataFormatType eSrcFmt,
const void *pSrc,
hsm_uint32_t u32SrcStartIdx,
hsm_uint32_t u32SrcStopIdx);
void hsm_bidi_memcpy(void *pDstMem,
const void *pSrcMem,
hsm_uint32_t u32OpCnt,
hsm_int32_t sOpDirection);
void hsm_memcpy(void *pDstMem, const void *pSrcMem, hsm_uint32_t u32Cnt);
void hsm_memset(void *pDstMem, hsm_uint8_t u8Val, hsm_uint32_t u32Cnt);
hsm_int32_t hsm_memcmp(const void *pDst, const void *pSrc, hsm_uint32_t u32OpCnt);
HSM_StatusType hsm_hash_get_result_byte_count(HFAM_MODE_E eMode, hsm_uint32_t *pRetByteCnt);
void hsm_u32_array_swap(hsm_uint32_t *pData, hsm_uint32_t u32WordCnt);
void hsm_u32_array_swap_to(hsm_uint32_t *pData, const hsm_uint32_t *pSrc, hsm_uint32_t u32WordCnt);
void hsm_rm_prefix_zeros(HSM_DataFormatType eInputFmt,
const hsm_uint8_t *pData,
hsm_uint32_t u32ByteCount,
const hsm_uint8_t **ppActualData,
hsm_uint32_t *pActualByteCnt);
void hsm_core_swap_u32_array_pad(hsm_uint32_t *pAlignedDest,
hsm_uint32_t u32DestWordCnt,
const hsm_uint8_t *pSrc,
hsm_uint32_t u32SrcOpByteCnt,
hsm_uint8_t u8PadByte,
HSM_BoolType bPadFromMSB,
HSM_BoolType bSwap);
void HSM_L1_CleanEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_CommonExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Abort(HSM_L1_RtCtxType *pCtx);
void HSM_L1_Init(HSM_L1_RtCtxType *pCtx, HSM_L1_InitParmType *pParm);
HSM_StatusType HSM_L1_Md5SetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Md5Reset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Md5ExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Md5(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_Md5Type *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_Md5_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Md5Poll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm3SetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm3Reset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm3ExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm3(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_Sm3Type *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_Sm3_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm3Poll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ShaSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ShaReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ShaExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sha(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_ShaType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_Sha_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ShaPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RngSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RngReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RngExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Rng(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RngType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_Rng_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RngPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccVerifySetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32BitCnt);
HSM_StatusType HSM_L1_EccVerifyExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccVerify(HSM_L1_RtCtxType *pCtx,
const HSM_L1_EccVerifyType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_EccVerify_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccVerifyPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccVerifyReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccDecryptSetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32BitCnt);
HSM_StatusType HSM_L1_EccDecryptExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccDecrypt(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_EccDecryptType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_EccDecrypt_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccDecryptPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccDecryptReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccCalculateSetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32BitCnt);
HSM_StatusType HSM_L1_EccCalculateExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccCalculateKP(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_EccKPType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_EccCalculate_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccCalculatePoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccCalculateReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_CMacSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_CMacReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_CMacExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_CMac(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_CMacType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_CMac_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_CMacPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_AesEncryptSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_AesEncryptReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_AesEncryptExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_AesEncrypt(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_AesEncryptType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_AesEncrypt_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_AesEncryptPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_AesDecryptSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_AesDecryptReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_AesDecryptExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_AesDecrypt(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_AesDecryptType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_AesDecrypt_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_AesDecryptPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm4EncryptSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm4EncryptReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm4EncryptExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm4Encrypt(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_Sm4EncryptType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_Sm4Encrypt_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm4EncryptPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm4DecryptSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm4DecryptReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm4DecryptExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm4Decrypt(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_Sm4DecryptType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_Sm4Decrypt_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm4DecryptPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_BnCalcSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_BnCalcExitEnv(HSM_L1_RtCtxType *pCtx);
hsm_uint32_t hsm_pkam_get_actual_size(HSM_DataFormatType eDataFormat,
const void *pData,
hsm_uint32_t u32ByteCount,
const hsm_uint8_t **ppLastNonZero);
HSM_StatusType hsm_pkam_get_bn_bit_count(HSM_DataFormatType eFmt,
const hsm_uint8_t *pData,
hsm_uint32_t u32ByteCnt,
hsm_uint32_t *pBitCnt);
HSM_StatusType HSM_L1_BnCalc(HSM_L1_RtCtxType *pCtx,
const HSM_L1_BnCalcType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_BnCalc_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_BnCalcPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_BnCalcReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ScatterHashSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ScatterHashSetMacCfg(HSM_L1_RtCtxType *pCtx, HSM_Ln_HashMacCfgType *ptCfg);
HSM_StatusType HSM_L1_ScatterHashInit(HSM_L1_RtCtxType *pCtx,
const HSM_ShaAlgType eAlg,
const HSM_Ln_ScatterHashType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_ScatterHashUpdate(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_ScatterHashType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType hsm_aux_get_empty_data_hash(HSM_ShaAlgType eHash,
const hsm_uint8_t **ppHashData,
hsm_uint32_t *pByteCnt);
HSM_StatusType HSM_L1_ScatterHashFinal(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_ScatterHashType *pCfg,
const HSM_Ln_ResultBufInfoType *pResult,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_ScatterHash_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ScatterHashPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ScatterHashExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ScatterCMacSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ScatterCMacInit(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_CMacCfgParmsType *pKeyCfg,
const HSM_Ln_ScatterCMacType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_ScatterCMacUpdate(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_ScatterCMacType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_ScatterCMacFinal(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_ScatterCMacType *pCfg,
const HSM_Ln_ResultBufInfoType *pResult,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_ScatterCMac_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ScatterCMacPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_ScatterCMacExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccSignSetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32BitCnt);
HSM_StatusType HSM_L1_EccSignExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccSign(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_EccSignType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_EccSign_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccSignPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_EccSignReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPssVerifySetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32RsaBitCnt);
HSM_StatusType HSM_L1_RsaSsaPssVerify(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPssVerifyType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_RsaSsaPssVerifyPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPssVerifyReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPssVerify_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPssVerifyExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15VerifySetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32RsaBitCnt);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15Verify(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPkcs1v15VerifyType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15VerifyPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15VerifyReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15Verify_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15VerifyExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyImportSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyImport(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_ImportUserKeyExtType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_KeyImportPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyImportReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyImportExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyImport_Isr(HSM_L1_RtCtxType *pCtx);
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
HSM_StatusType HSM_L1_KeyValidateSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyValidate(HSM_L1_RtCtxType *pCtx,
hsm_uint32_t u32KeyId,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_KeyValidatePoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyValidateReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyValidateExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyValidate_Isr(HSM_L1_RtCtxType *pCtx);
#endif
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
#else
HSM_StatusType HSM_L1_UpdateKeyIdContentSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_UpdateKeyIdContent(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_KeyManagerUpdateUserKeyType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_UpdateKeyIdContentPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_UpdateKeyIdContentReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_UpdateKeyIdContentExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_UpdateKeyIdContent_Isr(HSM_L1_RtCtxType *pCtx);
#endif
HSM_StatusType HSM_L1_KeyCopySetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyCopy(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_CopyUserKeyType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_KeyCopyPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyCopyReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyCopyExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyCopy_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyRevokeSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyRevoke(HSM_L1_RtCtxType *pCtx,
hsm_uint32_t u32KeyId,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_KeyRevokePoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyRevokeReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyRevokeExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeyRevoke_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeySpaceTidyUpSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeySpaceTidyUp(HSM_L1_RtCtxType *pCtx,
HSM_Ln_KeySpaceStatusType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_KeySpaceTidyUpPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeySpaceTidyUpReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeySpaceTidyUpExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeySpaceTidyup_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeySpaceGetStatusSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeySpaceGetStatus(HSM_L1_RtCtxType *pCtx,
HSM_Ln_KeySpaceStatusType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_KeySpaceGetStatusPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeySpaceGetStatusReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeySpaceGetStatusExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_KeySpaceGetStatus_Isr(HSM_L1_RtCtxType *pCtx);
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
HSM_StatusType HSM_L1_GetKeyIdStatusSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_GetKeyIdStatus(HSM_L1_RtCtxType *pCtx,
hsm_uint32_t u32KeyId,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_GetKeyIdStatusPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_GetKeyIdStatusReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_GetKeyIdStatusExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_GetKeyIdStatus_Isr(HSM_L1_RtCtxType *pCtx);
#endif
HSM_StatusType HSM_L1_LoadFirmwareSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_LoadFirmware(HSM_L1_RtCtxType *pCtx, uint32 u32TimeoutMs);
HSM_StatusType HSM_L1_LoadFirmwarePoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_LoadFirmwareReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_LoadFirmwareExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_LoadFirmware_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignHash(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPkcs1V15SignHashType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignData(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPkcs1V15SignDataType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPkcs1V15Sign_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPssSignSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPssSignData(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPssSignDataType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_RsaSsaPssSignHash(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPssSignHashType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_RsaSsaPssSignPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPssSignReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPssSignExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_RsaSsaPssSign_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm2GenZaSetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm2GenZaExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm2GenZa(HSM_L1_RtCtxType *pCtx,
const HSM_LN_Sm2GenZaType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_Sm2GenZa_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm2GenZaPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm2GenZaReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm2VerifySetupEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm2VerifyExitEnv(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm2Verify(HSM_L1_RtCtxType *pCtx,
const HSM_L1_Sm2VerifyType *pCfg,
hsm_uint32_t u32TimeoutMs);
HSM_StatusType HSM_L1_Sm2Verify_Isr(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm2VerifyPoll(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_Sm2VerifyReset(HSM_L1_RtCtxType *pCtx);
HSM_StatusType HSM_L1_PKCS1_GetRsaPrivateKeyInfFromDer(const hsm_uint8_t *pDer,
HSM_L1_PKCS_RsaPrivateKeyInfType *pInf);
HSM_StatusType HSM_L1_PKCS1_GetEccPrivateKeyInfFromDer(const hsm_uint8_t *pDer,
HSM_L1_PKCS_EccPrivateKeyInfType *pInf);
HSM_StatusType HSM_L1_PKCS8_GetPrivateKeyInfFromDer(const hsm_uint8_t *pDer,
HSM_L1_PKCS8_PrivateKeyInfType *pInf);
HSM_StatusType HSM_L1_PKCS1_GetRsaPublicKeyInfFromDer(const hsm_uint8_t *pDer,
HSM_L1_PKCS_RsaPublicKeyInfType *pInf);
HSM_StatusType hsm_l1_subjectpublicinfo_bitstring_geteccpublickeyinf(
const hsm_uint8_t *pDer,
HSM_L1_PKCS_EccPublicKeyInfType *pInf);
HSM_StatusType HSM_L1_SubjectPublicInfo_GetPublicKeyInfFromDer(const hsm_uint8_t *pDer,
HSM_L1_PublicKeyInfType *pInf);
HSM_StatusType HSM_L1_GetPoll(HSM_L1_RtCtxType *pCtx);
void HSM_L1_Ack_IrqHandler(void *pUpperCtx, HSM_StatusType eRet);
static HSM_StatusType hsm_l1_scatter_hash_init(HSM_L1_RtCtxType *pCtx, HSM_DataFormatType eInputFmt);
static HSM_StatusType hsm_l1_scatter_hash_update(HSM_L1_RtCtxType *pCtx,
HSM_DataFormatType eInputFmt);
static HSM_StatusType hsm_l1_scatter_hash_final(HSM_L1_RtCtxType *pCtx, HSM_DataFormatType eInputFmt);
static HSM_StatusType hsm_l1_scatter_hash_init2final(HSM_L1_RtCtxType *pCtx,
HSMCom_ShaExType *pShaParm);
static HSM_StatusType hsm_l1_scatter_cmac_init(HSM_L1_RtCtxType *pCtx,
HSM_DataFormatType eInputFmt,
HSM_DataFormatType eKeyFmt);
static HSM_StatusType hsm_l1_scatter_cmac_update(HSM_L1_RtCtxType *pCtx,
HSM_DataFormatType eInputFmt,
HSM_DataFormatType eKeyFmt);
static HSM_StatusType hsm_l1_scatter_cmac_final(HSM_L1_RtCtxType *pCtx,
HSM_DataFormatType eInputFmt,
HSM_DataFormatType eKeyFmt);
static HSM_StatusType hsm_l1_scatter_cmac_init2final(HSM_L1_RtCtxType *pCtx,
HSMCom_CMacExType *pParm);
/********************************************* Global function
* *********************************************************/
HSM_StatusType hsm_1B4B_convert_from_idx(HSM_DataFormatType eDstFmt,
void *pDst,
hsm_uint32_t u32DstStartIdx,
hsm_uint32_t u32DstBufByteSize,
HSM_DataFormatType eSrcFmt,
const void *pSrc,
hsm_uint32_t u32SrcStartIdx,
hsm_uint32_t u32SrcStopIdx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
hsm_uint32_t u32Idx, u32Idx2;
if ((u32SrcStopIdx - u32SrcStartIdx) <= (u32DstBufByteSize - u32DstStartIdx))
{
if (HSM_DATA_FORMAT_4B == eDstFmt)
{
if (HSM_DATA_FORMAT_4B == eSrcFmt)
{
for (u32Idx = u32SrcStartIdx, u32Idx2 = u32DstStartIdx; u32Idx < u32SrcStopIdx;
++u32Idx, ++u32Idx2)
{
*(((hsm_uint8_t *)pDst) + HSM_4B_BYTE_INDEX_TO_OFFSET(u32Idx2)) = *(
((hsm_uint8_t *)pSrc) + HSM_4B_BYTE_INDEX_TO_OFFSET(u32Idx));
}
}
else
{
for (u32Idx = u32SrcStartIdx, u32Idx2 = u32DstStartIdx; u32Idx < u32SrcStopIdx;
++u32Idx, ++u32Idx2)
{
*(((hsm_uint8_t *)pDst) +
HSM_4B_BYTE_INDEX_TO_OFFSET(u32Idx2)) = *(((hsm_uint8_t *)pSrc) + (u32Idx));
}
}
}
else
{
if (HSM_DATA_FORMAT_4B == eSrcFmt)
{
for (u32Idx = u32SrcStartIdx, u32Idx2 = u32DstStartIdx; u32Idx < u32SrcStopIdx;
++u32Idx, ++u32Idx2)
{
*(((hsm_uint8_t *)pDst) + (u32Idx2)) = *(((hsm_uint8_t *)pSrc) +
HSM_4B_BYTE_INDEX_TO_OFFSET(u32Idx));
}
}
else
{
for (u32Idx = u32SrcStartIdx, u32Idx2 = u32DstStartIdx; u32Idx < u32SrcStopIdx;
++u32Idx, ++u32Idx2)
{
*(((hsm_uint8_t *)pDst) + (u32Idx2)) = *(((hsm_uint8_t *)pSrc) + (u32Idx));
}
}
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
void hsm_bidi_memcpy(void *pDstMem, const void *pSrcMem, hsm_uint32_t u32OpCnt, hsm_int32_t sOpDirection)
{
hsm_uint8_t *pDstByte = pDstMem;
const hsm_uint8_t *pSrcByte = pSrcMem;
hsm_int32_t sDirection = sOpDirection;
hsm_uint32_t u32Cnt = u32OpCnt;
if ((pSrcMem != pDstMem) && (u32Cnt > 0))
{
if (sDirection >= 0)
{
if (((hsm_uint32_t)pDstMem) > ((hsm_uint32_t)pSrcMem)) /* for safe */
{
pDstByte += u32Cnt;
pSrcByte += u32Cnt;
pDstByte -= 1;
pSrcByte -= 1;
sDirection = -1;
}
else
{
sDirection = 1;
}
}
else
{
if (((hsm_uint32_t)pDstMem) < ((hsm_uint32_t)pSrcMem)) /* for safe */
{
pDstByte -= u32Cnt;
pSrcByte -= u32Cnt;
pDstByte += 1;
pSrcByte += 1;
sDirection = 1;
}
else
{
sDirection = -1;
}
}
while (u32Cnt > 0u)
{
*pDstByte = *pSrcByte;
pDstByte += sDirection;
pSrcByte += sDirection;
u32Cnt--;
}
}
else
{
; /* nothing to do */
}
}
void hsm_memcpy(void *pDstMem, const void *pSrcMem, hsm_uint32_t u32Cnt)
{
hsm_bidi_memcpy(pDstMem, pSrcMem, u32Cnt, 1U);
}
void hsm_memset(void *pDstMem, hsm_uint8_t u8Val, hsm_uint32_t u32Cnt)
{
hsm_uint8_t *pData = (hsm_uint8_t *)pDstMem;
hsm_uint32_t u32Idx;
for (u32Idx = 0; u32Idx < u32Cnt; ++u32Idx)
{
pData[u32Idx] = u8Val;
}
}
hsm_int32_t hsm_memcmp(const void *pDst, const void *pSrc, hsm_uint32_t u32OpCnt)
{
const hsm_uint8_t *pByteData1 = (const hsm_uint8_t *)pDst;
const hsm_uint8_t *pByteData2 = (const hsm_uint8_t *)pSrc;
hsm_int32_t sRet, sData1, sData2;
hsm_uint32_t u32Cnt = u32OpCnt;
sRet = 0;
while (u32Cnt > 0u)
{
sData1 = (hsm_int32_t)(*pByteData1);
sData2 = (hsm_int32_t)(*pByteData2);
sRet = sData1 - sData2;
if (0u != sRet)
{
break;
}
u32Cnt--;
pByteData1++;
pByteData2++;
}
return sRet;
}
HSM_StatusType hsm_hash_get_result_byte_count(HFAM_MODE_E eMode, hsm_uint32_t *pRetByteCnt)
{
hsm_uint32_t u32ByteCnt;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
switch (eMode)
{
case HFA_MD5:
u32ByteCnt = 16u; /* 16 */
break;
case HFA_SHA160:
u32ByteCnt = 160 / 8; /* 20 */
break;
case HFA_SHA224:
u32ByteCnt = 224 / 8; /* 28 */
break;
case HFA_SHA256:
u32ByteCnt = 256 / 8; /* 32 */
break;
case HFA_SHA384:
u32ByteCnt = 384 / 8; /* 48 */
break;
case HFA_SHA512:
u32ByteCnt = 512 / 8; /* 64 */
break;
case HFA_SHA512_224:
u32ByteCnt = 224 / 8; /* 28 */
break;
case HFA_SHA512_256:
u32ByteCnt = 256 / 8; /* 32 */
break;
case HFA_SM3:
u32ByteCnt = 32u; /* 32 */
break;
default:
u32ByteCnt = 0;
eRet = HSM_STATUS_PARAM_ERR;
break;
}
if (NULL_PTR != pRetByteCnt)
{
*pRetByteCnt = u32ByteCnt;
}
return eRet;
}
void hsm_u32_array_swap(hsm_uint32_t *pData, hsm_uint32_t u32WordCnt)
{
hsm_uint32_t u32Idx;
for (u32Idx = 0u; u32Idx < u32WordCnt; ++u32Idx)
{
pData[u32Idx] = hsm_hw_swap_u32(pData[u32Idx]);
}
}
void hsm_u32_array_swap_to(hsm_uint32_t *pData, const hsm_uint32_t *pSrc, hsm_uint32_t u32WordCnt)
{
hsm_uint32_t u32Idx;
for (u32Idx = 0u; u32Idx < u32WordCnt; ++u32Idx)
{
pData[u32Idx] = hsm_hw_swap_u32(pSrc[u32Idx]);
}
}
void hsm_rm_prefix_zeros(HSM_DataFormatType eInputFmt,
const hsm_uint8_t *pData,
hsm_uint32_t u32ByteCount,
const hsm_uint8_t **ppActualData,
hsm_uint32_t *pActualByteCnt)
{
const hsm_uint8_t *pInter = (const hsm_uint8_t *)pData;
const hsm_uint32_t *pInterU32 = (const hsm_uint32_t *)pData;
hsm_uint32_t u32DataCount = u32ByteCount;
if (HSM_DATA_FORMAT_1B == eInputFmt)
{
while ((0u == *pInter) && (u32DataCount > 0u))
{
pInter++;
u32DataCount--;
}
}
else
{
if (0x3u == (((hsm_uint32_t)pData) & 0x3u))
{
while ((u32DataCount >= 4u) && (0u == pInter[0]) && (0u == pInter[1]) &&
(0u == pInter[2]) && (0u == pInter[3]))
{
pInter += 4u;
u32DataCount -= 4u;
}
}
else
{
while ((0u == *pInterU32) && (u32DataCount >= 4u))
{
pInterU32++;
u32DataCount -= 4U;
}
}
pInter = (const hsm_uint8_t *)pInterU32;
}
if (NULL_PTR != ppActualData)
{
*ppActualData = pInter;
}
/* else do nothing */
if (NULL_PTR != pActualByteCnt)
{
*pActualByteCnt = u32DataCount;
}
/* else do nothing */
}
void hsm_core_swap_u32_array_pad(hsm_uint32_t *pAlignedDest,
hsm_uint32_t u32DestWordCnt,
const hsm_uint8_t *pSrc,
hsm_uint32_t u32SrcOpByteCnt,
hsm_uint8_t u8PadByte,
HSM_BoolType bPadFromMSB,
HSM_BoolType bSwap)
{
hsm_uint32_t u32Idx = 0;
hsm_uint32_t u32Temp;
hsm_uint32_t u32Data;
hsm_uint32_t u32DestIdx;
const hsm_uint32_t *pSrcWord = (const hsm_uint32_t *)pSrc;
hsm_uint32_t u32SrcByteCnt = u32SrcOpByteCnt;
if ((u32DestWordCnt << 2u) < u32SrcByteCnt)
{
u32SrcByteCnt = (u32DestWordCnt << 2u);
}
u32Temp = u32SrcByteCnt >> 2u;
if (0u == (((hsm_uint32_t)pSrc) & 0x3u))
{
if (HSM_FALSE != bSwap)
{
for (; u32Idx < u32Temp; ++u32Idx)
{
pAlignedDest[u32Idx] = hsm_hw_swap_u32(pSrcWord[u32Idx]);
}
}
else
{
for (; u32Idx < u32Temp; ++u32Idx)
{
pAlignedDest[u32Idx] = pSrcWord[u32Idx];
}
}
}
else
{
if (HSM_FALSE != bSwap)
{
for (; u32Idx < u32Temp; ++u32Idx)
{
u32DestIdx = (hsm_uint32_t)pSrc + (u32Idx * 4);
u32Data = *((hsm_uint8_t *)u32DestIdx + 3);
u32Data = (u32Data << 8u) | (*((hsm_uint8_t *)u32DestIdx + 2));
u32Data = (u32Data << 8u) | (*((hsm_uint8_t *)u32DestIdx + 1));
u32Data = (u32Data << 8u) | (*((hsm_uint8_t *)u32DestIdx + 0));
pAlignedDest[u32Idx] = hsm_hw_swap_u32(u32Data);
}
}
else
{
for (; u32Idx < u32Temp; ++u32Idx)
{
u32DestIdx = (hsm_uint32_t)pSrc + (u32Idx * 4);
u32Data = *((hsm_uint8_t *)u32DestIdx + 3);
u32Data = (u32Data << 8u) | (*((hsm_uint8_t *)u32DestIdx + 2));
u32Data = (u32Data << 8u) | (*((hsm_uint8_t *)u32DestIdx + 1));
u32Data = (u32Data << 8u) | (*((hsm_uint8_t *)u32DestIdx + 0));
pAlignedDest[u32Idx] = (u32Data);
}
}
}
u32DestIdx = u32Idx;
u32Temp = (u32SrcByteCnt % 4u);
if (0u != u32Temp)
{
u32Temp = 4u - u32Temp;
if (0u == (((hsm_uint32_t)pSrcWord) & 0x3u))
{
u32Data = pSrcWord[u32Idx];
}
else
{
u32SrcByteCnt = (hsm_uint32_t)pSrc + (u32Idx * 4);
u32Data = *((hsm_uint8_t *)u32SrcByteCnt + 3);
u32Data = (u32Data << 8u) | (*((hsm_uint8_t *)u32SrcByteCnt + 2));
u32Data = (u32Data << 8u) | (*((hsm_uint8_t *)u32SrcByteCnt + 1));
u32Data = (u32Data << 8u) | (*((hsm_uint8_t *)u32SrcByteCnt + 0));
}
if (HSM_FALSE != bPadFromMSB)
{
u32Data = u32Data << (u32Temp * 8u);
for (u32Idx = 0; u32Idx < u32Temp; ++u32Idx)
{
u32Data = (u32Data >> 8u) | (((hsm_uint32_t)u8PadByte) << 24u);
}
}
else
{
u32Data = u32Data >> (u32Temp * 8u);
for (u32Idx = 0; u32Idx < u32Temp; ++u32Idx)
{
u32Data = (u32Data << 8u) | (((hsm_uint32_t)u8PadByte));
}
}
if (HSM_FALSE != bSwap)
{
pAlignedDest[u32DestIdx] = hsm_hw_swap_u32(u32Data);
}
else
{
pAlignedDest[u32DestIdx] = (u32Data);
}
u32DestIdx++;
}
hsm_memset(pAlignedDest + u32DestIdx, u8PadByte, (u32DestWordCnt << 2u) - (u32DestIdx << 2u));
}
void HSM_L1_CleanEnv(HSM_L1_RtCtxType *pCtx)
{
pCtx->eLastestHsmRet = HSM_STATUS_IDLE;
pCtx->bInProcess = HSM_FALSE;
pCtx->eOperationCata = HSM_OP_NONE;
}
HSM_StatusType HSM_L1_CommonExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_L1_DrvSMType eState = pCtx->eStat;
HSM_L1_CleanEnv(pCtx);
if (HSM_TRUE == bInProcess)
{
if (HSM_DRV_SM_ARITH == eState)
{
eRet = pCtx->pCancelCmdCb();
}
}
return eRet;
}
/* abort current operation, the operation will goto None */
HSM_StatusType HSM_L1_Abort(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_L1_DrvSMType eState = pCtx->eStat;
HSM_L1_CleanEnv(pCtx);
if (HSM_TRUE == bInProcess)
{
if (HSM_DRV_SM_ARITH == eState)
{
eRet = pCtx->pCancelCmdCb();
}
}
return eRet;
}
void HSM_L1_Init(HSM_L1_RtCtxType *pCtx, HSM_L1_InitParmType *pParm)
{
pCtx->eTriggerSrc = pParm->eTriggerSrc;
pCtx->pStopCb = pParm->pStopCb;
pCtx->pSendCmdCb = pParm->pSendCmdCb;
pCtx->pReadAckCb = pParm->pReadAckCb;
pCtx->pCancelCmdCb = pParm->pCancelCmdCb;
pCtx->pCleanDCache = pParm->pCleanDCache;
pCtx->pCleanAndFlushDcache = pParm->pCleanAndFlushDcache;
HSM_L1_CleanEnv(pCtx);
}
#if 0
/*
* IF use key id of RSA E/D/N, the key data in key space of HSM side,
* only support 4B format,
* and the N size must 8bytes aligned,
* the D/E size should equal to N size.
* So use HSM_L1_BnCalc instead.
*/
HSM_StatusType HSM_L1_RsaSetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32RsaBitCnt)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((u32RsaBitCnt <= 4096u) && (u32RsaBitCnt >= 1u))
{
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_RSA;
pCtx->tL1AlgCtx.tRsaInf.u32NBitCnt = u32RsaBitCnt;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tRsaInf.pRsaParm = (HSMCom_RsaType *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaParmBuf[0]));
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.pInputData = (const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaInputAndResult[0]));
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.pKey_E = (const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaE[0]));
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.pKey_N = (const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaN[0]));
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.pResult = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaInputAndResult[0]));
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.u32ResultBufByteCnt = sizeof(pCtx->tL1AlgCtx.tRsaInf.aRsaInputAndResult) - 4;
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) &&
(HSM_OP_RSA == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
/* For interrupt usage */
HSM_StatusType HSM_L1_Rsa(HSM_L1_RtCtxType *pCtx, const HSM_L1_RsaType *pCfg, hsm_uint32_t u32TimeoutMs)
{
hsm_uint32_t u32NByteCnt;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
const hsm_uint8_t *pStart;
hsm_uint32_t u32ActualSize;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) &&
(HSM_OP_RSA == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
u32NByteCnt = ((pCtx->tL1AlgCtx.tRsaInf.u32NBitCnt + 63u) / 64u) * 8u;
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->u32RsaBitCnt = pCtx->tL1AlgCtx.tRsaInf.u32NBitCnt;
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.u32InputDataByteCount = u32NByteCnt;
hsm_rm_prefix_zeros(pCfg->eInputDataFmt, pCfg->pInputData, pCfg->u32InputDataByteCount, &pStart, &u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaInputAndResult[0])), 0, u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaInputAndResult[0]))) + (u32NByteCnt - u32ActualSize), pStart, u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eInputDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaInputAndResult[0])), u32NByteCnt / 4U);
}
else
{
;
}
if (pCfg->u32KeyEId)
{
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->u32UserKeyID_KEY_E = pCfg->u32KeyEId;
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.u32Key_E_ByteCount = pCfg->u32KeyEByteCount;
}
else
{
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.u32Key_E_ByteCount = u32NByteCnt;
hsm_rm_prefix_zeros(pCfg->eKeyEFmt, pCfg->pKeyE, pCfg->u32KeyEByteCount, &pStart, &u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaE[0])), 0, u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaE[0]))) + (u32NByteCnt - u32ActualSize), pStart, u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eKeyEFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaE[0])), u32NByteCnt / 4U);
}
else
{
;
}
}
if (pCfg->u32KeyNId)
{
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->u32UserKeyID_KEY_N = pCfg->u32KeyNId;
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.u32Key_N_ByteCount = pCfg->u32KeyNByteCount;
}
else
{
pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.u32Key_N_ByteCount = u32NByteCnt;
hsm_rm_prefix_zeros(pCfg->eKeyNFmt, pCfg->pKeyN, pCfg->u32KeyNByteCount, &pStart, &u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaN[0])), 0, u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaN[0]))) + (u32NByteCnt - u32ActualSize), pStart, u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eKeyNFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaN[0])), u32NByteCnt / 4U);
}
else
{
;
}
}
pCtx->tL1AlgCtx.tRsaInf.pResultBuf = pCfg->pResult;
pCtx->tL1AlgCtx.tRsaInf.u32ResultBufSize = pCfg->u32ResultBufByteCnt;
pCtx->tL1AlgCtx.tRsaInf.pResultByteCnt = pCfg->pResultByteCnt;
pCtx->tL1AlgCtx.tRsaInf.eOutFmt = pCfg->eOutputFmt;
eRet = HSM_Rsa(&(pCtx->tCmd), pCtx->tL1AlgCtx.tRsaInf.pRsaParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Rsa_Isr(HSM_L1_RtCtxType *pCtx)
{
const hsm_uint8_t *pStart;
hsm_uint32_t u32ActualSize;
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tRsaInf.pRsaParm->u32HSMStatusRet)
{
if (HSM_DATA_FORMAT_1B == pCtx->tL1AlgCtx.tRsaInf.eOutFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaInputAndResult[0])), pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.u32Key_N_ByteCount / 4U);
hsm_rm_prefix_zeros(HSM_DATA_FORMAT_1B, (const hsm_uint8_t *)pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.pResult, pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.u32Key_N_ByteCount, &pStart,
&u32ActualSize);
if (u32ActualSize > pCtx->tL1AlgCtx.tRsaInf.u32ResultBufSize)
{
eRet = HSM_STATUS_BUFFER_SIZE_ERR;
}
else
{
hsm_memcpy(pCtx->tL1AlgCtx.tRsaInf.pResultBuf, pStart, u32ActualSize);
if (NULL_PTR != pCtx->tL1AlgCtx.tRsaInf.pResultByteCnt)
{
*pCtx->tL1AlgCtx.tRsaInf.pResultByteCnt = u32ActualSize;
}
eRet = HSM_STATUS_SUCCESS;
}
}
else if (HSM_DATA_FORMAT_1B_PAD_0_LEFT_FIT_BUF == pCtx->tL1AlgCtx.tRsaInf.eOutFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaInf.aRsaInputAndResult[0])), pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.u32Key_N_ByteCount / 4U);
hsm_rm_prefix_zeros(HSM_DATA_FORMAT_1B, (const hsm_uint8_t *)pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.pResult, pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.u32Key_N_ByteCount, &pStart,
&u32ActualSize);
if (u32ActualSize > pCtx->tL1AlgCtx.tRsaInf.u32ResultBufSize)
{
eRet = HSM_STATUS_BUFFER_SIZE_ERR;
}
else
{
hsm_memset(pCtx->tL1AlgCtx.tRsaInf.pResultBuf, 0, pCtx->tL1AlgCtx.tRsaInf.u32ResultBufSize - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)pCtx->tL1AlgCtx.tRsaInf.pResultBuf) + (pCtx->tL1AlgCtx.tRsaInf.u32ResultBufSize - u32ActualSize), pStart, u32ActualSize);
if (NULL_PTR != pCtx->tL1AlgCtx.tRsaInf.pResultByteCnt)
{
*pCtx->tL1AlgCtx.tRsaInf.pResultByteCnt = pCtx->tL1AlgCtx.tRsaInf.u32ResultBufSize;
}
eRet = HSM_STATUS_SUCCESS;
}
}
else
{
hsm_rm_prefix_zeros(HSM_DATA_FORMAT_4B, (const hsm_uint8_t *)pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.pResult, pCtx->tL1AlgCtx.tRsaInf.pRsaParm->tCfg.u32Key_N_ByteCount, &pStart,
&u32ActualSize);
if (u32ActualSize > pCtx->tL1AlgCtx.tRsaInf.u32ResultBufSize)
{
eRet = HSM_STATUS_BUFFER_SIZE_ERR;
}
else
{
hsm_memcpy(pCtx->tL1AlgCtx.tRsaInf.pResultBuf, pStart, u32ActualSize);
*pCtx->tL1AlgCtx.tRsaInf.pResultByteCnt = u32ActualSize;
eRet = HSM_STATUS_SUCCESS;
}
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) &&
(HSM_OP_RSA == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_Rsa_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) &&
(HSM_OP_RSA == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
#endif
HSM_StatusType HSM_L1_Md5SetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_MD5;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tMd5Inf.pParm = (HSMCom_Md5ExType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tMd5Inf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Md5Reset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_MD5 == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Md5ExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_MD5 == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Md5(HSM_L1_RtCtxType *pCtx, const HSM_Ln_Md5Type *pCfg, hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) && (NULL_PTR != pCfg->pResult) &&
(pCfg->u32ResultBufSize > 0) &&
((HSM_DATA_FORMAT_1B == pCfg->eOutputFmt) ||
((pCfg->u32ResultBufSize >= 4u) &&
(0u == (pCfg->u32ResultBufSize & 0x3))))) /* not check the input address 4byte aligned
here for eco support this */
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_MD5 == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tMd5Inf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tMd5Inf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tMd5Inf.pResultBuf = pCfg->pResult;
if (pCfg->u32ResultBufSize > 16u)
{
pCtx->tL1AlgCtx.tMd5Inf.u32ResultBufSize = 16u;
}
else
{
pCtx->tL1AlgCtx.tMd5Inf.u32ResultBufSize = pCfg->u32ResultBufSize;
;
}
pCtx->tL1AlgCtx.tMd5Inf.pOutResultSize = pCfg->pResultSize;
hsm_memcpy(&(pCtx->tL1AlgCtx.tMd5Inf.pParm->tCfg.tCfg),
&(pCfg->tCfg),
sizeof(HSM_Md5CtxType));
pCtx->tL1AlgCtx.tMd5Inf.pParm->tCfg.pRet = (hsm_uint32_t(*)[4])HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tMd5Inf.aResultCacheBuf[0]));
pCtx->tL1AlgCtx.tMd5Inf.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
pCtx->tL1AlgCtx.tMd5Inf.pParm->tCfg.eOutputFmt =
HSM_DATA_FORMAT_4B; /* require output 4B format */
if (HSM_DATA_FORMAT_1B == pCfg->eOutputFmt)
{
pCtx->tL1AlgCtx.tMd5Inf.bSwapOut = HSM_TRUE;
}
else
{
pCtx->tL1AlgCtx.tMd5Inf.bSwapOut = HSM_FALSE;
}
eRet = HSM_FW_Md5Ex(&(pCtx->tCmd), pCtx->tL1AlgCtx.tMd5Inf.pParm, pCfg->bKeyUseId);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Md5_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tMd5Inf.pParm->u32HSMStatusRet)
{
if (HSM_TRUE == pCtx->tL1AlgCtx.tMd5Inf.bSwapOut) /* 1B format output */
{
hsm_u32_array_swap(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tMd5Inf.aResultCacheBuf[0])),
16 / 4U); /* md5 has 16bytes result data */
}
else
{
}
hsm_memcpy(pCtx->tL1AlgCtx.tMd5Inf.pResultBuf,
pCtx->tL1AlgCtx.tMd5Inf.pParm->tCfg.pRet,
pCtx->tL1AlgCtx.tMd5Inf.u32ResultBufSize);
if (NULL_PTR != (pCtx->tL1AlgCtx.tMd5Inf.pOutResultSize))
{
hsm_memcpy(pCtx->tL1AlgCtx.tMd5Inf.pOutResultSize,
&(pCtx->tL1AlgCtx.tMd5Inf.u32ResultBufSize),
sizeof(pCtx->tL1AlgCtx.tMd5Inf.u32ResultBufSize));
}
else
{
;
}
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_Md5Poll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_MD5 == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_Md5_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm3SetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_SM3;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tSm3Inf.pParm = (HSMCom_Sm3ExType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tSm3Inf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm3Reset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM3 == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm3ExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM3 == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm3(HSM_L1_RtCtxType *pCtx, const HSM_Ln_Sm3Type *pCfg, hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) && (NULL_PTR != pCfg->pResult) &&
(pCfg->u32ResultBufSize > 0) &&
((HSM_DATA_FORMAT_1B == pCfg->eOutputFmt) ||
((pCfg->u32ResultBufSize >= 4u) &&
(0u == (pCfg->u32ResultBufSize & 0x3))))) /* not check the input address 4byte aligned
here for eco support this */
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM3 == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tSm3Inf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tSm3Inf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tSm3Inf.pResultBuf = pCfg->pResult;
if (pCfg->u32ResultBufSize > 32U)
{
pCtx->tL1AlgCtx.tSm3Inf.u32ResultBufSize = 32u;
}
else
{
pCtx->tL1AlgCtx.tSm3Inf.u32ResultBufSize = pCfg->u32ResultBufSize;
}
pCtx->tL1AlgCtx.tSm3Inf.pOutResultSize = pCfg->pResultSize;
hsm_memcpy(&(pCtx->tL1AlgCtx.tSm3Inf.pParm->tCfg.tCfg),
&(pCfg->tCfg),
sizeof(HSM_Sm3CtxType));
pCtx->tL1AlgCtx.tSm3Inf.pParm->tCfg.pRet = (hsm_uint32_t(*)[8])(hsm_uint32_t(*)[8])
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tSm3Inf.aResultCacheBuf[0]));
pCtx->tL1AlgCtx.tSm3Inf.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
pCtx->tL1AlgCtx.tSm3Inf.pParm->tCfg.eOutputFmt = HSM_DATA_FORMAT_4B;
if (HSM_DATA_FORMAT_1B == pCfg->eOutputFmt)
{
pCtx->tL1AlgCtx.tSm3Inf.bSwapOut = HSM_TRUE;
}
else
{
pCtx->tL1AlgCtx.tSm3Inf.bSwapOut = HSM_FALSE;
}
eRet = HSM_FW_Sm3Ex(&(pCtx->tCmd), pCtx->tL1AlgCtx.tSm3Inf.pParm, pCfg->bKeyUseId);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm3_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tSm3Inf.pParm->u32HSMStatusRet)
{
if (HSM_TRUE == pCtx->tL1AlgCtx.tSm3Inf.bSwapOut)
{
hsm_u32_array_swap(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tSm3Inf.aResultCacheBuf[0])),
32u / 4U); /* sm3 has 32bytes result data */
}
else
{
}
hsm_memcpy(pCtx->tL1AlgCtx.tSm3Inf.pResultBuf,
pCtx->tL1AlgCtx.tSm3Inf.pParm->tCfg.pRet,
pCtx->tL1AlgCtx.tSm3Inf.u32ResultBufSize);
if (NULL_PTR != pCtx->tL1AlgCtx.tSm3Inf.pOutResultSize)
{
hsm_memcpy(pCtx->tL1AlgCtx.tSm3Inf.pOutResultSize,
&(pCtx->tL1AlgCtx.tSm3Inf.u32ResultBufSize),
sizeof(pCtx->tL1AlgCtx.tSm3Inf.u32ResultBufSize));
}
else
{
;
}
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm3Poll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM3 == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_Sm3_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_ShaSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_SHA;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tShaInf.pParm = (HSMCom_ShaExType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tShaInf.aParmBuf[0]));
pCtx->tL1AlgCtx.tShaInf.pParm->tCfg.pResult = (HSM_ShaResultBufType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tShaInf.aShaResultCache[0]));
;
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_ShaReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SHA == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_ShaExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SHA == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sha(HSM_L1_RtCtxType *pCtx, const HSM_Ln_ShaType *pCfg, hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
hsm_uint32_t u32HashRetSize;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) && (NULL_PTR != pCfg->pResult) &&
(pCfg->u32ResultBufSize > 0) &&
((HSM_DATA_FORMAT_1B == pCfg->eOutputFmt) ||
((pCfg->u32ResultBufSize >= 4u) &&
(0u == (pCfg->u32ResultBufSize & 0x3))))) /* not check the input address 4byte aligned
here for eco support this */
{
eRet = hsm_hash_get_result_byte_count((HFAM_MODE_E)pCfg->eAlg, &u32HashRetSize);
if (HSM_STATUS_SUCCESS == eRet)
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SHA == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tShaInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tShaInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tShaInf.pResultBuf = pCfg->pResult;
if (pCfg->u32ResultBufSize >= u32HashRetSize)
{
pCtx->tL1AlgCtx.tShaInf.u32ResultBufSize = u32HashRetSize;
}
else
{
pCtx->tL1AlgCtx.tShaInf.u32ResultBufSize = pCfg->u32ResultBufSize;
}
pCtx->tL1AlgCtx.tShaInf.pOutResultSize = pCfg->pResultSize;
pCtx->tL1AlgCtx.tShaInf.pParm->tCfg.eAlg = pCfg->eAlg;
hsm_memcpy(&(pCtx->tL1AlgCtx.tShaInf.pParm->tCfg.tCfg),
&(pCfg->tCfg),
sizeof(HSM_ShaCtxType));
pCtx->tL1AlgCtx.tShaInf.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
pCtx->tL1AlgCtx.tShaInf.pParm->tCfg.eOutputFmt = HSM_DATA_FORMAT_4B;
if (HSM_DATA_FORMAT_1B == pCfg->eOutputFmt)
{
pCtx->tL1AlgCtx.tShaInf.bSwapOut = HSM_TRUE;
}
else
{
pCtx->tL1AlgCtx.tShaInf.bSwapOut = HSM_FALSE;
}
eRet = HSM_FW_ShaEx(&(pCtx->tCmd), pCtx->tL1AlgCtx.tShaInf.pParm, pCfg->bKeyUseId);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sha_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
hsm_uint32_t u32HashRetSize;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tShaInf.pParm->u32HSMStatusRet)
{
eRet = hsm_hash_get_result_byte_count((HFAM_MODE_E)pCtx->tL1AlgCtx.tShaInf.pParm->tCfg.eAlg,
&u32HashRetSize);
if (HSM_STATUS_SUCCESS == eRet)
{
if (HSM_TRUE == pCtx->tL1AlgCtx.tShaInf.bSwapOut)
{
hsm_u32_array_swap(
(hsm_uint32_t *)&(pCtx->tL1AlgCtx.tShaInf.pParm->tCfg.pResult->aResult[0]),
u32HashRetSize / 4U); /* all result data size is 4*N */
}
else
{
}
hsm_memcpy(pCtx->tL1AlgCtx.tShaInf.pResultBuf,
&(pCtx->tL1AlgCtx.tShaInf.pParm->tCfg.pResult->aResult[0]),
pCtx->tL1AlgCtx.tShaInf.u32ResultBufSize);
if (NULL_PTR != pCtx->tL1AlgCtx.tShaInf.pOutResultSize)
{
hsm_memcpy(pCtx->tL1AlgCtx.tShaInf.pOutResultSize,
&(pCtx->tL1AlgCtx.tShaInf.u32ResultBufSize),
sizeof(pCtx->tL1AlgCtx.tShaInf.u32ResultBufSize));
}
else
{
;
}
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_ShaPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SHA == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_Sha_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RngSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_RNG;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tRngInf.pParm = (HSMCom_TrueRandExType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tRngInf.aParmBuf[0]));
pCtx->tL1AlgCtx.tRngInf.pParm->aRandom = (hsm_uint32_t(*)[HSM_TRNG_RAND_U32_CNT])
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRngInf.aRandom[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RngReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RNG == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RngExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RNG == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Rng(HSM_L1_RtCtxType *pCtx, const HSM_Ln_RngType *pCfg, hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) && (pCfg->u32ResultBufSize > 0))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RNG == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tRngInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tRngInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tRngInf.pParm->u32RandSrc = pCfg->eSrc;
pCtx->tL1AlgCtx.tRngInf.pResultBuf = pCfg->pResult;
pCtx->tL1AlgCtx.tRngInf.u32ResultBufSize = pCfg->u32ResultBufSize;
pCtx->tL1AlgCtx.tRngInf.u32GetSize = 0u;
eRet = HSM_TrueRandGet(&(pCtx->tCmd), pCtx->tL1AlgCtx.tRngInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Rng_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tRngInf.pParm->u32HSMStatusRet)
{
if ((pCtx->tL1AlgCtx.tRngInf.u32GetSize + (sizeof(hsm_uint32_t) * HSM_TRNG_RAND_U32_CNT)) <
pCtx->tL1AlgCtx.tRngInf.u32ResultBufSize)
{
hsm_memcpy(((hsm_uint8_t *)pCtx->tL1AlgCtx.tRngInf.pResultBuf) +
pCtx->tL1AlgCtx.tRngInf.u32GetSize,
&((*(pCtx->tL1AlgCtx.tRngInf.pParm->aRandom))[0]),
(sizeof(hsm_uint32_t) * HSM_TRNG_RAND_U32_CNT));
pCtx->tL1AlgCtx.tRngInf.u32GetSize += (sizeof(hsm_uint32_t) * HSM_TRNG_RAND_U32_CNT);
pCtx->tL1AlgCtx.tRngInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
eRet = HSM_TrueRandGet(&(pCtx->tCmd), pCtx->tL1AlgCtx.tRngInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
else
{
eRet = HSM_STATUS_AGAIN;
}
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_ERROR_STOP;
}
}
else
{
hsm_memcpy(((hsm_uint8_t *)pCtx->tL1AlgCtx.tRngInf.pResultBuf) +
pCtx->tL1AlgCtx.tRngInf.u32GetSize,
&((*(pCtx->tL1AlgCtx.tRngInf.pParm->aRandom))[0]),
pCtx->tL1AlgCtx.tRngInf.u32ResultBufSize - pCtx->tL1AlgCtx.tRngInf.u32GetSize);
pCtx->tL1AlgCtx.tRngInf.u32GetSize = pCtx->tL1AlgCtx.tRngInf.u32ResultBufSize;
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SUCCESS;
}
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_RngPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RNG == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_Rng_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccVerifySetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32BitCnt)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((u32BitCnt <= 1024) && (u32BitCnt >= 1u))
{
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_ECC_VERIFY;
pCtx->tL1AlgCtx.tEccVerifyInf.u32NBitCnt = u32BitCnt;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tEccVerifyInf.pParm = (HSMCom_EccVerifyType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.aParmBuf[0]));
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.tCurve.pP =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aP[0]));
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.tCurve.pN =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aN[0]));
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.tCurve.pA =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aA[0]));
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.tCurve.pB =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aB[0]));
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.tCurve.pGx =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aGx[0]));
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.tCurve.pGy =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aGy[0]));
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.pkG_x =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.akGx[0]));
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.pkG_y =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.akGy[0]));
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.pHashData =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aHash[0]));
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.pR =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aR[0]));
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.pS =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aS[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccVerifyExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_VERIFY == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
/* For interrupt usage */
HSM_StatusType HSM_L1_EccVerify(HSM_L1_RtCtxType *pCtx,
const HSM_L1_EccVerifyType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
hsm_uint32_t u32NByteCnt;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
const hsm_uint8_t *pStart;
hsm_uint32_t u32ActualSize;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
u32NByteCnt = ((pCtx->tL1AlgCtx.tEccVerifyInf.u32NBitCnt + 63u) / 64u) * 8u;
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->u32UserKeyID_PublicKey = pCfg->u32PublicKeyId;
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->u32BitCnt =
pCtx->tL1AlgCtx.tEccVerifyInf.u32NBitCnt;
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->u32EccCurve = pCfg->u32EccCurve;
pCtx->tL1AlgCtx.tEccVerifyInf.pParm->tCfg.u32DataByteCnt = u32NByteCnt;
if (HSM_DRV_ECC_CURVE_PRM_IDX_MAX <= pCfg->u32EccCurve)
{
hsm_rm_prefix_zeros(pCfg->eCurveDataFmt,
pCfg->tCurve.pP,
pCfg->tCurve.u32PByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aP[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aP[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eCurveDataFmt,
pCfg->tCurve.pN,
pCfg->tCurve.u32NByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aN[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aN[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eCurveDataFmt,
pCfg->tCurve.pA,
pCfg->tCurve.u32AByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aA[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aA[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eCurveDataFmt,
pCfg->tCurve.pB,
pCfg->tCurve.u32BByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aB[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aB[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eCurveDataFmt,
pCfg->tCurve.pGx,
pCfg->tCurve.u32GxByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aGx[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.aGx[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eCurveDataFmt,
pCfg->tCurve.pGy,
pCfg->tCurve.u32GyByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aGy[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.aGy[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eCurveDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.aP[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.aN[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.aA[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.aB[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.aGx[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.aGy[0])),
u32NByteCnt / 4U);
}
else
{
;
}
}
else
{
;
}
if (0u == pCfg->u32PublicKeyId)
{
hsm_rm_prefix_zeros(pCfg->ekGxyDataFmt,
pCfg->pkGx,
pCfg->u32kGxByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.akGx[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.akGx[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->ekGxyDataFmt,
pCfg->pkGy,
pCfg->u32kGyByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.akGy[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.akGy[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->ekGxyDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.akGx[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.akGy[0])),
u32NByteCnt / 4U);
}
else
{
;
}
}
else
{
;
}
hsm_rm_prefix_zeros(pCfg->eDataFmt,
pCfg->pData,
pCfg->u32DataByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aHash[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aHash[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccVerifyInf.aHash[0])),
u32NByteCnt / 4U);
}
else
{
;
}
hsm_rm_prefix_zeros(pCfg->eRDataFmt,
pCfg->pR,
pCfg->u32RByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aR[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aR[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eRDataFmt)
{
hsm_u32_array_swap(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aR[0])),
u32NByteCnt / 4U);
}
else
{
;
}
hsm_rm_prefix_zeros(pCfg->eSDataFmt,
pCfg->pS,
pCfg->u32SByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aS[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aS[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eSDataFmt)
{
hsm_u32_array_swap(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccVerifyInf.aS[0])),
u32NByteCnt / 4U);
}
else
{
;
}
eRet = HSM_EccVerify(&(pCtx->tCmd), pCtx->tL1AlgCtx.tEccVerifyInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccVerify_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_PASS == pCtx->tL1AlgCtx.tEccVerifyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_PASS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else if (MAILBOXAPI_RET_FAIL == pCtx->tL1AlgCtx.tEccVerifyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_FAIL;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_ERROR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_EccVerifyPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_EccVerify_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccVerifyReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccDecryptSetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32BitCnt)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((u32BitCnt <= 1024) && (u32BitCnt >= 1u))
{
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_ECC_EASYDECRY;
pCtx->tL1AlgCtx.tEccDecryptInf.u32NBitCnt = u32BitCnt;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tEccDecryptInf.pParm = (HSMCom_EccEasyDecryType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aParmBuf[0]));
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->u32BitCnt = u32BitCnt;
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pP =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aP[0]));
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pN =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aN[0]));
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pCoeffi_A =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aA[0]));
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pCoeffi_B =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aB[0]));
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pOtherSidePublicKey_x =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.akGx[0]));
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pOtherSidePublicKey_y =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.akGy[0]));
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pPrivateKey = (const hsm_uint32_t *)
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aPrivate[0]));
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pEncryedData = (const hsm_uint32_t *)
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aEncrypted[0]));
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pPlainData =
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aPlain[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccDecryptExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_EASYDECRY == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccDecrypt(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_EccDecryptType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
hsm_uint32_t u32NByteCnt;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
const hsm_uint8_t *pStart;
hsm_uint32_t u32ActualSize;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_EASYDECRY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
u32NByteCnt = ((pCtx->tL1AlgCtx.tEccDecryptInf.u32NBitCnt + 63u) / 64u) * 8u;
pCtx->tL1AlgCtx.tEccDecryptInf.eOutFmt = pCfg->eOutputDataFmt;
pCtx->tL1AlgCtx.tEccDecryptInf.pResultBuf = pCfg->pPlainData;
pCtx->tL1AlgCtx.tEccDecryptInf.u32ResultBufSize = pCfg->u32PlainDataBufferByteCnt;
pCtx->tL1AlgCtx.tEccDecryptInf.pResultByteCnt = pCfg->pPlainResultByteCnt;
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->u32UserKeyID_PrivateKey = pCfg->u32PrivateKeyId;
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->u32UserKeyID_PublicKey = pCfg->u32PublicKeyId;
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->u32BitCnt =
pCtx->tL1AlgCtx.tEccDecryptInf.u32NBitCnt;
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->u32EccCurve = pCfg->u32EccCurve;
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.u32ByteCount = u32NByteCnt;
if (HSM_DRV_ECC_CURVE_PRM_IDX_MAX <= pCfg->u32EccCurve)
{
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->tCurve.pP,
pCfg->tCurve.u32PByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aP[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aP[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->tCurve.pN,
pCfg->tCurve.u32NByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aN[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aN[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->tCurve.pA,
pCfg->tCurve.u32AByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aA[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aA[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->tCurve.pB,
pCfg->tCurve.u32BByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aB[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aB[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eInputDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aA[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aB[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aP[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aN[0])),
u32NByteCnt / 4U);
}
else
{
;
}
}
else
{
;
}
if (0u == pCfg->u32PublicKeyId)
{
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->pkGx,
pCfg->u32kGxByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.akGx[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.akGx[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->pkGy,
pCfg->u32kGyByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.akGy[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.akGy[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eInputDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.akGx[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.akGy[0])),
u32NByteCnt / 4U);
}
else
{
;
}
}
else
{
;
}
if (0u == pCfg->u32PrivateKeyId)
{
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->pPrivateKey,
pCfg->u32PrivateKeyByteCnt,
&pStart,
&u32ActualSize);
hsm_memset(
(void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aPrivate[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aPrivate[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eInputDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aPrivate[0])),
u32NByteCnt / 4U);
}
else
{
;
}
}
else
{
;
}
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->pEncryptedData,
pCfg->u32EncryptedDataByteCnt,
&pStart,
&u32ActualSize);
hsm_memset(
(void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccDecryptInf.aEncrypted[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aEncrypted[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eInputDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccDecryptInf.aEncrypted[0])),
u32NByteCnt / 4U);
}
else
{
;
}
eRet = HSM_EccEasyDecry(&(pCtx->tCmd), pCtx->tL1AlgCtx.tEccDecryptInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccDecrypt_Isr(HSM_L1_RtCtxType *pCtx)
{
const hsm_uint8_t *pStart;
hsm_uint32_t u32ActualSize;
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tEccDecryptInf.pParm->u32HSMStatusRet)
{
if (HSM_DATA_FORMAT_1B == pCtx->tL1AlgCtx.tEccDecryptInf.eOutFmt)
{
hsm_u32_array_swap(pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pPlainData,
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.u32ByteCount /
4U); /* 4B -> 1B */
hsm_rm_prefix_zeros(
HSM_DATA_FORMAT_1B,
(const hsm_uint8_t *)pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pPlainData,
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.u32ByteCount,
&pStart,
&u32ActualSize);
if (u32ActualSize > pCtx->tL1AlgCtx.tEccDecryptInf.u32ResultBufSize)
{
eRet = HSM_STATUS_BUFFER_SIZE_ERR;
}
else
{
hsm_memcpy(pCtx->tL1AlgCtx.tEccDecryptInf.pResultBuf, pStart, u32ActualSize);
if (0u != pCtx->tL1AlgCtx.tEccDecryptInf.pResultByteCnt)
{
*pCtx->tL1AlgCtx.tEccDecryptInf.pResultByteCnt = u32ActualSize;
}
eRet = HSM_STATUS_SUCCESS;
}
}
else
{
hsm_rm_prefix_zeros(
HSM_DATA_FORMAT_4B,
(const hsm_uint8_t *)pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.pPlainData,
pCtx->tL1AlgCtx.tEccDecryptInf.pParm->tCfg.u32ByteCount,
&pStart,
&u32ActualSize);
if (u32ActualSize > pCtx->tL1AlgCtx.tEccDecryptInf.u32ResultBufSize)
{
eRet = HSM_STATUS_BUFFER_SIZE_ERR;
}
else
{
hsm_memcpy(pCtx->tL1AlgCtx.tEccDecryptInf.pResultBuf, pStart, u32ActualSize);
if (0u != pCtx->tL1AlgCtx.tEccDecryptInf.pResultByteCnt)
{
*pCtx->tL1AlgCtx.tEccDecryptInf.pResultByteCnt = u32ActualSize;
}
eRet = HSM_STATUS_SUCCESS;
}
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_EccDecryptPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_EASYDECRY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_EccDecrypt_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccDecryptReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_EASYDECRY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccCalculateSetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32BitCnt)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((u32BitCnt <= 1024) && (u32BitCnt >= 1u))
{
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_ECC_CALC;
pCtx->tL1AlgCtx.tEccCalc.u32NBitCnt = u32BitCnt;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tEccCalc.pParm = (HSMCom_EccCalcType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aParmBuf[0]));
pCtx->tL1AlgCtx.tEccCalc.pParm->u32BitCnt = u32BitCnt;
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pCoeffi_A =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aA[0]));
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pCoeffi_B =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aB[0]));
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pP = (const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aP[0]));
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pN = (const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aN[0]));
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pP1x = (const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aP1x[0]));
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pP1y = (const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aP1y[0]));
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pE = (const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aE[0]));
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pP2x = (const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aP2x[0]));
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pResultx = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aResultX[0]));
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pP2y = (const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aP2y[0]));
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pResulty = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aResultY[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccCalculateExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_CALC == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccCalculateKP(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_EccKPType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
hsm_uint32_t u32NByteCnt;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
const hsm_uint8_t *pStart;
hsm_uint32_t u32ActualSize;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_CALC == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
u32NByteCnt = ((pCtx->tL1AlgCtx.tEccCalc.u32NBitCnt + 63u) / 64u) * 8u;
pCtx->tL1AlgCtx.tEccCalc.eOutFmt = pCfg->eOutputDataFmt;
pCtx->tL1AlgCtx.tEccCalc.pResultBufX = pCfg->pResultX;
pCtx->tL1AlgCtx.tEccCalc.u32ResultBufSizeX = pCfg->u32ResultXBufferByteCnt;
pCtx->tL1AlgCtx.tEccCalc.pResultByteCntX = pCfg->pResultXByteCnt;
pCtx->tL1AlgCtx.tEccCalc.pResultBufY = pCfg->pResultY;
pCtx->tL1AlgCtx.tEccCalc.u32ResultBufSizeY = pCfg->u32ResultYBufferByteCnt;
pCtx->tL1AlgCtx.tEccCalc.pResultByteCntY = pCfg->pResultYByteCnt;
pCtx->tL1AlgCtx.tEccCalc.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tEccCalc.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tEccCalc.pParm->u32UserKeyID_E = pCfg->u32KId;
pCtx->tL1AlgCtx.tEccCalc.pParm->u32UserKeyID_P1 = pCfg->u32PointId;
pCtx->tL1AlgCtx.tEccCalc.pParm->u32BitCnt = pCtx->tL1AlgCtx.tEccCalc.u32NBitCnt;
pCtx->tL1AlgCtx.tEccCalc.pParm->u32EccCurve = pCfg->u32EccCurve;
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.u32ByteCount = u32NByteCnt;
if (HSM_DRV_ECC_CURVE_PRM_IDX_MAX <= pCfg->u32EccCurve)
{
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->tCurve.pP,
pCfg->tCurve.u32PByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aP[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aP[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->tCurve.pN,
pCfg->tCurve.u32NByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aN[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aN[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->tCurve.pA,
pCfg->tCurve.u32AByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aA[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aA[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->tCurve.pB,
pCfg->tCurve.u32BByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aB[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aB[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eInputDataFmt)
{
hsm_u32_array_swap(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aA[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aB[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aP[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aN[0])),
u32NByteCnt / 4U);
}
else
{
;
}
}
else
{
;
}
if (0u == pCfg->u32PointId)
{
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->pPointX,
pCfg->u32PointXByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aP1x[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aP1x[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->pPointY,
pCfg->u32PointYByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aP1y[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aP1y[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eInputDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aP1x[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccCalc.aP1y[0])),
u32NByteCnt / 4U);
}
else
{
;
}
}
else
{
;
}
if (0u == pCfg->u32KId)
{
hsm_rm_prefix_zeros(pCfg->eInputDataFmt,
pCfg->pK,
pCfg->u32KByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aE[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aE[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eInputDataFmt)
{
hsm_u32_array_swap(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aE[0])),
u32NByteCnt / 4U);
}
else
{
;
}
}
else
{
;
}
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aP2x[0])),
0,
sizeof(pCtx->tL1AlgCtx.tEccCalc.aP2x));
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccCalc.aP2y[0])),
0,
sizeof(pCtx->tL1AlgCtx.tEccCalc.aP2y));
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.u32CalcType = HSM_ECC_CALC_PMUL;
eRet = HSM_EccCalculateEx(&(pCtx->tCmd), pCtx->tL1AlgCtx.tEccCalc.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccCalculate_Isr(HSM_L1_RtCtxType *pCtx)
{
const hsm_uint8_t *pStart;
hsm_uint32_t u32ActualSize;
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tEccCalc.pParm->u32HSMStatusRet)
{
if (HSM_DATA_FORMAT_1B == pCtx->tL1AlgCtx.tEccCalc.eOutFmt)
{
hsm_u32_array_swap(pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pResultx,
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.u32ByteCount / 4U); /* 4B -> 1B */
hsm_rm_prefix_zeros(HSM_DATA_FORMAT_1B,
(const hsm_uint8_t *)pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pResultx,
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.u32ByteCount,
&pStart,
&u32ActualSize);
if (u32ActualSize > pCtx->tL1AlgCtx.tEccCalc.u32ResultBufSizeX)
{
eRet = HSM_STATUS_BUFFER_SIZE_ERR;
}
else
{
hsm_memcpy(pCtx->tL1AlgCtx.tEccCalc.pResultBufX, pStart, u32ActualSize);
if (0u != pCtx->tL1AlgCtx.tEccCalc.pResultByteCntX)
{
*pCtx->tL1AlgCtx.tEccCalc.pResultByteCntX = u32ActualSize;
}
eRet = HSM_STATUS_SUCCESS;
}
}
else
{
hsm_rm_prefix_zeros(HSM_DATA_FORMAT_4B,
(const hsm_uint8_t *)pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pResultx,
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.u32ByteCount,
&pStart,
&u32ActualSize);
if (u32ActualSize > pCtx->tL1AlgCtx.tEccCalc.u32ResultBufSizeX)
{
eRet = HSM_STATUS_BUFFER_SIZE_ERR;
}
else
{
hsm_memcpy(pCtx->tL1AlgCtx.tEccCalc.pResultBufX, pStart, u32ActualSize);
if (pCtx->tL1AlgCtx.tEccCalc.pResultByteCntX)
{
*pCtx->tL1AlgCtx.tEccCalc.pResultByteCntX = u32ActualSize;
}
eRet = HSM_STATUS_SUCCESS;
}
}
if (HSM_STATUS_SUCCESS == eRet)
{
if (HSM_DATA_FORMAT_1B == pCtx->tL1AlgCtx.tEccCalc.eOutFmt)
{
hsm_u32_array_swap(pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pResulty,
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.u32ByteCount /
4U); /* 4B -> 1B */
hsm_rm_prefix_zeros(HSM_DATA_FORMAT_1B,
(const hsm_uint8_t *)pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pResulty,
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.u32ByteCount,
&pStart,
&u32ActualSize);
if (u32ActualSize > pCtx->tL1AlgCtx.tEccCalc.u32ResultBufSizeX)
{
eRet = HSM_STATUS_BUFFER_SIZE_ERR;
}
else
{
hsm_memcpy(pCtx->tL1AlgCtx.tEccCalc.pResultBufY, pStart, u32ActualSize);
if (pCtx->tL1AlgCtx.tEccCalc.pResultByteCntY)
{
*pCtx->tL1AlgCtx.tEccCalc.pResultByteCntY = u32ActualSize;
}
eRet = HSM_STATUS_SUCCESS;
}
}
else
{
hsm_rm_prefix_zeros(HSM_DATA_FORMAT_4B,
(const hsm_uint8_t *)pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.pResulty,
pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.u32ByteCount,
&pStart,
&u32ActualSize);
if (u32ActualSize > pCtx->tL1AlgCtx.tEccCalc.u32ResultBufSizeY)
{
eRet = HSM_STATUS_BUFFER_SIZE_ERR;
}
else
{
hsm_memcpy(pCtx->tL1AlgCtx.tEccCalc.pResultBufY, pStart, u32ActualSize);
if (0u != pCtx->tL1AlgCtx.tEccCalc.pResultByteCntY)
{
*pCtx->tL1AlgCtx.tEccCalc.pResultByteCntY = u32ActualSize;
}
eRet = HSM_STATUS_SUCCESS;
}
}
}
/* else do nothing */
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_EccCalculatePoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_CALC == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
if (pCtx->tL1AlgCtx.tEccCalc.pParm->tCfg.u32CalcType != HSM_ECC_CALC_PCHK)
{
eRet = HSM_L1_EccDecrypt_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_ERROR_STOP;
}
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccCalculateReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_CALC == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_CMacSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_CMAC;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tCMacInf.pParm = (HSMCom_CMacExType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tCMacInf.aParmBuf[0]));
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.pDataOutput = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&pCtx->tL1AlgCtx.tCMacInf.aResultCacheBuf[0]);
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.u32OutputMemSize = sizeof(
pCtx->tL1AlgCtx.tCMacInf.aResultCacheBuf);
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_CMacReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_CMAC == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_CMacExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_CMAC == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_CMac(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_CMacType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
hsm_uint32_t *pInputCache;
hsm_uint32_t u32GenMacByteCnt;
hsm_uint32_t u32ActualGenMacByteCnt;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) &&
((NULL_PTR != pCfg->pDataOutput) ||
((HSM_FALSE != pCfg->bCheckMacEn) && (NULL_PTR != pCfg->pVerifyResult))) &&
((HSM_DATA_FORMAT_1B == pCfg->eOutputFmt) ||
((pCfg->u32ResultBufSize >= 4u) && (0u == (pCfg->u32ResultBufSize & 0x3)))) &&
((HSM_FALSE == pCfg->bCheckMacEn) || (HSM_DATA_FORMAT_1B == pCfg->eOutputFmt) ||
((pCfg->u32CheckByteCnt >= 4u) &&
(0u == (pCfg->u32CheckByteCnt & 0x3))))) /* not check the input address 4byte aligned here
for eco support this */
{
bInProcess = pCtx->bInProcess;
if (HSM_XCMAC_ENGINE_AES == pCfg->eEngine)
{
if (HSM_AES_KEY_NEW == pCfg->eUseKeyType)
{
if (HSM_AES_KEY128 == pCfg->tNewKeyInf.eKeyType)
{
u32ActualGenMacByteCnt = 16u;
if (pCfg->u32GenMacByteCnt > 16u)
{
u32GenMacByteCnt = 16u;
}
else
{
u32GenMacByteCnt = pCfg->u32GenMacByteCnt;
}
}
else if (HSM_AES_KEY192 == pCfg->tNewKeyInf.eKeyType)
{
u32ActualGenMacByteCnt = 16u;
if (pCfg->u32GenMacByteCnt > 16u)
{
u32GenMacByteCnt = 16u;
}
else
{
u32GenMacByteCnt = pCfg->u32GenMacByteCnt;
}
}
else if (HSM_AES_KEY256 == pCfg->tNewKeyInf.eKeyType)
{
u32ActualGenMacByteCnt = 16u;
if (pCfg->u32GenMacByteCnt > 16u)
{
u32GenMacByteCnt = 16u;
}
else
{
u32GenMacByteCnt = pCfg->u32GenMacByteCnt;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else if (HSM_AES_KEY_CHIP_VENDOR_IFR == pCfg->eUseKeyType)
{
if (HSM_AES_KEY128 == pCfg->tVendorKeyInf.eKeyType)
{
u32ActualGenMacByteCnt = 16u;
if (pCfg->u32GenMacByteCnt > 16u)
{
u32GenMacByteCnt = 16u;
}
else
{
u32GenMacByteCnt = pCfg->u32GenMacByteCnt;
}
}
else if (HSM_AES_KEY192 == pCfg->tVendorKeyInf.eKeyType)
{
u32ActualGenMacByteCnt = 16u;
if (pCfg->u32GenMacByteCnt > 16u)
{
u32GenMacByteCnt = 16u;
}
else
{
u32GenMacByteCnt = pCfg->u32GenMacByteCnt;
}
}
else if (HSM_AES_KEY256 == pCfg->tVendorKeyInf.eKeyType)
{
u32ActualGenMacByteCnt = 16u;
if (pCfg->u32GenMacByteCnt > 16u)
{
u32GenMacByteCnt = 16u;
}
else
{
u32GenMacByteCnt = pCfg->u32GenMacByteCnt;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else
{
if (HSM_AES_KEY_NEW == pCfg->eUseKeyType)
{
if (HSM_AES_KEY128 == pCfg->tNewKeyInf.eKeyType)
{
u32ActualGenMacByteCnt = 16u;
if (pCfg->u32GenMacByteCnt > 16u)
{
u32GenMacByteCnt = 16u;
}
else
{
u32GenMacByteCnt = pCfg->u32GenMacByteCnt;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else if (HSM_AES_KEY_CHIP_VENDOR_IFR == pCfg->eUseKeyType)
{
if (HSM_AES_KEY128 == pCfg->tVendorKeyInf.eKeyType)
{
u32ActualGenMacByteCnt = 16u;
if (pCfg->u32GenMacByteCnt > 16u)
{
u32GenMacByteCnt = 16u;
}
else
{
u32GenMacByteCnt = pCfg->u32GenMacByteCnt;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
if (HSM_STATUS_SUCCESS == eRet)
{
if ((HSM_TRUE == bInProcess) && (HSM_OP_CMAC == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
if (u32GenMacByteCnt > pCfg->u32ResultBufSize)
{
u32GenMacByteCnt = pCfg->u32ResultBufSize;
}
pCtx->tL1AlgCtx.tCMacInf.pResultBuf = pCfg->pDataOutput;
pCtx->tL1AlgCtx.tCMacInf.u32ResultBufByteCnt = u32GenMacByteCnt;
pCtx->tL1AlgCtx.tCMacInf.pOutResultSize = pCfg->pResultSize;
pCtx->tL1AlgCtx.tCMacInf.bCheckMac = pCfg->bCheckMacEn;
pCtx->tL1AlgCtx.tCMacInf.pMacToCheck = pCfg->pCheckExternalMac;
pCtx->tL1AlgCtx.tCMacInf.u32MacToCheckByteCnt = pCfg->u32CheckByteCnt;
pCtx->tL1AlgCtx.tCMacInf.pVerifyResult = pCfg->pVerifyResult;
pCtx->tL1AlgCtx.tCMacInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tCMacInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tCMacInf.pParm->u32UserKeyID = pCfg->u32NewKeyId;
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.eUseKeyType = pCfg->eUseKeyType;
hsm_memcpy(&(pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.tNewKeyInf),
&(pCfg->tNewKeyInf),
sizeof(HSM_AesNewKeyInfType));
hsm_memcpy(&(pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.tVendorKeyInf),
&(pCfg->tVendorKeyInf),
sizeof(HSM_AesVendorKeyInfType));
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.u32GenMacByteCnt = u32ActualGenMacByteCnt;
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.bCheckMacEn = HSM_FALSE;
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.pDataInput =
(const hsm_uint32_t *)pCfg->pDataInput;
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.u32InputByteCnt = pCfg->u32InputByteCnt;
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.eEngine = pCfg->eEngine;
if ((HSM_DATA_FORMAT_1B == pCfg->eInputFmt) && (0u == pCfg->u32NewKeyId) &&
(pCfg->u32InputByteCnt <=
(sizeof(pCtx->tL1AlgCtx.tCMacInf.aInputCacheBuf) - 4u)))
{
pInputCache = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tCMacInf.aInputCacheBuf[0]));
hsm_core_swap_u32_array_pad(pInputCache,
(pCfg->u32InputByteCnt + 3u) >> 2u,
pCfg->pDataInput,
pCfg->u32InputByteCnt,
0u,
HSM_TRUE,
HSM_TRUE);
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.pDataInput = pInputCache;
if (HSM_AES_KEY_NEW == pCfg->eUseKeyType)
{
pInputCache = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tCMacInf.aResultCacheBuf[0]));
if (HSM_AES_KEY128 == pCfg->tNewKeyInf.eKeyType)
{
hsm_core_swap_u32_array_pad(pInputCache,
4U,
pCfg->tNewKeyInf.pKeyAddr,
16U,
0u,
HSM_TRUE,
HSM_TRUE);
}
else if (HSM_AES_KEY192 == pCfg->tNewKeyInf.eKeyType)
{
hsm_core_swap_u32_array_pad(pInputCache,
6U,
pCfg->tNewKeyInf.pKeyAddr,
24U,
0u,
HSM_TRUE,
HSM_TRUE);
}
else /* AES 256 */
{
hsm_core_swap_u32_array_pad(pInputCache,
8U,
pCfg->tNewKeyInf.pKeyAddr,
32U,
0u,
HSM_TRUE,
HSM_TRUE);
}
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.tNewKeyInf.pKeyAddr =
(const hsm_uint8_t *)pInputCache;
}
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.eInputFmt = HSM_DATA_FORMAT_4B;
}
else
{
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
}
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.eOutputFmt = HSM_DATA_FORMAT_4B;
if (HSM_DATA_FORMAT_1B == pCfg->eOutputFmt)
{
pCtx->tL1AlgCtx.tCMacInf.bSwapOut = HSM_TRUE;
}
else
{
pCtx->tL1AlgCtx.tCMacInf.bSwapOut = HSM_FALSE;
}
eRet = HSM_CMacEx(&(pCtx->tCmd), pCtx->tL1AlgCtx.tCMacInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_CMac_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
Crypto_VerifyResultType eVerifyRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tCMacInf.pParm->u32HSMStatusRet)
{
if (HSM_TRUE == pCtx->tL1AlgCtx.tCMacInf.bSwapOut)
{
hsm_u32_array_swap(pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.pDataOutput,
(pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.u32GenMacByteCnt + 3u) >> 2u);
}
else
{
}
if (HSM_TRUE == (pCtx->tL1AlgCtx.tCMacInf.bCheckMac))
{
if (0 == hsm_memcmp(pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.pDataOutput,
pCtx->tL1AlgCtx.tCMacInf.pMacToCheck,
pCtx->tL1AlgCtx.tCMacInf.u32MacToCheckByteCnt))
{
eVerifyRet = CRYPTO_E_VER_OK;
}
else
{
eVerifyRet = CRYPTO_E_VER_NOT_OK;
}
if (NULL_PTR != (pCtx->tL1AlgCtx.tCMacInf.pVerifyResult))
{
hsm_memcpy(pCtx->tL1AlgCtx.tCMacInf.pVerifyResult, &eVerifyRet, sizeof(eVerifyRet));
}
else
{
;
}
}
if (NULL_PTR != (pCtx->tL1AlgCtx.tCMacInf.pResultBuf))
{
hsm_memcpy(pCtx->tL1AlgCtx.tCMacInf.pResultBuf,
pCtx->tL1AlgCtx.tCMacInf.pParm->tCfg.pDataOutput,
pCtx->tL1AlgCtx.tCMacInf.u32ResultBufByteCnt);
}
else
{
}
if (NULL_PTR != pCtx->tL1AlgCtx.tCMacInf.pOutResultSize)
{
hsm_memcpy(pCtx->tL1AlgCtx.tCMacInf.pOutResultSize,
&(pCtx->tL1AlgCtx.tCMacInf.u32ResultBufByteCnt),
sizeof(pCtx->tL1AlgCtx.tCMacInf.u32ResultBufByteCnt));
}
else
{
}
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_CMacPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_CMAC == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_CMac_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_AesEncryptSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_AES_ENCRYPT;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm = (HSMCom_FlexAesEncryptType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tAesEncryptInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_AesEncryptReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_AES_ENCRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_AesEncryptExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_AES_ENCRYPT == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_AesEncrypt(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_AesEncryptType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
hsm_uint32_t *pInputCache;
hsm_uint32_t u32ResultLen;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) &&
(pCfg->u32InputByteCnt >
0u)) /* not check the input address 4byte aligned here for eco support this */
{
if (HSM_FLEXAES_PAD_ZERO == pCfg->ePad)
{
u32ResultLen = (pCfg->u32InputByteCnt + 0xfu) & 0xfffffff0u;
}
else /* HSM_FLEXAES_PAD_PKCS7 */
{
u32ResultLen = (pCfg->u32InputByteCnt + 0x10u) & 0xfffffff0u;
}
if (u32ResultLen <= pCfg->u32OutputMemSize)
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_AES_ENCRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->u32UserKeyID = pCfg->u32KeyId;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.eUseKeyType = pCfg->eUseKeyType;
hsm_memcpy(&(pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.tNewKeyInf),
&(pCfg->tNewKeyInf),
sizeof(HSM_AesNewKeyInfType));
hsm_memcpy(&(pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.tVendorKeyInf),
&(pCfg->tVendorKeyInf),
sizeof(HSM_AesVendorKeyInfType));
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.eAesAlg = pCfg->eAesAlg;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.pDataInput = pCfg->pDataInput;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.u32InputByteCnt = pCfg->u32InputByteCnt;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.pDataOutput = pCfg->pDataOutput;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.u32OutputMemSize =
pCfg->u32OutputMemSize;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.pIvData = (hsm_uint8_t *)
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tAesEncryptInf.aIvData[0]));
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.ePad = pCfg->ePad;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.eOutputFmt = pCfg->eOutputFmt;
if (NULL_PTR != pCfg->pGenerateOutByteCnt)
{
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.pGenerateOutByteCnt =
pCfg->pGenerateOutByteCnt;
}
else
{
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.pGenerateOutByteCnt = &(
pCtx->tL1AlgCtx.tAesEncryptInf.u32HsmRetResultSize);
}
if ((HSM_DATA_FORMAT_1B == pCfg->eInputFmt) && (0u == pCfg->u32KeyId) &&
(pCfg->u32InputByteCnt <=
(sizeof(pCtx->tL1AlgCtx.tAesEncryptInf.aInputCacheBuf) - 4u)))
{
pInputCache = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tAesEncryptInf.aInputCacheBuf[0]));
hsm_core_swap_u32_array_pad(pInputCache,
(pCfg->u32InputByteCnt + 3u) >> 2u,
pCfg->pDataInput,
pCfg->u32InputByteCnt,
0u,
HSM_TRUE,
HSM_TRUE);
if (HSM_SYMM_ENDECRYPT_MODE_ECB != pCfg->eAesAlg)
{
hsm_core_swap_u32_array_pad(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tAesEncryptInf.aIvData[0])),
4u,
pCfg->pIvData,
16u,
0u,
HSM_TRUE,
HSM_TRUE);
}
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.pDataInput =
(const hsm_uint8_t *)pInputCache;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.eOutputFmt = HSM_DATA_FORMAT_4B;
if (HSM_DATA_FORMAT_1B == pCfg->eOutputFmt)
{
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.pDataOutput =
(hsm_uint8_t *)&(pCtx->tL1AlgCtx.tAesEncryptInf.aResultCacheBuf[0]);
pCtx->tL1AlgCtx.tAesEncryptInf.bSwapOut = HSM_TRUE;
}
else
{
pCtx->tL1AlgCtx.tAesEncryptInf.bSwapOut = HSM_FALSE;
}
pCtx->tL1AlgCtx.tAesEncryptInf.pResultBuf = pCfg->pDataOutput;
pCtx->tL1AlgCtx.tAesEncryptInf.u32ResultByteCnt = u32ResultLen;
if (HSM_AES_KEY_NEW == pCfg->eUseKeyType)
{
pInputCache = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tAesEncryptInf.aResultCacheBuf[0]));
if (HSM_AES_KEY128 == pCfg->tNewKeyInf.eKeyType)
{
hsm_core_swap_u32_array_pad(pInputCache,
4U,
pCfg->tNewKeyInf.pKeyAddr,
16U,
0u,
HSM_TRUE,
HSM_TRUE);
}
else if (HSM_AES_KEY192 == pCfg->tNewKeyInf.eKeyType)
{
hsm_core_swap_u32_array_pad(pInputCache,
6U,
pCfg->tNewKeyInf.pKeyAddr,
24U,
0u,
HSM_TRUE,
HSM_TRUE);
}
else /* AES 256 */
{
hsm_core_swap_u32_array_pad(pInputCache,
8U,
pCfg->tNewKeyInf.pKeyAddr,
32U,
0u,
HSM_TRUE,
HSM_TRUE);
}
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.tNewKeyInf.pKeyAddr =
(const hsm_uint8_t *)pInputCache;
}
/* else do nothing */
}
else
{
if (HSM_SYMM_ENDECRYPT_MODE_ECB != pCfg->eAesAlg)
{
hsm_memcpy((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tAesEncryptInf.aIvData[0])),
pCfg->pIvData,
16u);
}
pCtx->tL1AlgCtx.tAesEncryptInf.bSwapOut = HSM_FALSE;
pCtx->tL1AlgCtx.tAesEncryptInf.pResultBuf = pCfg->pDataOutput;
pCtx->tL1AlgCtx.tAesEncryptInf.u32ResultByteCnt = u32ResultLen;
}
eRet = HSM_AesEncryptEx(&(pCtx->tCmd), pCtx->tL1AlgCtx.tAesEncryptInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_AesEncrypt_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tAesEncryptInf.pParm->u32HSMStatusRet)
{
if (HSM_TRUE == pCtx->tL1AlgCtx.tAesEncryptInf.bSwapOut)
{
hsm_u32_array_swap(
(hsm_uint32_t *)(pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.pDataOutput),
pCtx->tL1AlgCtx.tAesEncryptInf.u32ResultByteCnt >> 2u);
hsm_memcpy(pCtx->tL1AlgCtx.tAesEncryptInf.pResultBuf,
pCtx->tL1AlgCtx.tAesEncryptInf.pParm->tCfg.pDataOutput,
pCtx->tL1AlgCtx.tAesEncryptInf.u32ResultByteCnt);
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_SUCCESS;
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_AesEncryptPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_AES_ENCRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_AesEncrypt_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_AesDecryptSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_AES_DECRYPT;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tAesDecryptInf.pParm = (HSMCom_FlexAesDecryptType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tAesDecryptInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_AesDecryptReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_AES_DECRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_AesDecryptExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_AES_DECRYPT == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_AesDecrypt(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_AesDecryptType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
hsm_uint8_t *pU8Cache;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) && (pCfg->u32InputByteCnt > 0u) &&
(!(pCfg->u32InputByteCnt & 0xf))) /* not check the input address 4byte aligned here for eco
support this */
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_AES_DECRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pU8Cache = (hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tAesDecryptInf.aIvData[0]));
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->u32UserKeyID = pCfg->u32KeyId;
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.eUseKeyType = pCfg->eUseKeyType;
hsm_memcpy(&(pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.tNewKeyInf),
&(pCfg->tNewKeyInf),
sizeof(HSM_AesNewKeyInfType));
hsm_memcpy(&(pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.tVendorKeyInf),
&(pCfg->tVendorKeyInf),
sizeof(HSM_AesVendorKeyInfType));
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.eAesAlg = pCfg->eAesAlg;
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.pDataInput = pCfg->pDataInput;
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.u32InputByteCnt = pCfg->u32InputByteCnt;
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.pDataOutput = pCfg->pDataOutput;
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.u32OutputMemSize = pCfg->u32OutputMemSize;
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.pIvData = pU8Cache; /* pCfg->pIvData; */
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.ePad = pCfg->ePad;
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.eOutputFmt = pCfg->eOutputFmt;
if (HSM_SYMM_ENDECRYPT_MODE_ECB != pCfg->eAesAlg)
{
hsm_memcpy(pU8Cache, pCfg->pIvData, 16u);
}
if (NULL_PTR != pCfg->pGenerateOutByteCnt)
{
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.pGenerateOutByteCnt =
pCfg->pGenerateOutByteCnt;
}
else
{
pCtx->tL1AlgCtx.tAesDecryptInf.pParm->tCfg.pGenerateOutByteCnt = &(
pCtx->tL1AlgCtx.tAesDecryptInf.u32HsmRetResultSize);
}
eRet = HSM_AesDecryptEx(&(pCtx->tCmd), pCtx->tL1AlgCtx.tAesDecryptInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_AesDecrypt_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tAesDecryptInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_AesDecryptPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_AES_DECRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_AesDecrypt_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4EncryptSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_SM4_ENCRYPT;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm = (HSMCom_Sm4EncryptExType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tSm4EncryptInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4EncryptReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM4_ENCRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4EncryptExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM4_ENCRYPT == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4Encrypt(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_Sm4EncryptType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
hsm_uint32_t *pInputCache;
hsm_uint32_t u32ResultLen;
hsm_uint8_t *pU8Cache;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) &&
(pCfg->u32InputByteCnt >
0u)) /* not check the input address 4byte aligned here for eco support this */
{
if (HSM_FLEXAES_PAD_ZERO == pCfg->ePad)
{
u32ResultLen = (pCfg->u32InputByteCnt + 0xfu) & 0xfffffff0u;
}
else /* HSM_FLEXAES_PAD_PKCS7 */
{
u32ResultLen = (pCfg->u32InputByteCnt + 0x10u) & 0xfffffff0u;
}
if (u32ResultLen <= pCfg->u32OutputMemSize)
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM4_ENCRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pU8Cache = (hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tSm4EncryptInf.aIvData[0]));
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->u32UserKeyID = pCfg->u32KeyId;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.eUseKeyType = pCfg->eUseKeyType;
hsm_memcpy(&(pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.tNewKeyInf),
&(pCfg->tNewKeyInf),
sizeof(HSM_AesNewKeyInfType));
hsm_memcpy(&(pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.tVendorKeyInf),
&(pCfg->tVendorKeyInf),
sizeof(HSM_AesVendorKeyInfType));
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.eAesAlg = pCfg->eAesAlg;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.pDataInput = pCfg->pDataInput;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.u32InputByteCnt = pCfg->u32InputByteCnt;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.pDataOutput = pCfg->pDataOutput;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.u32OutputMemSize =
pCfg->u32OutputMemSize;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.pIvData = pU8Cache;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.ePad = pCfg->ePad;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.eOutputFmt = pCfg->eOutputFmt;
if (NULL_PTR != pCfg->pGenerateOutByteCnt)
{
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.pGenerateOutByteCnt =
pCfg->pGenerateOutByteCnt;
}
else
{
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.pGenerateOutByteCnt = &(
pCtx->tL1AlgCtx.tSm4EncryptInf.u32HsmRetResultSize);
}
if ((HSM_DATA_FORMAT_1B == pCfg->eInputFmt) && (0u == pCfg->u32KeyId) &&
(pCfg->u32InputByteCnt <=
(sizeof(pCtx->tL1AlgCtx.tSm4EncryptInf.aInputCacheBuf) - 4u)))
{
pInputCache = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tSm4EncryptInf.aInputCacheBuf[0]));
hsm_core_swap_u32_array_pad(pInputCache,
(pCfg->u32InputByteCnt + 3u) >> 2u,
pCfg->pDataInput,
pCfg->u32InputByteCnt,
0u,
HSM_TRUE,
HSM_TRUE);
if (HSM_SYMM_ENDECRYPT_MODE_ECB != pCfg->eAesAlg)
{
hsm_core_swap_u32_array_pad((hsm_uint32_t *)pU8Cache,
4u,
pCfg->pIvData,
16u,
0u,
HSM_TRUE,
HSM_TRUE);
}
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.pDataInput =
(const hsm_uint8_t *)pInputCache;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.eOutputFmt = HSM_DATA_FORMAT_4B;
if (HSM_DATA_FORMAT_1B == pCfg->eOutputFmt)
{
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.pDataOutput =
(hsm_uint8_t *)&(pCtx->tL1AlgCtx.tSm4EncryptInf.aResultCacheBuf[0]);
pCtx->tL1AlgCtx.tSm4EncryptInf.bSwapOut = HSM_TRUE;
}
else
{
pCtx->tL1AlgCtx.tSm4EncryptInf.bSwapOut = HSM_FALSE;
}
pCtx->tL1AlgCtx.tSm4EncryptInf.pResultBuf = pCfg->pDataOutput;
pCtx->tL1AlgCtx.tSm4EncryptInf.u32ResultByteCnt = u32ResultLen;
if (HSM_AES_KEY_NEW == pCfg->eUseKeyType)
{
pInputCache = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tSm4EncryptInf.aResultCacheBuf[0]));
hsm_core_swap_u32_array_pad(pInputCache,
4U,
pCfg->tNewKeyInf.pKeyAddr,
16,
0u,
HSM_TRUE,
HSM_TRUE);
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.tNewKeyInf.pKeyAddr =
(const hsm_uint8_t *)pInputCache;
}
}
else
{
if (HSM_SYMM_ENDECRYPT_MODE_ECB != pCfg->eAesAlg)
{
hsm_memcpy(pU8Cache, pCfg->pIvData, 16U);
}
pCtx->tL1AlgCtx.tSm4EncryptInf.bSwapOut = HSM_FALSE;
pCtx->tL1AlgCtx.tSm4EncryptInf.pResultBuf = pCfg->pDataOutput;
pCtx->tL1AlgCtx.tSm4EncryptInf.u32ResultByteCnt = u32ResultLen;
}
eRet = HSM_Sm4EncryptExStart(&(pCtx->tCmd),
&(pCtx->tL1AlgCtx.tSm4EncryptInf.tWrapper),
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm);
if ((HSM_STATUS_AGAIN == eRet) || (HSM_STATUS_FINISH == eRet))
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4Encrypt_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->u32HSMStatusRet)
{
if (HSM_TRUE == pCtx->tL1AlgCtx.tSm4EncryptInf.bSwapOut)
{
hsm_u32_array_swap((hsm_uint32_t *)pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.pDataOutput,
pCtx->tL1AlgCtx.tSm4EncryptInf.u32ResultByteCnt >> 2u);
hsm_memcpy(pCtx->tL1AlgCtx.tSm4EncryptInf.pResultBuf,
pCtx->tL1AlgCtx.tSm4EncryptInf.pParm->tCfg.pDataOutput,
pCtx->tL1AlgCtx.tSm4EncryptInf.u32ResultByteCnt);
}
else
{
;
}
eRet = HSM_Sm4EncryptExUpdate(&(pCtx->tCmd), &(pCtx->tL1AlgCtx.tSm4EncryptInf.tWrapper));
if ((HSM_STATUS_AGAIN == eRet) || (HSM_STATUS_FINISH == eRet))
{
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
else
{
eRet = HSM_STATUS_AGAIN;
}
}
else if (HSM_STATUS_ALREADY_FINISHED == eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SUCCESS;
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_ERROR;
}
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4EncryptPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM4_ENCRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_Sm4Encrypt_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4DecryptSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_SM4_DECRYPT;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm = (HSMCom_Sm4DecryptExType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tSm4DecryptInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4DecryptReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM4_DECRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4DecryptExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM4_DECRYPT == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4Decrypt(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_Sm4DecryptType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) && (pCfg->u32InputByteCnt > 0u) &&
(!(pCfg->u32InputByteCnt & 0xf))) /* not check the input address 4byte aligned here for eco
support this */
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM4_DECRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->u32UserKeyID = pCfg->u32KeyId;
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.eUseKeyType = pCfg->eUseKeyType;
hsm_memcpy(&(pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.tNewKeyInf),
&(pCfg->tNewKeyInf),
sizeof(HSM_AesNewKeyInfType));
hsm_memcpy(&(pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.tVendorKeyInf),
&(pCfg->tVendorKeyInf),
sizeof(HSM_AesVendorKeyInfType));
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.eAesAlg = pCfg->eAesAlg;
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.pDataInput = pCfg->pDataInput;
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.u32InputByteCnt = pCfg->u32InputByteCnt;
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.pDataOutput = pCfg->pDataOutput;
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.u32OutputMemSize = pCfg->u32OutputMemSize;
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.pIvData =
(hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tSm4DecryptInf.aIvData[0]));
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.ePad = pCfg->ePad;
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.eOutputFmt = pCfg->eOutputFmt;
if (HSM_SYMM_ENDECRYPT_MODE_ECB != pCfg->eAesAlg)
{
hsm_memcpy((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tSm4DecryptInf.aIvData[0])),
pCfg->pIvData,
16U);
}
if (NULL_PTR != pCfg->pGenerateOutByteCnt)
{
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.pGenerateOutByteCnt =
pCfg->pGenerateOutByteCnt;
}
else
{
pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->tCfg.pGenerateOutByteCnt = &(
pCtx->tL1AlgCtx.tSm4DecryptInf.u32HsmRetResultSize);
}
eRet = HSM_Sm4DecryptEx(&(pCtx->tCmd), pCtx->tL1AlgCtx.tSm4DecryptInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4Decrypt_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tSm4DecryptInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm4DecryptPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM4_DECRYPT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_Sm4Decrypt_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_BnCalcSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_BN_CALC;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm = (HSMCom_BigNumberCalcExtType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tBnCalcInf.aBnCalcParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_BnCalcExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_BN_CALC == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
hsm_uint32_t hsm_pkam_get_actual_size(HSM_DataFormatType eDataFormat,
const void *pData,
hsm_uint32_t u32ByteCount,
const hsm_uint8_t **ppLastNonZero)
{
hsm_int32_t s32Idx;
HSM_BoolType bFindNonZero = HSM_FALSE;
const hsm_uint8_t *pLastNoneZeroByte = (const hsm_uint8_t *)pData;
const hsm_uint8_t *pInterU8 = (const hsm_uint8_t *)pData;
if (HSM_DATA_FORMAT_1B == eDataFormat)
{
while ((u32ByteCount > 0u) && (0u == *pInterU8))
{
pInterU8++;
u32ByteCount--;
}
pLastNoneZeroByte = pInterU8;
}
else
{
while (u32ByteCount > 3u)
{
for (s32Idx = 3; s32Idx >= 0; --s32Idx)
{
if (0u == pInterU8[s32Idx])
{
u32ByteCount--;
}
else
{
bFindNonZero = HSM_TRUE;
pLastNoneZeroByte = (const hsm_uint8_t *)pInterU8 + s32Idx;
break;
}
}
if (HSM_TRUE == bFindNonZero)
{
break;
}
else
{
; /* nothing to do */
}
pInterU8 += 4u;
}
if (HSM_TRUE != bFindNonZero)
{
for (s32Idx = 3; s32Idx >= (4 - (hsm_int8_t)u32ByteCount); --s32Idx)
{
if (0u == pInterU8[s32Idx])
{
u32ByteCount--;
}
else
{
bFindNonZero = HSM_TRUE;
pLastNoneZeroByte = pInterU8 + s32Idx;
break;
}
}
}
}
if (NULL_PTR != ppLastNonZero)
{
*ppLastNonZero = pLastNoneZeroByte;
}
else
{
; /* nothing to do */
}
return u32ByteCount;
}
/* if 4B format input, but size error, return HSM_STATUS_PARAM_ERR, others, HSM_STATUS_SUCCESS */
HSM_StatusType hsm_pkam_get_bn_bit_count(HSM_DataFormatType eFmt,
const hsm_uint8_t *pData,
hsm_uint32_t u32ByteCnt,
hsm_uint32_t *pBitCnt)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
const hsm_uint8_t *pLastNonZero;
hsm_uint32_t u32Size;
hsm_uint32_t u32Idx;
hsm_uint32_t u32Data;
if (u32ByteCnt > 0)
{
if (HSM_DATA_FORMAT_1B == eFmt)
{
u32Size = hsm_pkam_get_actual_size(eFmt, pData, u32ByteCnt, &pLastNonZero);
if (u32Size > 0u)
{
for (u32Idx = 8u; u32Idx > 0u; u32Idx--)
{
if (pLastNonZero[0] & (((hsm_uint8_t)0x1u) << (u32Idx - 1u)))
{
break;
}
}
u32Size = u32Idx + ((u32Size - 1u) * 8u);
}
/* else do nothing */
}
else if ((HSM_DATA_FORMAT_4B == eFmt) && (u32ByteCnt >= 4u) && (0u == (u32ByteCnt & 0x3u)))
{
u32Size = hsm_pkam_get_actual_size(eFmt, pData, u32ByteCnt, &pLastNonZero);
if (u32Size > 0u)
{
u32Data = ((hsm_uint32_t)pLastNonZero[0u]);
for (u32Idx = 8u; u32Idx > 0u; u32Idx--)
{
if (u32Data & ((hsm_uint32_t)(((hsm_uint8_t)0x1u) << (u32Idx - 1u))))
{
break;
}
}
u32Size = u32Idx + ((u32Size - 1u) * 8u);
}
/* else do nothing */
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else
{
u32Size = 0u;
}
if ((HSM_STATUS_SUCCESS == eRet) && (pBitCnt))
{
hsm_memcpy(pBitCnt, &u32Size, sizeof(u32Size));
}
/* else do nothing */
return eRet;
}
/* For interrupt usage */
HSM_StatusType HSM_L1_BnCalc(HSM_L1_RtCtxType *pCtx,
const HSM_L1_BnCalcType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
const hsm_uint8_t *pStart;
hsm_uint32_t u32ActualSize;
hsm_uint32_t u32PassToHsmCoreSize;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) && (pCfg->u32BitCnt <= 4096U) &&
(pCfg->eCalcType <= HSM_L1_BNCALC_A_RECIPROCAL) && (NULL_PTR != pCfg->pA) &&
(pCfg->u32AByteCount > 0u) &&
((pCfg->eCalcType > HSM_L1_BNCALC_A_x_B) ||
((NULL_PTR != pCfg->pB) && (pCfg->u32BByteCount > 0u))) &&
((pCfg->eCalcType != HSM_L1_BNCALC_A_Exp_E) ||
((0u != pCfg->u32KeyEId) || ((NULL_PTR != pCfg->pE) && (pCfg->u32EByteCount > 0u)))) &&
((0u != pCfg->u32KeyNId) || ((NULL_PTR != pCfg->pN) && (pCfg->u32NByteCount > 0u))) &&
(NULL_PTR != pCfg->pResult))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_BN_CALC == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32DataValidFlag = 0u;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->u32UserKeyID_KEY_E = pCfg->u32KeyEId;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->u32UserKeyID_KEY_N = pCfg->u32KeyNId;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->u32BitCnt = pCfg->u32BitCnt;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pA = pCfg->pA;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32AByteCount = pCfg->u32AByteCount;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.eInputDataFmt = pCfg->eAFmt;
/* load e */
if (pCfg->eCalcType == HSM_L1_BNCALC_A_Exp_E)
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.eKeyEFmt = pCfg->eEFmt;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32EByteCount = pCfg->u32EByteCount;
if (pCfg->u32KeyEId)
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pE = NULL_PTR;
}
else
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pE = pCfg->pE;
}
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32DataValidFlag |=
HSM_BN_VALID_FLAG_E;
}
else
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->u32UserKeyID_KEY_E = 0u;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32EByteCount = 0u;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pE = NULL_PTR;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.eKeyEFmt = HSM_DATA_FORMAT_4B;
}
if (pCfg->u32KeyNId)
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pN = NULL_PTR;
}
else
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pN = pCfg->pN;
}
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32NByteCount = pCfg->u32NByteCount;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.eKeyNFmt = pCfg->eNFmt;
if (HSM_DATA_FORMAT_1B_PAD_0_LEFT_FIT_BUF != pCfg->eResultFmt)
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pResult = pCfg->pResult;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32ResultBufByteCnt =
pCfg->u32ResultBufByteCnt;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pResultByteCount =
pCfg->pResultByteCnt;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.eOutputFmt = pCfg->eResultFmt;
if (NULL_PTR == pCfg->pResultByteCnt)
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pResultByteCount = &(
pCtx->tL1AlgCtx.tBnCalcInf.u32ResultByteCnt);
}
if (NULL_PTR == pCfg->pResult)
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32ResultBufByteCnt = 0u;
}
if (0u == pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32ResultBufByteCnt)
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pResult = (hsm_uint8_t *)
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tBnCalcInf.aResultCache[0]));
}
}
else
{
pCtx->tL1AlgCtx.tBnCalcInf.pResultBuf = pCfg->pResult;
pCtx->tL1AlgCtx.tBnCalcInf.u32ResultBufSize = pCfg->u32ResultBufByteCnt;
pCtx->tL1AlgCtx.tBnCalcInf.pResultByteCnt = pCfg->pResultByteCnt;
pCtx->tL1AlgCtx.tBnCalcInf.eOutFmt = pCfg->eResultFmt;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pResult = (hsm_uint8_t *)
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tBnCalcInf.aResultCache[0]));
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32ResultBufByteCnt =
sizeof(pCtx->tL1AlgCtx.tBnCalcInf.aResultCache) - 4u;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pResultByteCount = &(
pCtx->tL1AlgCtx.tBnCalcInf.u32ResultByteCnt);
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.eOutputFmt = HSM_DATA_FORMAT_1B;
}
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32CalcType =
(hsm_uint32_t)(pCfg->eCalcType) + HSM_BIGNUMBER_CALC_A_ADD_B;
/* load b */
if (pCfg->eCalcType <= HSM_L1_BNCALC_A_x_B)
{
if (pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.eInputDataFmt != pCfg->eBFmt)
{
u32PassToHsmCoreSize = ((pCfg->u32BByteCount + 7u) >> 3u) << 3u;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pB = (const hsm_uint8_t *)&(
pCtx->tL1AlgCtx.tBnCalcInf.aB[0]);
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32BByteCount =
u32PassToHsmCoreSize;
hsm_rm_prefix_zeros(pCfg->eBFmt,
pCfg->pB,
pCfg->u32BByteCount,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tBnCalcInf.aB[0])),
0,
u32PassToHsmCoreSize - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tBnCalcInf.aB[0]))) +
(u32PassToHsmCoreSize - u32ActualSize),
pStart,
u32ActualSize);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tBnCalcInf.aB[0])),
u32PassToHsmCoreSize >> 2u);
}
else
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pB = pCfg->pB;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32BByteCount =
pCfg->u32BByteCount;
}
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32DataValidFlag |=
HSM_BN_VALID_FLAG_B;
}
else
{
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pB = NULL_PTR;
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.u32BByteCount = 0u;
}
eRet = HSM_FW_BigNumberCalculateEx(&(pCtx->tCmd),
pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
/* else do nothing */
}
/* else do nothing */
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_BnCalc_Isr(HSM_L1_RtCtxType *pCtx)
{
const hsm_uint8_t *pStart;
hsm_uint32_t u32ActualSize;
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->u32HSMStatusRet)
{
if (HSM_DATA_FORMAT_1B_PAD_0_LEFT_FIT_BUF == pCtx->tL1AlgCtx.tBnCalcInf.eOutFmt)
{
hsm_rm_prefix_zeros(
HSM_DATA_FORMAT_1B,
(const hsm_uint8_t *)pCtx->tL1AlgCtx.tBnCalcInf.pBnCalcParm->tCfg.pResult,
pCtx->tL1AlgCtx.tBnCalcInf.u32ResultByteCnt,
&pStart,
&u32ActualSize);
if (u32ActualSize > pCtx->tL1AlgCtx.tBnCalcInf.u32ResultBufSize)
{
eRet = HSM_STATUS_BUFFER_SIZE_ERR;
}
else
{
if (NULL_PTR != pCtx->tL1AlgCtx.tBnCalcInf.pResultBuf)
{
hsm_memset(pCtx->tL1AlgCtx.tBnCalcInf.pResultBuf,
0,
pCtx->tL1AlgCtx.tBnCalcInf.u32ResultBufSize - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)pCtx->tL1AlgCtx.tBnCalcInf.pResultBuf) +
(pCtx->tL1AlgCtx.tBnCalcInf.u32ResultBufSize - u32ActualSize),
pStart,
u32ActualSize);
}
if (NULL_PTR != pCtx->tL1AlgCtx.tBnCalcInf.pResultByteCnt)
{
*pCtx->tL1AlgCtx.tBnCalcInf.pResultByteCnt =
pCtx->tL1AlgCtx.tBnCalcInf.u32ResultBufSize;
}
eRet = HSM_STATUS_SUCCESS;
}
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_BnCalcPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_BN_CALC == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_BnCalc_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_BnCalcReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_BN_CALC == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_ScatterHashSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_SCATTER_HASH;
pCtx->eStat = HSM_DRV_SM_READY;
hsm_memset(&(pCtx->tL1AlgCtx.tScatterHash), 0, sizeof(pCtx->tL1AlgCtx.tScatterHash));
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.bGenerateMacEn = HSM_FALSE;
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.tHashMacKeyInfo.pKeyData = (const hsm_uint8_t *)
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tScatterHash.aMacKeyCache[0]));
pCtx->tL1AlgCtx.tScatterHash.pOut = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.pOutSize = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_READY;
pCtx->tL1AlgCtx.tScatterHash.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm = (HSMCom_ScatterHashType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tScatterHash.tScatterHashParamShared.aScatterHashParmBuf[0]));
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.pResult = &(
pCtx->tL1AlgCtx.tScatterHash.tScatterHashResultShared.aHashCtx);
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.bGenerateMacEn =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.bGenerateMacEn;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.tKeyInfo.pKeyData =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.tHashMacKeyInfo.pKeyData;
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_ScatterHashSetMacCfg(HSM_L1_RtCtxType *pCtx, HSM_Ln_HashMacCfgType *ptCfg)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
hsm_uint32_t u32Temp;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SCATTER_HASH == pCtx->eOperationCata) &&
(HSM_L1_SCATTER_HASH_READY == pCtx->tL1AlgCtx.tScatterHash.eState))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
if (ptCfg->u32KeyByteCnt <= (4 * 0x20))
{
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.bGenerateMacEn = ptCfg->bGenerateMacEn;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.bGenerateMacEn =
ptCfg->bGenerateMacEn;
if (HSM_FALSE != ptCfg->bGenerateMacEn)
{
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.eMacType = ptCfg->eMacType;
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.u32KeyByteCnt = ptCfg->u32KeyByteCnt;
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.u32GenerateMacByteCnt =
ptCfg->u32GenerateMacByteCnt;
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.eKeyDataFmt = ptCfg->eKeyDataFmt;
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.bKeyUseId = ptCfg->bKeyUseId;
if (HSM_FALSE == ptCfg->bKeyUseId)
{
u32Temp = ((ptCfg->u32KeyByteCnt + 3u) >> 2u) << 2u;
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tScatterHash.aMacKeyCache[0])),
0,
u32Temp);
hsm_memcpy((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tScatterHash.aMacKeyCache[0])),
ptCfg->tHashMacKeyInfo.pKeyData,
ptCfg->u32KeyByteCnt);
if (HSM_DATA_FORMAT_1B == ptCfg->eKeyDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tScatterHash.aMacKeyCache[0])),
u32Temp >> 2u);
}
/* else do nothing */
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.tHashMacKeyInfo.pKeyData =
(const hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tScatterHash.aMacKeyCache[0]));
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.tKeyInfo.pKeyData =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.tHashMacKeyInfo.pKeyData;
}
else
{
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.tHashMacKeyInfo.u32KeyId =
ptCfg->tHashMacKeyInfo.u32KeyId;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.tKeyInfo.u32KeyId =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.tHashMacKeyInfo.u32KeyId;
}
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.eMacType =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.eMacType;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32KeyByteCnt =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.u32KeyByteCnt;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32GenerateMacByteCnt =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.u32GenerateMacByteCnt;
}
else
{
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.tHashMacKeyInfo.pKeyData =
(const hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tScatterHash.aMacKeyCache[0]));
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.tKeyInfo.pKeyData =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.tHashMacKeyInfo.pKeyData;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
static HSM_StatusType hsm_l1_scatter_hash_init(HSM_L1_RtCtxType *pCtx, HSM_DataFormatType eInputFmt)
{
HSM_StatusType eRet = HSM_FW_ScatterHashInit(&(pCtx->tCmd),
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm,
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.bKeyUseId,
eInputFmt);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
/* else do nothing */
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
return eRet;
}
static HSM_StatusType hsm_l1_scatter_hash_update(HSM_L1_RtCtxType *pCtx, HSM_DataFormatType eInputFmt)
{
HSM_StatusType eRet = HSM_FW_ScatterHashUpdate(&(pCtx->tCmd),
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm,
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.bKeyUseId,
eInputFmt);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
/* else do nothing */
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
return eRet;
}
static HSM_StatusType hsm_l1_scatter_hash_final(HSM_L1_RtCtxType *pCtx, HSM_DataFormatType eInputFmt)
{
HSM_StatusType eRet = HSM_FW_ScatterHashFinal(&(pCtx->tCmd),
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm,
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.bKeyUseId,
eInputFmt);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
/* else do nothing */
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
return eRet;
}
static HSM_StatusType hsm_l1_scatter_hash_init2final(HSM_L1_RtCtxType *pCtx,
HSMCom_ShaExType *pShaParm)
{
HSM_StatusType eRet =
HSM_FW_ShaEx(&(pCtx->tCmd), pShaParm, pCtx->tL1AlgCtx.tScatterHash.tMacCfg.bKeyUseId);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
return eRet;
}
/* when need more data, return again, when trigger successfully, return success, others error */
HSM_StatusType HSM_L1_ScatterHashInit(HSM_L1_RtCtxType *pCtx,
const HSM_ShaAlgType eAlg,
const HSM_Ln_ScatterHashType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
HSM_DataFormatType eCurDataFmt;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SCATTER_HASH == pCtx->eOperationCata) &&
(HSM_L1_SCATTER_HASH_READY == pCtx->tL1AlgCtx.tScatterHash.eState))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tScatterHash.u32TimeoutMs = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.eAlg = eAlg;
pCtx->tL1AlgCtx.tScatterHash.pOut = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.u32OutBufSize = 0;
pCtx->tL1AlgCtx.tScatterHash.eOutFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterHash.pOutSize = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize = 0;
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt = 0;
if (pCfg->u32DataSize <= HSM_HFAM_HW_PROCESS_ALIGN(eAlg))
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCfg->u32DataSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_INIT;
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt = pCfg->u32DataSize;
eRet = HSM_STATUS_AGAIN;
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
}
}
else /* data is enough for once at least */
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_INIT;
pCtx->tL1AlgCtx.tScatterHash.pInputData = pCfg->pData;
pCtx->tL1AlgCtx.tScatterHash.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize = pCfg->u32DataSize;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.eAlg = eAlg;
if ((0x3u == (((hsm_uint32_t)pCfg->pData) & 0x3u))
#if (FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM)
|| (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
#endif
)
{
if (pCfg->u32DataSize > sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf))
{
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize = sizeof(
pCtx->tL1AlgCtx.tScatterHash.aDataBuf);
}
else
{
if (0u == (pCfg->u32DataSize % HSM_HFAM_HW_PROCESS_ALIGN(eAlg)))
{
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize =
pCfg->u32DataSize - HSM_HFAM_HW_PROCESS_ALIGN(eAlg);
}
else
{
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize =
(pCfg->u32DataSize / HSM_HFAM_HW_PROCESS_ALIGN(eAlg)) *
HSM_HFAM_HW_PROCESS_ALIGN(eAlg);
}
}
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
(const hsm_uint8_t *)&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]);
}
eCurDataFmt = HSM_DATA_FORMAT_4B;
}
else /* start address 4 aligned */
{
if (0u == (pCfg->u32DataSize % HSM_HFAM_HW_PROCESS_ALIGN(eAlg)))
{
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize =
pCfg->u32DataSize - HSM_HFAM_HW_PROCESS_ALIGN(eAlg);
}
else
{
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize =
(pCfg->u32DataSize / HSM_HFAM_HW_PROCESS_ALIGN(eAlg)) *
HSM_HFAM_HW_PROCESS_ALIGN(eAlg);
}
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData = pCfg->pData;
eCurDataFmt = pCfg->eDataFmt;
}
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = hsm_l1_scatter_hash_init(pCtx, eCurDataFmt);
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
/* when need more data, return again, when trigger successfully, return success, others error */
HSM_StatusType HSM_L1_ScatterHashUpdate(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_ScatterHashType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_ScatterHashSMType eCurState = pCtx->tL1AlgCtx.tScatterHash.eState;
HSM_BoolType bInProcess;
HSM_DataFormatType eCurDataFmt;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SCATTER_HASH == pCtx->eOperationCata) &&
((HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_INIT == eCurState) ||
(HSM_L1_SCATTER_HASH_INIT_OK == eCurState) ||
(HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_UPDATE_FINAL == eCurState) ||
(HSM_L1_SCATTER_HASH_UPDATE_OK == eCurState)))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tScatterHash.u32TimeoutMs = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize = 0;
if ((HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_INIT == eCurState) ||
(HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_UPDATE_FINAL == eCurState))
{
if ((pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt + pCfg->u32DataSize) >
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf))
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_UPDATE;
pCtx->tL1AlgCtx.tScatterHash.pInputData = pCfg->pData;
pCtx->tL1AlgCtx.tScatterHash.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize = pCfg->u32DataSize;
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize =
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf) -
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt;
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize);
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf);
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
(const hsm_uint8_t *)&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]);
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt = 0u;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.eAlg =
pCtx->tL1AlgCtx.tScatterHash.eAlg;
eCurDataFmt = HSM_DATA_FORMAT_4B;
if (HSM_STATUS_SUCCESS == eRet)
{
if (HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_INIT == eCurState)
{
eRet = hsm_l1_scatter_hash_init(pCtx, eCurDataFmt);
}
else
{
eRet = hsm_l1_scatter_hash_update(pCtx, eCurDataFmt);
}
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
}
else
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCfg->u32DataSize);
if (HSM_STATUS_SUCCESS == eRet)
{
/* NOT change the state */
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt += pCfg->u32DataSize;
eRet = HSM_STATUS_AGAIN;
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
}
}
}
else /* init ok / update ok */
{
if (pCfg->u32DataSize <= HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg))
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCfg->u32DataSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterHash.eState =
HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_UPDATE_FINAL;
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt = pCfg->u32DataSize;
eRet = HSM_STATUS_AGAIN;
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
}
}
else /* data is enough for once at least */
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_UPDATE;
pCtx->tL1AlgCtx.tScatterHash.pInputData = pCfg->pData;
pCtx->tL1AlgCtx.tScatterHash.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize = pCfg->u32DataSize;
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt = 0u;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.eAlg =
pCtx->tL1AlgCtx.tScatterHash.eAlg;
if ((0x3u == (((hsm_uint32_t)pCfg->pData) & 0x3))
#if (FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM)
|| (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
#endif
)
{
if (pCfg->u32DataSize > sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf))
{
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize = sizeof(
pCtx->tL1AlgCtx.tScatterHash.aDataBuf);
}
else
{
if (0u == (pCfg->u32DataSize %
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg)))
{
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize =
pCfg->u32DataSize -
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg);
}
else
{
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize =
(pCfg->u32DataSize /
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg)) *
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg);
}
}
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
(const hsm_uint8_t *)&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]);
}
eCurDataFmt = HSM_DATA_FORMAT_4B;
}
else /* start address 4 aligned */
{
if (0u == (pCfg->u32DataSize %
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg)))
{
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize =
pCfg->u32DataSize -
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg);
}
else
{
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize =
(pCfg->u32DataSize /
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg)) *
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg);
}
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
pCfg->pData;
eCurDataFmt = pCfg->eDataFmt;
}
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = hsm_l1_scatter_hash_update(pCtx, eCurDataFmt);
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
}
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
static const hsm_uint8_t aMd5[] = { 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e };
static const hsm_uint8_t aSha160[] = { 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55,
0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09 };
static const hsm_uint8_t aSha224[] = { 0xd1, 0x4a, 0x02, 0x8c, 0x2a, 0x3a, 0x2b, 0xc9, 0x47, 0x61,
0x02, 0xbb, 0x28, 0x82, 0x34, 0xc4, 0x15, 0xa2, 0xb0, 0x1f,
0x82, 0x8e, 0xa6, 0x2a, 0xc5, 0xb3, 0xe4, 0x2f };
static const hsm_uint8_t aSha256[] = { 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14,
0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24,
0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55 };
static const hsm_uint8_t aSha384[] = { 0x38, 0xb0, 0x60, 0xa7, 0x51, 0xac, 0x96, 0x38, 0x4c, 0xd9,
0x32, 0x7e, 0xb1, 0xb1, 0xe3, 0x6a, 0x21, 0xfd, 0xb7, 0x11,
0x14, 0xbe, 0x7, 0x43, 0x4c, 0xc, 0xc7, 0xbf, 0x63, 0xf6,
0xe1, 0xda, 0x27, 0x4e, 0xde, 0xbf, 0xe7, 0x6f, 0x65, 0xfb,
0xd5, 0x1a, 0xd2, 0xf1, 0x48, 0x98, 0xb9, 0x5b };
static const hsm_uint8_t aSha512[] = {
0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, 0xf1, 0x54, 0x28, 0x50, 0xd6, 0x6d, 0x80, 0x7,
0xd6, 0x20, 0xe4, 0x5, 0xb, 0x57, 0x15, 0xdc, 0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce,
0x47, 0xd0, 0xd1, 0x3c, 0x5d, 0x85, 0xf2, 0xb0, 0xff, 0x83, 0x18, 0xd2, 0x87, 0x7e, 0xec, 0x2f,
0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a, 0x81, 0xa5, 0x38, 0x32, 0x7a, 0xf9, 0x27, 0xda, 0x3e
};
static const hsm_uint8_t aSha512_224[] = { 0x6e, 0xd0, 0xdd, 0x2, 0x80, 0x6f, 0xa8,
0x9e, 0x25, 0xde, 0x6, 0xc, 0x19, 0xd3,
0xac, 0x86, 0xca, 0xbb, 0x87, 0xd6, 0xa0,
0xdd, 0xd0, 0x5c, 0x33, 0x3b, 0x84, 0xf4 };
static const hsm_uint8_t aSha512_256[] = { 0xc6, 0x72, 0xb8, 0xd1, 0xef, 0x56, 0xed, 0x28,
0xab, 0x87, 0xc3, 0x62, 0x2c, 0x51, 0x14, 0x6,
0x9b, 0xdd, 0x3a, 0xd7, 0xb8, 0xf9, 0x73, 0x74,
0x98, 0xd0, 0xc0, 0x1e, 0xce, 0xf0, 0x96, 0x7a };
static const hsm_uint8_t aSm3[] = { 0x1a, 0xb2, 0x1d, 0x83, 0x55, 0xcf, 0xa1, 0x7f,
0x8e, 0x61, 0x19, 0x48, 0x31, 0xe8, 0x1a, 0x8f,
0x22, 0xbe, 0xc8, 0xc7, 0x28, 0xfe, 0xfb, 0x74,
0x7e, 0xd0, 0x35, 0xeb, 0x50, 0x82, 0xaa, 0x2b };
static const hsm_uint8_t *aHashArray[] = { &(aMd5[0]), &(aSha160[0]), &(aSha224[0]),
&(aSha256[0]), &(aSha384[0]), &(aSha512[0]),
&(aSha512_224[0]), &(aSha512_256[0]), &(aSm3[0]) };
static const hsm_uint8_t aHashDataSize[] = {
sizeof(aMd5), sizeof(aSha160), sizeof(aSha224), sizeof(aSha256), sizeof(aSha384),
sizeof(aSha512), sizeof(aSha512_224), sizeof(aSha512_256), sizeof(aSm3)
};
HSM_StatusType hsm_aux_get_empty_data_hash(HSM_ShaAlgType eHash,
const hsm_uint8_t **ppHashData,
hsm_uint32_t *pByteCnt)
{
HSM_StatusType eRet;
if (eHash < (sizeof(aHashArray) / sizeof(hsm_uint8_t *)))
{
*ppHashData = aHashArray[eHash];
*pByteCnt = aHashDataSize[eHash];
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
/* when need more data, return again, when trigger successfully, return success, others error */
HSM_StatusType HSM_L1_ScatterHashFinal(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_ScatterHashType *pCfg,
const HSM_Ln_ResultBufInfoType *pResult,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_ScatterHashSMType eCurState = pCtx->tL1AlgCtx.tScatterHash.eState;
HSM_BoolType bInProcess;
HSM_DataFormatType eCurDataFmt;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SCATTER_HASH == pCtx->eOperationCata) &&
((HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_INIT == eCurState) ||
(HSM_L1_SCATTER_HASH_INIT_OK == eCurState) ||
(HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_UPDATE_FINAL == eCurState) ||
(HSM_L1_SCATTER_HASH_UPDATE_OK == eCurState)))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tScatterHash.u32TimeoutMs = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.pOut = pResult->pData;
pCtx->tL1AlgCtx.tScatterHash.u32OutBufSize = pResult->u32DataBufSize;
pCtx->tL1AlgCtx.tScatterHash.eOutFmt = pResult->eDataFmt;
pCtx->tL1AlgCtx.tScatterHash.pOutSize = pResult->pDataSize;
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_FINAL;
pCtx->tL1AlgCtx.tScatterHash.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize = 0;
if ((HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_INIT == eCurState) ||
(HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_UPDATE_FINAL == eCurState) ||
(((hsm_uint32_t)pCfg->pData) & 0x3)
#if (FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM)
|| (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
#endif
)
{
if ((pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt + pCfg->u32DataSize) >
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf))
{
pCtx->tL1AlgCtx.tScatterHash.pInputData = pCfg->pData;
pCtx->tL1AlgCtx.tScatterHash.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize = pCfg->u32DataSize;
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize =
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf) -
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt;
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize);
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt = 0u;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.eAlg =
pCtx->tL1AlgCtx.tScatterHash.eAlg;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf);
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
(const hsm_uint8_t *)&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]);
eCurDataFmt = HSM_DATA_FORMAT_4B;
if (HSM_STATUS_SUCCESS == eRet)
{
if (HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_INIT == eCurState)
{
eRet = hsm_l1_scatter_hash_init(pCtx, eCurDataFmt);
}
else
{
eRet = hsm_l1_scatter_hash_update(pCtx, eCurDataFmt);
}
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
}
else if ((pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt + pCfg->u32DataSize) > 0)
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCfg->u32DataSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt += pCfg->u32DataSize;
if (HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_INIT == eCurState)
{
HSMCom_ShaExType *pShaParm = (HSMCom_ShaExType *)HSM_ADDRESS_UP_ALIGN(&(
pCtx->tL1AlgCtx.tScatterHash.tScatterHashParamShared.aShaParmBuf[0]));
pShaParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pShaParm->u32Timeout = u32TimeoutMs;
pShaParm->tCfg.eAlg = pCtx->tL1AlgCtx.tScatterHash.eAlg;
pShaParm->tCfg.tCfg.bGenerateMacEn =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.bGenerateMacEn;
pShaParm->tCfg.tCfg.eMacType =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.eMacType;
if (HSM_TRUE == (pCtx->tL1AlgCtx.tScatterHash.tMacCfg.bKeyUseId))
{
pShaParm->tCfg.tCfg.tKeyInfo.u32KeyId =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.tHashMacKeyInfo.u32KeyId;
}
else
{
pShaParm->tCfg.tCfg.tKeyInfo.pKeyData =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.tHashMacKeyInfo.pKeyData;
}
pShaParm->tCfg.tCfg.u32KeyByteCnt =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.u32KeyByteCnt;
pShaParm->tCfg.tCfg.u32GenerateMacByteCnt =
pCtx->tL1AlgCtx.tScatterHash.tMacCfg.u32GenerateMacByteCnt;
pShaParm->tCfg.tCfg.pInputData = (const hsm_uint8_t *)&(
pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]);
pShaParm->tCfg.tCfg.u32InputDataByteCnt =
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt;
pShaParm->tCfg.pResult = (HSM_ShaResultBufType *)HSM_ADDRESS_UP_ALIGN(&(
pCtx->tL1AlgCtx.tScatterHash.tScatterHashResultShared.aShaResultBuf[0]));
pShaParm->tCfg.eInputFmt = HSM_DATA_FORMAT_4B;
pShaParm->tCfg.eOutputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt = 0;
eRet = hsm_l1_scatter_hash_init2final(pCtx, pShaParm);
}
else
{
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.eAlg =
pCtx->tL1AlgCtx.tScatterHash.eAlg;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
(const hsm_uint8_t *)&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]);
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt = 0u;
eCurDataFmt = HSM_DATA_FORMAT_4B;
eRet = hsm_l1_scatter_hash_final(pCtx, eCurDataFmt);
}
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
}
}
else
{
if (HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_INIT == eCurState)
{
eRet = HSM_STATUS_FINISH;
if (pResult->pData != NULL_PTR)
{
hsm_uint32_t u32Size;
const hsm_uint8_t *pHashData;
eRet = hsm_aux_get_empty_data_hash(pCtx->tL1AlgCtx.tScatterHash.eAlg,
&pHashData,
&u32Size);
if (HSM_STATUS_SUCCESS == eRet)
{
if (pResult->u32DataBufSize > u32Size)
{
hsm_1B4B_convert_from_idx(pResult->eDataFmt,
pResult->pData,
0,
pResult->u32DataBufSize,
HSM_DATA_FORMAT_1B,
pHashData,
0,
u32Size);
}
else
{
u32Size = pResult->u32DataBufSize;
hsm_1B4B_convert_from_idx(pResult->eDataFmt,
pResult->pData,
0,
pResult->u32DataBufSize,
HSM_DATA_FORMAT_1B,
pHashData,
0,
pResult->u32DataBufSize);
}
if (pResult->pDataSize != NULL_PTR)
{
hsm_memcpy(pResult->pDataSize, &u32Size, sizeof(u32Size));
}
/* else do nothing */
}
/* else do nothing */
}
}
else
{
eRet = HSM_STATUS_ERROR_STOP;
}
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
}
}
else /* init ok/update ok, 4B, input address 4bytes aligned */
{
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.eAlg =
pCtx->tL1AlgCtx.tScatterHash.eAlg;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
pCfg->u32DataSize;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
(const hsm_uint8_t *)pCfg->pData;
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt = 0u;
eCurDataFmt = pCfg->eDataFmt;
eRet = hsm_l1_scatter_hash_final(pCtx, eCurDataFmt);
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
/* get result return success, trigger next process return again, others error */
HSM_StatusType HSM_L1_ScatterHash_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_ScatterHashSMType eCurState = pCtx->tL1AlgCtx.tScatterHash.eState;
hsm_uint32_t u32Temp;
HSM_DataFormatType eCurDataFmt;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32HSMStatusRet)
{
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt = 0;
if ((HSM_L1_SCATTER_HASH_INIT == eCurState) || (HSM_L1_SCATTER_HASH_UPDATE == eCurState))
{
if (pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize <=
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize)
{
if (HSM_L1_SCATTER_HASH_INIT == eCurState)
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_INIT_OK;
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_UPDATE_OK;
}
pCtx->eStat = HSM_DRV_SM_STOP;
pCtx->tL1AlgCtx.tScatterHash.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize = 0;
}
else
{
u32Temp = pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize -
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize;
if (u32Temp <= HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg))
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCtx->tL1AlgCtx.tScatterHash.eInputFmt,
pCtx->tL1AlgCtx.tScatterHash.pInputData,
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize,
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize);
pCtx->tL1AlgCtx.tScatterHash.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize = 0;
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterHash.eState =
HSM_L1_SCATTER_HASH_NEED_MORE_BEFORE_UPDATE_FINAL;
pCtx->tL1AlgCtx.tScatterHash.u32CacheDataByteCnt = u32Temp;
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
}
}
else /* data is enough for once at least */
{
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32Timeout =
pCtx->tL1AlgCtx.tScatterHash.u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.eAlg =
pCtx->tL1AlgCtx.tScatterHash.eAlg;
if (
#if (FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM)
(HSM_DATA_FORMAT_1B == pCtx->tL1AlgCtx.tScatterHash.eInputFmt) ||
#endif
(((hsm_uint32_t)pCtx->tL1AlgCtx.tScatterHash.pInputData) & 0x3) ||
(pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize & 0x3))
{
if (u32Temp > sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf))
{
u32Temp = sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf);
}
else
{
if (0u == (u32Temp %
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg)))
{
u32Temp = (u32Temp - HSM_HFAM_HW_PROCESS_ALIGN(
pCtx->tL1AlgCtx.tScatterHash.eAlg));
}
else
{
u32Temp =
((u32Temp /
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg)) *
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg));
}
}
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCtx->tL1AlgCtx.tScatterHash.eInputFmt,
pCtx->tL1AlgCtx.tScatterHash.pInputData,
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize,
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize + u32Temp);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
u32Temp;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
(const hsm_uint8_t *)&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]);
}
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize += u32Temp;
eCurDataFmt = HSM_DATA_FORMAT_4B;
}
else /* start address 4 aligned */
{
if (0u ==
(u32Temp % HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg)))
{
u32Temp = u32Temp -
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg);
}
else
{
u32Temp = (u32Temp /
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg)) *
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg);
}
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
u32Temp;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
pCtx->tL1AlgCtx.tScatterHash.pInputData +
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize += u32Temp;
eCurDataFmt = pCtx->tL1AlgCtx.tScatterHash.eInputFmt;
}
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = hsm_l1_scatter_hash_update(pCtx, eCurDataFmt);
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
/* else do nothing */
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
/* else do nothing */
}
}
}
else if (HSM_L1_SCATTER_HASH_FINAL == eCurState)
{
pCtx->eStat = HSM_DRV_SM_STOP;
if (pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize <=
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize)
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
if ((pCtx->tL1AlgCtx.tScatterHash.pOut != NULL_PTR))
{
eRet = hsm_hash_get_result_byte_count(
(HFAM_MODE_E)pCtx->tL1AlgCtx.tScatterHash.eAlg,
&u32Temp);
if (HSM_STATUS_SUCCESS == eRet)
{
if (HSM_DATA_FORMAT_1B == pCtx->tL1AlgCtx.tScatterHash.eOutFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)(pCtx->tL1AlgCtx.tScatterHash
.pScatterHashParm->tCfg.pResult),
u32Temp / 4U); /* all result data size is 4*N */
}
else
{
}
if (pCtx->tL1AlgCtx.tScatterHash.u32OutBufSize <= u32Temp)
{
u32Temp = pCtx->tL1AlgCtx.tScatterHash.u32OutBufSize;
}
/* else do nothing */
hsm_memcpy(pCtx->tL1AlgCtx.tScatterHash.pOut,
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.pResult,
u32Temp);
if (NULL_PTR != pCtx->tL1AlgCtx.tScatterHash.pOutSize)
{
hsm_memcpy(pCtx->tL1AlgCtx.tScatterHash.pOutSize,
&u32Temp,
sizeof(u32Temp));
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_HW_ERR;
}
}
/* else do nothing */
pCtx->tL1AlgCtx.tScatterHash.pOut = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.u32OutBufSize = 0;
pCtx->tL1AlgCtx.tScatterHash.eOutFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterHash.pOutSize = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterHash.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize = 0;
}
else
{
u32Temp = pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize -
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize;
if (u32Temp <= HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg))
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCtx->tL1AlgCtx.tScatterHash.eInputFmt,
pCtx->tL1AlgCtx.tScatterHash.pInputData,
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize,
pCtx->tL1AlgCtx.tScatterHash.u32InputTotalSize);
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize += u32Temp;
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32Timeout =
pCtx->tL1AlgCtx.tScatterHash.u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.eAlg =
pCtx->tL1AlgCtx.tScatterHash.eAlg;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
u32Temp;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
(const hsm_uint8_t *)&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]);
eCurDataFmt = HSM_DATA_FORMAT_4B;
eRet = hsm_l1_scatter_hash_final(pCtx, eCurDataFmt);
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
/* else do nothing */
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
}
}
else /* data is enough for once at least */
{
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->u32Timeout =
pCtx->tL1AlgCtx.tScatterHash.u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.eAlg =
pCtx->tL1AlgCtx.tScatterHash.eAlg;
if (
#if (FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM)
(HSM_DATA_FORMAT_1B == pCtx->tL1AlgCtx.tScatterHash.eInputFmt) ||
#endif
(((hsm_uint32_t)pCtx->tL1AlgCtx.tScatterHash.pInputData) & 0x3) ||
(pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize & 0x3))
{
if (u32Temp > sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf))
{
u32Temp = sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf);
}
else
{
if (0u == (u32Temp %
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg)))
{
u32Temp = (u32Temp - HSM_HFAM_HW_PROCESS_ALIGN(
pCtx->tL1AlgCtx.tScatterHash.eAlg));
}
else
{
u32Temp =
((u32Temp /
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg)) *
HSM_HFAM_HW_PROCESS_ALIGN(pCtx->tL1AlgCtx.tScatterHash.eAlg));
}
}
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterHash.aDataBuf),
pCtx->tL1AlgCtx.tScatterHash.eInputFmt,
pCtx->tL1AlgCtx.tScatterHash.pInputData,
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize,
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize + u32Temp);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
u32Temp;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
(const hsm_uint8_t *)&(pCtx->tL1AlgCtx.tScatterHash.aDataBuf[0]);
}
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize += u32Temp;
eCurDataFmt = HSM_DATA_FORMAT_4B;
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = hsm_l1_scatter_hash_update(pCtx, eCurDataFmt);
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
/* else do nothing */
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
}
else /* start address 4 aligned */
{
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.u32InputDataByteCnt =
u32Temp;
pCtx->tL1AlgCtx.tScatterHash.pScatterHashParm->tCfg.tCfg.pInputData =
pCtx->tL1AlgCtx.tScatterHash.pInputData +
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterHash.u32ProcessedSize += u32Temp;
eCurDataFmt = pCtx->tL1AlgCtx.tScatterHash.eInputFmt;
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = hsm_l1_scatter_hash_final(pCtx, eCurDataFmt);
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
/* else do nothing */
}
else
{
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
eRet = HSM_STATUS_ERROR;
}
}
}
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->tL1AlgCtx.tScatterHash.eState = HSM_L1_SCATTER_HASH_STOP;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_ScatterHashPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SCATTER_HASH == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_ScatterHash_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_ScatterHashExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SCATTER_HASH == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_ScatterCMacSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_SCATTER_CMAC;
pCtx->eStat = HSM_DRV_SM_READY;
hsm_memset(&(pCtx->tL1AlgCtx.tScatterCMac), 0, sizeof(pCtx->tL1AlgCtx.tScatterCMac));
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_READY;
pCtx->tL1AlgCtx.tScatterCMac.pOut = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.pOutSize = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm = (HSMCom_AesmRawApiType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tScatterCMac.tScatterCMacParamShared.aScatterCMacParmBuf[0]));
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.pCtx1 = &(
pCtx->tL1AlgCtx.tScatterCMac.tScatterCMacResultShared.aCMacCtx);
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.key_cfg = &(
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tKeyCfg);
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tKeyCfg.key_addr = &(
pCtx->tL1AlgCtx.tScatterCMac.aKeyData[0]);
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.key_cfg_en = 0x1; /* key enable */
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.aes_mode = 0x6; /* cmac */
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.enc_dec = 0x1; /* encrypt */
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.mst_en = 0x1; /* ahb enable */
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.icv_en = 0x0; /* not check result */
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.icv_len =
0x10; /* cmac result length */
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.aad_len = 0x0; /* not check result */
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.out_addr = &(
pCtx->tL1AlgCtx.tScatterCMac.tScatterCMacParamShared.aCMacParmBuf[0]);
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.iv_addr = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.dbg_wait = 0x0;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.iv_len = 0x0;
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
static HSM_StatusType hsm_l1_scatter_cmac_init(HSM_L1_RtCtxType *pCtx,
HSM_DataFormatType eInputFmt,
HSM_DataFormatType eKeyFmt)
{
HSM_StatusType eRet = HSM_FW_ScatterCMacInit(&(pCtx->tCmd),
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm,
eInputFmt,
eKeyFmt);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.aes_as = 0x1; /* init */
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
return eRet;
}
static HSM_StatusType hsm_l1_scatter_cmac_update(HSM_L1_RtCtxType *pCtx,
HSM_DataFormatType eInputFmt,
HSM_DataFormatType eKeyFmt)
{
HSM_StatusType eRet = HSM_FW_ScatterCMacUpdate(&(pCtx->tCmd),
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm,
eInputFmt,
eKeyFmt);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.aes_as = 0x0; /* update */
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
return eRet;
}
static HSM_StatusType hsm_l1_scatter_cmac_final(HSM_L1_RtCtxType *pCtx,
HSM_DataFormatType eInputFmt,
HSM_DataFormatType eKeyFmt)
{
HSM_StatusType eRet = HSM_FW_ScatterCMacFinal(&(pCtx->tCmd),
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm,
eInputFmt,
eKeyFmt);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.aes_as = 0x2; /* final */
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
return eRet;
}
static HSM_StatusType hsm_l1_scatter_cmac_init2final(HSM_L1_RtCtxType *pCtx, HSMCom_CMacExType *pParm)
{
HSM_StatusType eRet = HSM_CMacEx(&(pCtx->tCmd), pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
return eRet;
}
/* when need more data, return again, when trigger successfully, return success, others error */
HSM_StatusType HSM_L1_ScatterCMacInit(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_CMacCfgParmsType *pKeyCfg,
const HSM_Ln_ScatterCMacType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
hsm_uint32_t u32Temp = (pKeyCfg->eKeyType * 8) + 16;
HSM_DataFormatType eCurDataFmt;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SCATTER_CMAC == pCtx->eOperationCata) &&
(HSM_L1_SCATTER_CMAC_READY == pCtx->tL1AlgCtx.tScatterCMac.eState))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tScatterCMac.u32TimeoutMs = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterCMac.pOut = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.u32OutBufSize = 0;
pCtx->tL1AlgCtx.tScatterCMac.eOutFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterCMac.pOutSize = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize = 0;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt = 0;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt = 0;
pCtx->tL1AlgCtx.tScatterCMac.eUseKeyType = pKeyCfg->eUseKeyType;
pCtx->tL1AlgCtx.tScatterCMac.u32KeyId = pKeyCfg->u32KeyId;
pCtx->tL1AlgCtx.tScatterCMac.eKeyType = pKeyCfg->eKeyType;
pCtx->tL1AlgCtx.tScatterCMac.eBackend = pKeyCfg->eBackend;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32UserKeyID =
pCtx->tL1AlgCtx.tScatterCMac.u32KeyId;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tKeyCfg.key_type =
pCtx->tL1AlgCtx.tScatterCMac.eKeyType; /* normal key */
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tKeyCfg.key_sel =
0x1 - (pCtx->tL1AlgCtx.tScatterCMac.eUseKeyType & 0x1); /* normal key */
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.eng_sel =
pKeyCfg->eBackend; /* aes-cmac */
if ((HSM_AES_KEY_NEW == pKeyCfg->eUseKeyType))
{
if (0 == pCtx->tL1AlgCtx.tScatterCMac.u32KeyId)
{
if (u32Temp <= sizeof(pCtx->tL1AlgCtx.tScatterCMac.aKeyData))
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_1B,
&(pCtx->tL1AlgCtx.tScatterCMac.aKeyData[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aKeyData),
pKeyCfg->eKeyDataFmt,
pKeyCfg->pKeyAddr,
0,
u32Temp);
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
/* else do nothing */
}
else if (u32Temp > 32) /* max 256bits support */
{
eRet = HSM_STATUS_PARAM_ERR;
}
else
{
/* else do nothing */
}
if (HSM_STATUS_SUCCESS == eRet)
{
if (NULL_PTR == pCfg)
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_INIT;
eRet = HSM_STATUS_AGAIN;
}
else if (pCfg->u32DataSize < (2 * HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCfg->u32DataSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_INIT;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt = pCfg->u32DataSize;
eRet = HSM_STATUS_AGAIN;
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
}
}
else /* data is enough for once at least */
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_INIT;
pCtx->tL1AlgCtx.tScatterCMac.pInputData = pCfg->pData;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = pCfg->u32DataSize;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32Timeout = u32TimeoutMs;
if ((((hsm_uint32_t)pCfg->pData) & 0x3u)
#if (FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM)
|| (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
#endif
)
{
if (pCfg->u32DataSize >= (sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf) +
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize = sizeof(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf);
}
else
{
if (0u == (pCfg->u32DataSize % HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
pCfg->u32DataSize - HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
(pCfg->u32DataSize / HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()) *
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize -=
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
}
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr = &(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]);
}
eCurDataFmt = HSM_DATA_FORMAT_4B;
}
else /* start address 4 aligned */
{
if (0u == (pCfg->u32DataSize % HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
pCfg->u32DataSize - HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
(pCfg->u32DataSize / HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()) *
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize -=
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr = pCfg->pData;
eCurDataFmt = pCfg->eDataFmt;
}
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = hsm_l1_scatter_cmac_init(pCtx, eCurDataFmt, HSM_DATA_FORMAT_1B);
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
}
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
/* when need more data, return again, when trigger successfully, return success, others error */
HSM_StatusType HSM_L1_ScatterCMacUpdate(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_ScatterCMacType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_ScatterCMacSMType eCurState = pCtx->tL1AlgCtx.tScatterCMac.eState;
HSM_BoolType bInProcess;
HSM_DataFormatType eCurFmt;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SCATTER_CMAC == pCtx->eOperationCata) &&
((HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_INIT == eCurState) ||
(HSM_L1_SCATTER_CMAC_INIT_OK == eCurState) ||
(HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_UPDATE_FINAL == eCurState) ||
(HSM_L1_SCATTER_CMAC_UPDATE_OK == eCurState)))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tScatterCMac.u32TimeoutMs = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterCMac.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize = 0;
if ((HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_INIT == eCurState) ||
(HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_UPDATE_FINAL == eCurState))
{
if (NULL_PTR == pCfg)
{
eRet = HSM_STATUS_AGAIN;
}
else if ((pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt + pCfg->u32DataSize) <
(2 * HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCfg->u32DataSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt += pCfg->u32DataSize;
eRet = HSM_STATUS_AGAIN;
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
}
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_UPDATE;
pCtx->tL1AlgCtx.tScatterCMac.pInputData = pCfg->pData;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = pCfg->u32DataSize;
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf) -
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt;
if (pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize >
pCfg->u32DataSize) /* can cache all data */
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize = pCfg->u32DataSize;
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize);
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt +=
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
}
else
{
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize);
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt +=
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
}
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt =
(pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt /
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()) *
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
if (((pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt -
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt) +
(pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize -
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize)) < 16)
{
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt -= 16u;
}
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr = &(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]);
eCurFmt = HSM_DATA_FORMAT_4B;
if (HSM_STATUS_SUCCESS == eRet)
{
if (HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_INIT == eCurState)
{
eRet = hsm_l1_scatter_cmac_init(pCtx, eCurFmt, HSM_DATA_FORMAT_1B);
}
else
{
eRet = hsm_l1_scatter_cmac_update(pCtx, eCurFmt, HSM_DATA_FORMAT_1B);
}
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
}
}
else /* init ok / update ok */
{
if (NULL_PTR == pCfg)
{
eRet = HSM_STATUS_AGAIN;
}
else if (pCfg->u32DataSize < (2 * HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCfg->u32DataSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.eState =
HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_UPDATE_FINAL;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt = pCfg->u32DataSize;
eRet = HSM_STATUS_AGAIN;
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
}
}
else /* data is enough for once at least */
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_UPDATE;
pCtx->tL1AlgCtx.tScatterCMac.pInputData = pCfg->pData;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = pCfg->u32DataSize;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt = 0u;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt = 0u;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32Timeout = u32TimeoutMs;
if ((((hsm_uint32_t)pCfg->pData) & 0x3)
#if (FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM)
|| (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
#endif
)
{
if (pCfg->u32DataSize >= (sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf) +
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize = sizeof(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf);
}
else
{
if (0u == (pCfg->u32DataSize % HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
pCfg->u32DataSize - HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
(pCfg->u32DataSize / HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()) *
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize -=
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
}
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr = &(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]);
}
eCurFmt = HSM_DATA_FORMAT_4B;
}
else /* start address 4 aligned */
{
if (0u == (pCfg->u32DataSize % HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
pCfg->u32DataSize - HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
(pCfg->u32DataSize / HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()) *
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize -=
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr = pCfg->pData;
eCurFmt = pCfg->eDataFmt;
}
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = hsm_l1_scatter_cmac_update(pCtx, eCurFmt, HSM_DATA_FORMAT_1B);
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
}
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
/* when trigger successfully, return success, others error */
HSM_StatusType HSM_L1_ScatterCMacFinal(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_ScatterCMacType *pCfg,
const HSM_Ln_ResultBufInfoType *pResult,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_ScatterCMacSMType eCurState = pCtx->tL1AlgCtx.tScatterCMac.eState;
HSM_BoolType bInProcess;
HSM_DataFormatType eCurFmt;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SCATTER_CMAC == pCtx->eOperationCata) &&
((HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_INIT == eCurState) ||
(HSM_L1_SCATTER_CMAC_INIT_OK == eCurState) ||
(HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_UPDATE_FINAL == eCurState) ||
(HSM_L1_SCATTER_CMAC_UPDATE_OK == eCurState)))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tScatterCMac.u32TimeoutMs = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterCMac.pOut = pResult->pData;
pCtx->tL1AlgCtx.tScatterCMac.u32OutBufSize = pResult->u32DataBufSize;
pCtx->tL1AlgCtx.tScatterCMac.eOutFmt = pResult->eDataFmt;
pCtx->tL1AlgCtx.tScatterCMac.pOutSize = pResult->pDataSize;
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_FINAL;
pCtx->tL1AlgCtx.tScatterCMac.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize = 0;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt = 0;
if ((HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_INIT == eCurState) ||
(HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_UPDATE_FINAL == eCurState))
{
if ((pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt + pCfg->u32DataSize) <
(2 * HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCfg->u32DataSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt += pCfg->u32DataSize;
if (HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_INIT == eCurState)
{
HSMCom_CMacExType *pParm = (HSMCom_CMacExType *)HSM_ADDRESS_UP_ALIGN(&(
pCtx->tL1AlgCtx.tScatterCMac.tScatterCMacParamShared.aCMacParmBuf[0]));
/* convert from 4B to 1B */
hsm_u32_array_swap(
(hsm_uint32_t *)&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
(pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt + 3u) >> 2u);
pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pParm->u32Timeout = u32TimeoutMs;
pParm->u32UserKeyID = pCtx->tL1AlgCtx.tScatterCMac.u32KeyId;
pParm->tCfg.eUseKeyType = HSM_AES_KEY_NEW;
pParm->tCfg.tNewKeyInf.eKeyType = pCtx->tL1AlgCtx.tScatterCMac.eKeyType;
pParm->tCfg.tNewKeyInf.pKeyAddr = (const hsm_uint8_t *)&(
pCtx->tL1AlgCtx.tScatterCMac.aKeyData[0]);
pParm->tCfg.u32GenMacByteCnt = 0x10;
pParm->tCfg.bCheckMacEn = HSM_FALSE;
pParm->tCfg.pDataInput = (const hsm_uint32_t *)&(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]);
pParm->tCfg.u32InputByteCnt =
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt;
pParm->tCfg.pDataOutput = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tScatterCMac.tScatterCMacResultShared
.aCMacResultBuf[0]));
pParm->tCfg.u32OutputMemSize = sizeof(
pCtx->tL1AlgCtx.tScatterCMac.tScatterCMacResultShared.aCMacResultBuf);
pParm->tCfg.eInputFmt = HSM_DATA_FORMAT_1B;
pParm->tCfg.eOutputFmt = HSM_DATA_FORMAT_4B;
pParm->tCfg.eEngine = pCtx->tL1AlgCtx.tScatterCMac.eBackend;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt = 0;
eRet = hsm_l1_scatter_cmac_init2final(pCtx, pParm);
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr =
(const hsm_uint8_t *)&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]);
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt = 0u;
eRet = hsm_l1_scatter_cmac_final(pCtx,
HSM_DATA_FORMAT_4B,
HSM_DATA_FORMAT_1B);
}
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
}
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.pInputData = pCfg->pData;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = pCfg->u32DataSize;
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf) -
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt;
if (pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize >
pCfg->u32DataSize) /* can cache all data */
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize = pCfg->u32DataSize;
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize);
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt +=
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
}
else
{
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize);
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt +=
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
}
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt =
(pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt /
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()) *
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
if (((pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt -
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt) +
(pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize -
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize)) < 16)
{
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt -= 16u;
}
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr = &(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]);
if (HSM_STATUS_SUCCESS == eRet)
{
if (HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_INIT == eCurState)
{
eRet = hsm_l1_scatter_cmac_init(pCtx,
HSM_DATA_FORMAT_4B,
HSM_DATA_FORMAT_1B);
}
else
{
eRet = hsm_l1_scatter_cmac_update(pCtx,
HSM_DATA_FORMAT_4B,
HSM_DATA_FORMAT_1B);
}
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
}
}
else /* init ok / update ok */
{
if (pCfg->u32DataSize < (2 * HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCfg->u32DataSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt = pCfg->u32DataSize;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr =
(const hsm_uint8_t *)&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]);
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt = 0u;
eRet = hsm_l1_scatter_cmac_final(pCtx, HSM_DATA_FORMAT_4B, HSM_DATA_FORMAT_1B);
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
}
}
else /* data is enough for once at least */
{
pCtx->tL1AlgCtx.tScatterCMac.pInputData = pCfg->pData;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = pCfg->u32DataSize;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt = 0u;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt = 0u;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32Timeout = u32TimeoutMs;
if ((((hsm_uint32_t)pCfg->pData) & 0x3)
#if (FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM)
|| (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
#endif
)
{
if (pCfg->u32DataSize >= (sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf) +
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize = sizeof(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf);
}
else
{
if (0u == (pCfg->u32DataSize % HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
pCfg->u32DataSize - HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
(pCfg->u32DataSize / HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()) *
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize -=
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
}
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
0,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCfg->eDataFmt,
pCfg->pData,
0,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr = &(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]);
}
eCurFmt = HSM_DATA_FORMAT_4B;
}
else /* start address 4 aligned */
{
if (0u == (pCfg->u32DataSize % HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
pCfg->u32DataSize - HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
(pCfg->u32DataSize / HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()) *
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize -=
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
}
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr = pCfg->pData;
eCurFmt = pCfg->eDataFmt;
}
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = hsm_l1_scatter_cmac_update(pCtx, eCurFmt, HSM_DATA_FORMAT_1B);
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
}
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
/* get result return success, trigger next process return again, others error */
HSM_StatusType HSM_L1_ScatterCMac_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_ScatterCMacSMType eCurState = pCtx->tL1AlgCtx.tScatterCMac.eState;
hsm_uint32_t u32Temp, u32Temp2;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32HSMStatusRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
if ((pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt != 0u) &&
(pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt <
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt))
{
hsm_memcpy(&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
((hsm_uint8_t *)&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0])) +
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt,
(((pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt -
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt) +
3) >>
2) << 2);
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt =
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt -
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt = 0u;
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt = 0u;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt = 0u;
}
if ((HSM_L1_SCATTER_CMAC_INIT == eCurState) || (HSM_L1_SCATTER_CMAC_UPDATE == eCurState))
{
if (pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize <=
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize)
{
if (pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt > 0u)
{
pCtx->tL1AlgCtx.tScatterCMac.eState =
HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_UPDATE_FINAL;
}
else
{
if (HSM_L1_SCATTER_CMAC_INIT == eCurState)
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_INIT_OK;
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_UPDATE_OK;
}
}
pCtx->tL1AlgCtx.tScatterCMac.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize = 0;
}
else
{
u32Temp = pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize -
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
if ((pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt + u32Temp) <
(2 * HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt,
pCtx->tL1AlgCtx.tScatterCMac.pInputData,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize,
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt += u32Temp;
pCtx->tL1AlgCtx.tScatterCMac.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = 0u;
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
0u; /* has cache all input data */
pCtx->tL1AlgCtx.tScatterCMac.eState =
HSM_L1_SCATTER_CMAC_NEED_MORE_BEFORE_UPDATE_FINAL;
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
}
}
else
{
u32Temp2 = sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf) -
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt;
if (u32Temp2 > u32Temp) /* can cache all data */
{
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt,
pCtx->tL1AlgCtx.tScatterCMac.pInputData,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize,
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize);
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize += u32Temp;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt += u32Temp;
}
else
{
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt,
pCtx->tL1AlgCtx.tScatterCMac.pInputData,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize + u32Temp2);
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize += u32Temp2;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt += u32Temp2;
}
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt =
(pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt /
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()) *
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
if (((pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt -
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt) +
(pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize -
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize)) < 16)
{
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt -= 16u;
}
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32Timeout =
pCtx->tL1AlgCtx.tScatterCMac.u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr = &(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]);
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = hsm_l1_scatter_cmac_update(pCtx, HSM_DATA_FORMAT_4B, HSM_DATA_FORMAT_1B);
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
/* else do nothing */
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
}
}
}
else if (HSM_L1_SCATTER_CMAC_FINAL == eCurState)
{
if ((pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize <=
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize) &&
(pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt ==
0u)) /* has processed all input data */
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
if ((pCtx->tL1AlgCtx.tScatterCMac.pOut != NULL_PTR))
{
u32Temp = 16u;
if (HSM_STATUS_SUCCESS == eRet)
{
if (HSM_DATA_FORMAT_1B == pCtx->tL1AlgCtx.tScatterCMac.eOutFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)(pCtx->tL1AlgCtx.tScatterCMac
.pScatterCMacParm->tCfg.pCtx1),
u32Temp / 4U); /* all result data size is 4*N */
}
else
{
}
if (pCtx->tL1AlgCtx.tScatterCMac.u32OutBufSize <= u32Temp)
{
u32Temp = pCtx->tL1AlgCtx.tScatterCMac.u32OutBufSize;
}
/* else do nothing */
hsm_memcpy(pCtx->tL1AlgCtx.tScatterCMac.pOut,
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.pCtx1,
u32Temp);
if (NULL_PTR != pCtx->tL1AlgCtx.tScatterCMac.pOutSize)
{
hsm_memcpy(pCtx->tL1AlgCtx.tScatterCMac.pOutSize,
&u32Temp,
sizeof(u32Temp));
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_HW_ERR;
}
}
/* else do nothing */
pCtx->tL1AlgCtx.tScatterCMac.pOut = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.u32OutBufSize = 0;
pCtx->tL1AlgCtx.tScatterCMac.eOutFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterCMac.pOutSize = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize = 0;
}
else
{
u32Temp = pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize -
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize;
if ((pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt + u32Temp) <
(2 * HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()))
{
eRet = hsm_1B4B_convert_from_idx(HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt,
pCtx->tL1AlgCtx.tScatterCMac.pInputData,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize,
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt += u32Temp;
pCtx->tL1AlgCtx.tScatterCMac.pInputData = NULL_PTR;
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt = HSM_DATA_FORMAT_4B;
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize = 0;
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize =
0u; /* has cache all input data */
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32Timeout =
pCtx->tL1AlgCtx.tScatterCMac.u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr = &(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]);
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt = 0u;
eRet = hsm_l1_scatter_cmac_final(pCtx, HSM_DATA_FORMAT_4B, HSM_DATA_FORMAT_1B);
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
/* else do nothing */
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
}
}
else
{
u32Temp2 = sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf) -
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt;
if (u32Temp2 > u32Temp) /* can cache all data */
{
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt,
pCtx->tL1AlgCtx.tScatterCMac.pInputData,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize,
pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize);
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize += u32Temp;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt += u32Temp;
}
else
{
eRet = hsm_1B4B_convert_from_idx(
HSM_DATA_FORMAT_4B,
&(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]),
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt,
sizeof(pCtx->tL1AlgCtx.tScatterCMac.aDataBuf),
pCtx->tL1AlgCtx.tScatterCMac.eInputFmt,
pCtx->tL1AlgCtx.tScatterCMac.pInputData,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize,
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize + u32Temp2);
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize += u32Temp2;
pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt += u32Temp2;
}
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt =
(pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt /
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN()) *
HSM_AESM_SCATTER_CMAC_HW_PROCESS_ALIGN();
if (((pCtx->tL1AlgCtx.tScatterCMac.u32CacheDataByteCnt -
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt) +
(pCtx->tL1AlgCtx.tScatterCMac.u32InputTotalSize -
pCtx->tL1AlgCtx.tScatterCMac.u32ProcessedSize)) < 16)
{
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt -= 16u;
}
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32HSMStatusRet =
MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->u32Timeout =
pCtx->tL1AlgCtx.tScatterCMac.u32TimeoutMs;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.data_len =
pCtx->tL1AlgCtx.tScatterCMac.u32CacheProcByteCnt;
pCtx->tL1AlgCtx.tScatterCMac.pScatterCMacParm->tCfg.tCfg.in_addr = &(
pCtx->tL1AlgCtx.tScatterCMac.aDataBuf[0]);
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = hsm_l1_scatter_cmac_update(pCtx, HSM_DATA_FORMAT_4B, HSM_DATA_FORMAT_1B);
if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
/* else do nothing */
}
else
{
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
eRet = HSM_STATUS_ERROR;
}
}
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->tL1AlgCtx.tScatterCMac.eState = HSM_L1_SCATTER_CMAC_STOP;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_ScatterCMacPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SCATTER_CMAC == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_ScatterCMac_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_ScatterCMacExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SCATTER_CMAC == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccSignSetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32BitCnt)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((u32BitCnt <= 1024) && (u32BitCnt >= 1u))
{
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_ECC_SIGN;
pCtx->tL1AlgCtx.tEccSignInf.u32NBitCnt = u32BitCnt;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tEccSignInf.pParm = (HSMCom_EccSignType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aParmBuf[0]));
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.tCurve.pP =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aP[0]));
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.tCurve.pN =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aN[0]));
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.tCurve.pA =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aA[0]));
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.tCurve.pB =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aB[0]));
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.tCurve.pGx =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aGx[0]));
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.tCurve.pGy =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aGy[0]));
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.pPrivateKey = (const hsm_uint32_t *)
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aPrivate[0]));
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.pHashData =
(const hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aHash[0]));
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.pR = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aR[0]));
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.pS = (hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aS[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccSignExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_SIGN == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
/* For interrupt usage */
HSM_StatusType HSM_L1_EccSign(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_EccSignType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
hsm_uint32_t u32NByteCnt;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
const hsm_uint8_t *pStart;
hsm_uint32_t u32ActualSize;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_SIGN == pCtx->eOperationCata))
{
u32NByteCnt = ((pCtx->tL1AlgCtx.tEccSignInf.u32NBitCnt + 7u) / 8u);
if (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
{
if (pCfg->u32RBufByteCnt < u32NByteCnt)
{
eRet = HSM_STATUS_PARAM_ERR;
}
/* else do nothing */
if (pCfg->u32SBufByteCnt < u32NByteCnt)
{
eRet = HSM_STATUS_PARAM_ERR;
}
/* else do nothing */
}
else
{
u32NByteCnt = (((u32NByteCnt + 3u) / 4u) * 4u);
if (pCfg->u32RBufByteCnt < u32NByteCnt)
{
eRet = HSM_STATUS_PARAM_ERR;
}
/* else do nothing */
if (pCfg->u32SBufByteCnt < u32NByteCnt)
{
eRet = HSM_STATUS_PARAM_ERR;
}
/* else do nothing */
}
if (HSM_STATUS_SUCCESS == eRet)
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
u32NByteCnt = ((pCtx->tL1AlgCtx.tEccSignInf.u32NBitCnt + 63u) / 64u) * 8u;
pCtx->tL1AlgCtx.tEccSignInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tEccSignInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tEccSignInf.pParm->u32UserKeyID_PrivateKey = pCfg->u32PrivateKeyId;
pCtx->tL1AlgCtx.tEccSignInf.pParm->u32BitCnt =
pCtx->tL1AlgCtx.tEccSignInf.u32NBitCnt;
pCtx->tL1AlgCtx.tEccSignInf.pParm->u32EccCurve = pCfg->u32EccCurve;
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.u32ByteCount = u32NByteCnt;
pCtx->tL1AlgCtx.tEccSignInf.eOutFmt = pCfg->eDataFmt;
pCtx->tL1AlgCtx.tEccSignInf.pR = pCfg->pR;
pCtx->tL1AlgCtx.tEccSignInf.u32RBufByteCnt = pCfg->u32RBufByteCnt;
pCtx->tL1AlgCtx.tEccSignInf.pS = pCfg->pS;
pCtx->tL1AlgCtx.tEccSignInf.u32SBufByteCnt = pCfg->u32SBufByteCnt;
if (HSM_DRV_ECC_CURVE_PRM_IDX_MAX <= pCfg->u32EccCurve)
{
hsm_rm_prefix_zeros(pCfg->eDataFmt,
pCfg->tCurve.pP,
pCfg->tCurve.u32PByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aP[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aP[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eDataFmt,
pCfg->tCurve.pN,
pCfg->tCurve.u32NByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aN[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aN[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eDataFmt,
pCfg->tCurve.pA,
pCfg->tCurve.u32AByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aA[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aA[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eDataFmt,
pCfg->tCurve.pB,
pCfg->tCurve.u32BByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aB[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aB[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eDataFmt,
pCfg->tCurve.pGx,
pCfg->tCurve.u32GxByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aGx[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aGx[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
hsm_rm_prefix_zeros(pCfg->eDataFmt,
pCfg->tCurve.pGy,
pCfg->tCurve.u32GyByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aGy[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aGy[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aP[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aN[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aA[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aB[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aGx[0])),
u32NByteCnt / 4U);
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aGy[0])),
u32NByteCnt / 4U);
}
else
{
;
}
}
else
{
;
}
if (0u == pCfg->u32PrivateKeyId)
{
hsm_rm_prefix_zeros(pCfg->eDataFmt,
pCfg->pPrivate,
pCfg->u32PrivateByteCnt,
&pStart,
&u32ActualSize);
hsm_memset(
(void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aPrivate[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aPrivate[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aPrivate[0])),
u32NByteCnt / 4U);
}
else
{
;
}
}
else
{
;
}
hsm_rm_prefix_zeros(pCfg->eDataFmt,
pCfg->pHashData,
pCfg->u32HashDataByteCnt,
&pStart,
&u32ActualSize);
hsm_memset((void *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aHash[0])),
0,
u32NByteCnt - u32ActualSize);
hsm_memcpy(((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aHash[0]))) +
(u32NByteCnt - u32ActualSize),
pStart,
u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tEccSignInf.aHash[0])),
u32NByteCnt / 4U);
}
else
{
;
}
eRet = HSM_FW_EccSign(&(pCtx->tCmd), pCtx->tL1AlgCtx.tEccSignInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
/* else do nothing */
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccSign_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
hsm_uint32_t u32OutSize;
const hsm_uint8_t *pStart;
hsm_uint32_t u32ActualSize;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tEccSignInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
if (HSM_DATA_FORMAT_1B == pCtx->tL1AlgCtx.tEccSignInf.eOutFmt)
{
hsm_u32_array_swap(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aR[0])),
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.u32ByteCount / 4U);
hsm_u32_array_swap(
(hsm_uint32_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aS[0])),
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.u32ByteCount / 4U);
}
hsm_rm_prefix_zeros(
pCtx->tL1AlgCtx.tEccSignInf.eOutFmt,
(const hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aR[0])),
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.u32ByteCount,
&pStart,
&u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCtx->tL1AlgCtx.tEccSignInf.eOutFmt)
{
u32OutSize = ((pCtx->tL1AlgCtx.tEccSignInf.u32NBitCnt + 7u) / 8u);
if (u32ActualSize <= u32OutSize)
{
hsm_memcpy(pCtx->tL1AlgCtx.tEccSignInf.pR,
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aR[0]))) +
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.u32ByteCount - u32OutSize,
u32OutSize);
}
else
{
eRet = HSM_STATUS_ERROR;
}
}
else
{
u32OutSize = ((pCtx->tL1AlgCtx.tEccSignInf.u32NBitCnt + 31u) / 32u) * 4u;
if (u32ActualSize <= u32OutSize)
{
hsm_memcpy(pCtx->tL1AlgCtx.tEccSignInf.pR,
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aR[0]))) +
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.u32ByteCount - u32OutSize,
u32OutSize);
}
else
{
eRet = HSM_STATUS_ERROR;
}
}
hsm_rm_prefix_zeros(
pCtx->tL1AlgCtx.tEccSignInf.eOutFmt,
(const hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aS[0])),
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.u32ByteCount,
&pStart,
&u32ActualSize);
if (HSM_DATA_FORMAT_1B == pCtx->tL1AlgCtx.tEccSignInf.eOutFmt)
{
u32OutSize = ((pCtx->tL1AlgCtx.tEccSignInf.u32NBitCnt + 7u) / 8u);
if (u32ActualSize <= u32OutSize)
{
hsm_memcpy(pCtx->tL1AlgCtx.tEccSignInf.pS,
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aS[0]))) +
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.u32ByteCount - u32OutSize,
u32OutSize);
}
else
{
eRet = HSM_STATUS_ERROR;
}
}
else
{
u32OutSize = ((pCtx->tL1AlgCtx.tEccSignInf.u32NBitCnt + 31u) / 32u) * 4u;
if (u32ActualSize <= u32OutSize)
{
hsm_memcpy(pCtx->tL1AlgCtx.tEccSignInf.pS,
((hsm_uint8_t *)HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tEccSignInf.aS[0]))) +
pCtx->tL1AlgCtx.tEccSignInf.pParm->tCfg.u32ByteCount - u32OutSize,
u32OutSize);
}
else
{
eRet = HSM_STATUS_ERROR;
}
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_ERROR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_EccSignPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_SIGN == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_EccSign_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_EccSignReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_ECC_SIGN == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssVerifySetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32RsaBitCnt)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((u32RsaBitCnt <= 4096) && (u32RsaBitCnt >= 1u))
{
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_RSA_SSA_PSS_VERIFY;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.u32BitCnt = u32RsaBitCnt;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm = (HSMCom_RsaSsaPssVerifyType *)
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaSsaPssVerify.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssVerify(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPssVerifyType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
hsm_uint32_t u32HashLen;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) &&
(HSM_STATUS_SUCCESS ==
hsm_hash_get_result_byte_count((HFAM_MODE_E)pCfg->eHashType, &u32HashLen)) &&
(HSM_STATUS_SUCCESS ==
hsm_hash_get_result_byte_count((HFAM_MODE_E)pCfg->eMgfHashType, NULL_PTR)) &&
(((pCfg->u32EmBitCnt + 7u) >> 3u) >= (u32HashLen + pCfg->u32SaltByteCount + 2)))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PSS_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->u32UserKeyID_KEY_E = pCfg->u32KeyEId;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->u32UserKeyID_KEY_N = pCfg->u32KeyNId;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->u32RsaBitCnt =
pCtx->tL1AlgCtx.tRsaSsaPssVerify.u32BitCnt;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.u32EmBitCnt = pCfg->u32EmBitCnt;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.eMgfHashType = pCfg->eMgfHashType;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.eHashType = pCfg->eHashType;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.u32SaltByteCount = pCfg->u32SaltByteCount;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.eInputDataFmt = pCfg->eInputDataFmt;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.eInputType = pCfg->eInputType;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.pInputData = pCfg->pInputData;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.u32InputDataByteCount =
pCfg->u32InputDataByteCount;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.eSignDataFmt = pCfg->eSignDataFmt;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.pSignData = pCfg->pSignData;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.u32SignDataByteCount =
pCfg->u32SignDataByteCount;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.ePublicKeyDataFmt =
pCfg->ePublicKeyDataFmt;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.pPublicKey = pCfg->pPublicKey;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.u32PublicKeyByteCnt =
pCfg->u32PublicKeyByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.eKeyNDataFmt = pCfg->eKeyNDataFmt;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.pKeyN = pCfg->pKeyN;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->tCfg.u32KeyNByteCount = pCfg->u32KeyNByteCount;
pCtx->tL1AlgCtx.tRsaSsaPssVerify.pVerifyResult = pCfg->pVerifyResult;
eRet = HSM_FW_RsaSsaPssVerify(&(pCtx->tCmd), pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssVerifyPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PSS_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_RsaSsaPssVerify_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssVerifyReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PSS_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssVerify_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_PASS == pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_PASS;
if (NULL_PTR != pCtx->tL1AlgCtx.tRsaSsaPssVerify.pVerifyResult)
{
*pCtx->tL1AlgCtx.tRsaSsaPssVerify.pVerifyResult = CRYPTO_E_VER_OK;
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
else if (MAILBOXAPI_RET_FAIL == pCtx->tL1AlgCtx.tRsaSsaPssVerify.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_FAIL;
if (NULL_PTR != pCtx->tL1AlgCtx.tRsaSsaPssVerify.pVerifyResult)
{
*pCtx->tL1AlgCtx.tRsaSsaPssVerify.pVerifyResult = CRYPTO_E_VER_NOT_OK;
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_ERROR;
if (NULL_PTR != pCtx->tL1AlgCtx.tRsaSsaPssVerify.pVerifyResult)
{
*pCtx->tL1AlgCtx.tRsaSsaPssVerify.pVerifyResult = CRYPTO_E_VER_NOT_OK;
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssVerifyExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PSS_VERIFY == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15VerifySetupEnv(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32RsaBitCnt)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((u32RsaBitCnt <= 4096u) && (u32RsaBitCnt >= 1u))
{
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_RSA_SSA_PKCS1V15_VERIFY;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.u32BitCnt = u32RsaBitCnt;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm = (HSMCom_RsaSsaPkcs1V15VerifyType *)
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15Verify(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPkcs1v15VerifyType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
hsm_uint32_t u32HashLen;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg) &&
(HSM_STATUS_SUCCESS ==
hsm_hash_get_result_byte_count((HFAM_MODE_E)pCfg->eHashType, &u32HashLen)))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PKCS1V15_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->u32UserKeyID_KEY_E = pCfg->u32KeyEId;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->u32UserKeyID_KEY_N = pCfg->u32KeyNId;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->u32RsaBitCnt =
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.u32BitCnt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.eInputFmt = pCfg->eInputDataFmt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.u32EmByteCnt = pCfg->u32EmByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.eHashType = pCfg->eHashType;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.pInputData = pCfg->pInputData;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.u32InputDataByteCount =
pCfg->u32InputDataByteCount;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.pSignData = pCfg->pSignData;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.u32SignDataByteCount =
pCfg->u32SignDataByteCount;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.pPublicKey = pCfg->pPublicKey;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.u32PublicKeyByteCnt =
pCfg->u32PublicKeyByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.bUseInputDer = pCfg->bUseInputDer;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.pDer = pCfg->pDer;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.u32DerByteCount =
pCfg->u32DerByteCount;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.pKeyN = pCfg->pKeyN;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.u32KeyNByteCount =
pCfg->u32KeyNByteCount;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.eInputType =
HSM_RSA_SSA_INPUT_RAW_MESSAGE;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.eSignDataFmt = pCfg->eSignDataFmt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.ePublicKeyFmt = pCfg->ePublicKeyFmt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->tCfg.eKeyNFmt = pCfg->eKeyNFmt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pVerifyResult = pCfg->pVerifyResult;
eRet = HSM_FW_RsaSsaPkcs1v15Verify(&(pCtx->tCmd),
pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15VerifyPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PKCS1V15_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_RsaSsaPkcs1V15Verify_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15VerifyReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PKCS1V15_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15Verify_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_PASS == pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_PASS;
if (NULL_PTR != pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pVerifyResult)
{
*pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pVerifyResult = CRYPTO_E_VER_OK;
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
else if (MAILBOXAPI_RET_FAIL == pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_FAIL;
if (NULL_PTR != pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pVerifyResult)
{
*pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pVerifyResult = CRYPTO_E_VER_NOT_OK;
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_ERROR;
if (NULL_PTR != pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pVerifyResult)
{
*pCtx->tL1AlgCtx.tRsaSsaPkcs1V15Verify.pVerifyResult = CRYPTO_E_VER_NOT_OK;
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15VerifyExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PKCS1V15_VERIFY == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyImportSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_KEY_MANAGE_IMPORT;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tKeyInf.pParm = (HSMCom_UserKeyManageType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tKeyInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyImport(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_ImportUserKeyExtType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
void *pCache;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_IMPORT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
if (pCfg->u32DataLength > 0u)
{
pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tKeyInf.pParm->u32Timeout = u32TimeoutMs;
hsm_memcpy(&(pCtx->tL1AlgCtx.tKeyInf.pParm->tKMParam.tImportUserKeyExtCfg),
pCfg,
sizeof(pCtx->tL1AlgCtx.tKeyInf.pParm->tKMParam.tImportUserKeyExtCfg));
if (0u != (pCfg->u32KeyIdFix))
{
pCtx->tL1AlgCtx.tKeyInf.pParm->tKMParam.tImportUserKeyExtCfg.pKeyID = NULL_PTR;
}
if ((((hsm_uint32_t)(pCfg->pDataAddr)) & 0x3u) &&
(pCfg->u32DataLength <=
(sizeof(pCtx->tL1AlgCtx.tKeyInf.tKeyInfoShared.aAlignedDataBuffer) - 4u)))
{
pCache = (void *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tKeyInf.tKeyInfoShared.aAlignedDataBuffer[0]));
hsm_memcpy(pCache, pCfg->pDataAddr, pCfg->u32DataLength);
pCtx->tL1AlgCtx.tKeyInf.pParm->tKMParam.tImportUserKeyExtCfg.pDataAddr = pCache;
}
eRet = HSM_FW_UserKeyImportNew(&(pCtx->tCmd), pCtx->tL1AlgCtx.tKeyInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyImportPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_IMPORT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_KeyImport_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyImportReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_IMPORT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyImportExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_IMPORT == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyImport_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
#else
else if ((KEYMANAGER_STATUS_ID_ERROR | 0x80000000u) ==
pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_EXIST;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else if ((KEYMANAGER_STATUS_SPACE_ERROR | 0x80000000u) ==
pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SPACE_FULL;
pCtx->eStat = HSM_DRV_SM_STOP;
}
#endif
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
HSM_StatusType HSM_L1_KeyValidateSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_KEY_MANAGE_VALIDATE;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tKeyInf.pParm = (HSMCom_UserKeyManageType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tKeyInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyValidate(HSM_L1_RtCtxType *pCtx,
hsm_uint32_t u32KeyId,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if (NULL_PTR != pCtx)
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_VALIDATE == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tKeyInf.pParm->tKMParam.u32CheckUserKeyIDExt = u32KeyId;
pCtx->tL1AlgCtx.tKeyInf.pParm->u32Timeout = u32TimeoutMs;
eRet = HSM_FW_CheckKeyIdExt(&(pCtx->tCmd), pCtx->tL1AlgCtx.tKeyInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyValidatePoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_VALIDATE == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_KeyValidate_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyValidateReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_VALIDATE == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyValidateExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_VALIDATE == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyValidate_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_FAIL == pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_NOT_EXIST;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else if (MAILBOXAPI_RET_PASS == pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_EXIST;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
#endif
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
#else
HSM_StatusType HSM_L1_UpdateKeyIdContentSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_KEY_MANAGE_UPDATE_KEY_ID_CONTENT;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tKeyInf.pParm = (HSMCom_UserKeyManageType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tKeyInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_UpdateKeyIdContent(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_KeyManagerUpdateUserKeyType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if (NULL_PTR != pCtx)
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) &&
(HSM_OP_KEY_MANAGE_UPDATE_KEY_ID_CONTENT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tKeyInf.pParm->u32Timeout = u32TimeoutMs;
hsm_memcpy(&(pCtx->tL1AlgCtx.tKeyInf.pParm->tKMParam.tUpdateUserKeyCfg),
pCfg,
sizeof(*pCfg));
eRet = HSM_UpdateKeyContentOfSpecificKeyId(&(pCtx->tCmd),
pCtx->tL1AlgCtx.tKeyInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_UpdateKeyIdContentPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_UPDATE_KEY_ID_CONTENT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_UpdateKeyIdContent_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_UpdateKeyIdContentReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_UPDATE_KEY_ID_CONTENT == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_UpdateKeyIdContentExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_UPDATE_KEY_ID_CONTENT == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_UpdateKeyIdContent_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else if ((KEYMANAGER_STATUS_ID_ERROR | 0x80000000u) ==
pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_NOT_EXIST;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else if (((KEYMANAGER_STATUS_SPACE_ERROR | 0x80000000u) ==
pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet) ||
(KEYMANAGER_STATUS_ERROR == pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet))
{
eRet = HSM_STATUS_SPACE_FULL;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
#endif
HSM_StatusType HSM_L1_KeyCopySetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_KEY_MANAGE_COPY;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tKeyInf.pParm = (HSMCom_UserKeyManageType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tKeyInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyCopy(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_CopyUserKeyType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_COPY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tKeyInf.pParm->u32Timeout = u32TimeoutMs;
hsm_memcpy(&(pCtx->tL1AlgCtx.tKeyInf.pParm->tKMParam.tCopyUserKeyExtCfg),
pCfg,
sizeof(pCtx->tL1AlgCtx.tKeyInf.pParm->tKMParam.tCopyUserKeyExtCfg));
eRet = HSM_FW_CopyKeyExt(&(pCtx->tCmd), pCtx->tL1AlgCtx.tKeyInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyCopyPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_COPY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_KeyCopy_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyCopyReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_COPY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyCopyExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_COPY == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyCopy_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyRevokeSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_KEY_MANAGE_REVOKE;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tKeyInf.pParm = (HSMCom_UserKeyManageType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tKeyInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyRevoke(HSM_L1_RtCtxType *pCtx, hsm_uint32_t u32KeyId, hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if (NULL_PTR != pCtx)
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_REVOKE == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tKeyInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tKeyInf.pParm->tKMParam.u32RevokeUserKeyID = u32KeyId;
eRet = HSM_UserKeyRevoke(&(pCtx->tCmd), pCtx->tL1AlgCtx.tKeyInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyRevokePoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_REVOKE == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_KeyRevoke_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyRevokeReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_REVOKE == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyRevokeExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_REVOKE == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeyRevoke_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
#else
else if ((KEYMANAGER_STATUS_ID_ERROR | 0x80000000u) ==
pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_NOT_EXIST;
pCtx->eStat = HSM_DRV_SM_STOP;
}
#endif
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceTidyUpSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_KEY_MANAGE_TIDYUP;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm = (HSMCom_KeySpaceStatusType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tKeySpaceInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceTidyUp(HSM_L1_RtCtxType *pCtx,
HSM_Ln_KeySpaceStatusType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
HSM_Ln_KeySpaceStatusType *pKeySpaceStatusCfg = pCfg;
if (NULL_PTR == pCfg)
{
pKeySpaceStatusCfg = &(pCtx->tL1AlgCtx.tKeySpaceInf.tKeySpaceStatus);
}
if ((NULL_PTR != pCtx))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_TIDYUP == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm->pKMSpaceStatus = pKeySpaceStatusCfg;
pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm->u32Timeout = u32TimeoutMs;
eRet = HSM_TidyUpKeySpace(&(pCtx->tCmd), pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceTidyUpPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_TIDYUP == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_KeySpaceTidyup_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceTidyUpReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_TIDYUP == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceTidyUpExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_TIDYUP == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceTidyup_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceGetStatusSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_KEY_MANAGE_GETSTATUS;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm = (HSMCom_KeySpaceStatusType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tKeySpaceInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceGetStatus(HSM_L1_RtCtxType *pCtx,
HSM_Ln_KeySpaceStatusType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_GETSTATUS == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm->pKMSpaceStatus = pCfg;
pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm->u32Timeout = u32TimeoutMs;
eRet = HSM_GetKeySpaceStat(&(pCtx->tCmd), pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceGetStatusPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_GETSTATUS == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_KeySpaceTidyup_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceGetStatusReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_GETSTATUS == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceGetStatusExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_GETSTATUS == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_KeySpaceGetStatus_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tKeySpaceInf.pSpaceParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
HSM_StatusType HSM_L1_GetKeyIdStatusSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_KEY_MANAGE_GET_ID_STATUS;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tKeyInf.pParm = (HSMCom_UserKeyManageType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tKeyInf.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_GetKeyIdStatus(HSM_L1_RtCtxType *pCtx,
hsm_uint32_t u32KeyId,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if (NULL_PTR != pCtx)
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_GET_ID_STATUS == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tKeyInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tKeyInf.pParm->tKMParam.tKeyIdStatusExtCfg.u32KeyID = u32KeyId;
pCtx->tL1AlgCtx.tKeyInf.pParm->tKMParam.tKeyIdStatusExtCfg.pUserKeyStatus = &(
pCtx->tL1AlgCtx.tKeyInf.tKeyInfoShared.tKeyIdStatus);
eRet = HSM_FW_GetKeyIdStatus(&(pCtx->tCmd), pCtx->tL1AlgCtx.tKeyInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_GetKeyIdStatusPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_GET_ID_STATUS == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_GetKeyIdStatus_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_GetKeyIdStatusReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_GET_ID_STATUS == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_GetKeyIdStatusExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_KEY_MANAGE_GET_ID_STATUS == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_GetKeyIdStatus_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tKeyInf.pParm->u32HSMStatusRet)
{
if (KEYMANAGER_USERKEY_STATUS_NOT_EXIST == pCtx->tL1AlgCtx.tKeyInf.tKeyInfoShared.tKeyIdStatus)
{
eRet = HSM_STATUS_NOT_EXIST;
}
else if (KEYMANAGER_USERKEY_STATUS_EXIST_VALID ==
pCtx->tL1AlgCtx.tKeyInf.tKeyInfoShared.tKeyIdStatus)
{
eRet = HSM_STATUS_EXIST;
}
else if (KEYMANAGER_USERKEY_STATUS_EXIST_INVALID ==
pCtx->tL1AlgCtx.tKeyInf.tKeyInfoShared.tKeyIdStatus)
{
eRet = HSM_STATUS_ZOMBIE;
}
else
{
eRet = HSM_STATUS_ERROR;
}
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
#endif
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_RSA_SSA_PKCS1V15_SIGN;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm = (HSMCom_RsaSsaPkcs1v15SignType *)
HSM_ADDRESS_UP_ALIGN(&(pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignHash(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPkcs1V15SignHashType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PKCS1V15_SIGN == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32UserKeyID_KEY_E = pCfg->u32PrivateKeyId;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32UserKeyID_KEY_N = pCfg->u32KeyNId;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32RsaBitCnt = pCfg->u32RsaBitCnt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.eOutputFmt = pCfg->eOutputFmt;
if (pCfg->u32RsaBitCnt > 0u)
{
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32EmByteCnt =
(pCfg->u32RsaBitCnt + 7u) >> 3u;
}
else
{
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32EmByteCnt = 0u;
}
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.eHashType = pCfg->eHashType;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pInputData = pCfg->pHashData;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32InputDataByteCount =
pCfg->u32HashDataByteCount;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pPrivateKey = pCfg->pPrivateKey;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32PrivateKeyByteCnt =
pCfg->u32PrivateKeyByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.bUseInputDer = HSM_FALSE;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pDer = NULL_PTR;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32DerByteCount = 0u;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pKeyN = pCfg->pKeyN;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32KeyNByteCount =
pCfg->u32KeyNByteCount;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pResult = pCfg->pResult;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32ResultBufByteCnt =
pCfg->u32ResultBufByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pResultByteCnt = pCfg->pResultByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.eInputType =
HSM_RSA_SSA_INPUT_HASH_DATA;
#if (FC7XXX_HSM_SUBSYSTEM_TYPE != FC7240_HSM_SUBSYSTEM)
if (0u != pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32UserKeyID_KEY_E)
{
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pPrivateKey = NULL_PTR;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32PrivateKeyByteCnt = 0u;
}
if (0u != pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32UserKeyID_KEY_N)
{
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pKeyN = NULL_PTR;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32KeyNByteCount = 0u;
}
/* else do nothing */
#endif
eRet = HSM_FW_RsaSsaPkcs1v15Sign(&(pCtx->tCmd),
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignData(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPkcs1V15SignDataType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PKCS1V15_SIGN == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32UserKeyID_KEY_E = pCfg->u32PrivateKeyId;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32UserKeyID_KEY_N = pCfg->u32KeyNId;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32RsaBitCnt = pCfg->u32RsaBitCnt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.eOutputFmt = pCfg->eOutputFmt;
if (pCfg->u32RsaBitCnt > 0u)
{
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32EmByteCnt =
(pCfg->u32RsaBitCnt + 7u) >> 3u;
}
else
{
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32EmByteCnt = 0u;
}
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.eHashType = pCfg->eHashType;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pInputData = pCfg->pInputData;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32InputDataByteCount =
pCfg->u32InputDataByteCount;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pPrivateKey = pCfg->pPrivateKey;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32PrivateKeyByteCnt =
pCfg->u32PrivateKeyByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.bUseInputDer = HSM_FALSE;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pDer = NULL_PTR;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32DerByteCount = 0u;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pKeyN = pCfg->pKeyN;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32KeyNByteCount =
pCfg->u32KeyNByteCount;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pResult = pCfg->pResult;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32ResultBufByteCnt =
pCfg->u32ResultBufByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pResultByteCnt = pCfg->pResultByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.eInputType =
HSM_RSA_SSA_INPUT_RAW_MESSAGE;
#if (FC7XXX_HSM_SUBSYSTEM_TYPE != FC7240_HSM_SUBSYSTEM)
if (0u != pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32UserKeyID_KEY_E)
{
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pPrivateKey = NULL_PTR;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32PrivateKeyByteCnt = 0u;
}
if (0u != pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32UserKeyID_KEY_N)
{
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.pKeyN = NULL_PTR;
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->tCfg.u32KeyNByteCount = 0u;
}
/* else do nothing */
#endif
eRet = HSM_FW_RsaSsaPkcs1v15Sign(&(pCtx->tCmd),
pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PKCS1V15_SIGN == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_RsaSsaPkcs1V15Sign_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PKCS1V15_SIGN == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15SignExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PKCS1V15_SIGN == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPkcs1V15Sign_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tRsaSsaPkcs1v15Sign.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssSignSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_RSA_SSA_PSS_SIGN;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm = (HSMCom_RsaSsaPssSignType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tRsaSsaPssSign.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssSignData(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPssSignDataType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PSS_SIGN == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32UserKeyID_KEY_E = pCfg->u32PrivateKeyId;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32UserKeyID_KEY_N = pCfg->u32KeyNId;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32RsaBitCnt = pCfg->u32RsaBitCnt;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.bUsePseudoRand = HSM_TRUE;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.eMgfHashType = pCfg->eHashType;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.eOutputFmt = pCfg->eOutputFmt;
if (pCfg->u32RsaBitCnt > 0u)
{
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32EmBitCnt = pCfg->u32RsaBitCnt - 1u;
}
else
{
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32EmBitCnt = 0u;
}
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.eHashType = pCfg->eHashType;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.eInputType = HSM_RSA_SSA_INPUT_RAW_MESSAGE;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pInputData = pCfg->pInputData;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32InputDataByteCount =
pCfg->u32InputDataByteCount;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pPrivateKey = pCfg->pPrivateKey;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32PrivateKeyByteCnt =
pCfg->u32PrivateKeyByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.bUseInputSaltData = HSM_FALSE;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pSalt = NULL_PTR;
hsm_hash_get_result_byte_count(
(HFAM_MODE_E)pCfg->eHashType,
&pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32SaltByteCount);
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pKeyN = pCfg->pKeyN;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32KeyNByteCount = pCfg->u32KeyNByteCount;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pResult = pCfg->pResult;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32ResultBufByteCnt =
pCfg->u32ResultBufByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pResultByteCnt = pCfg->pResultByteCnt;
#if (FC7XXX_HSM_SUBSYSTEM_TYPE != FC7240_HSM_SUBSYSTEM)
if (0u != pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32UserKeyID_KEY_E)
{
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pPrivateKey = NULL_PTR;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32PrivateKeyByteCnt = 0u;
}
if (0u != pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32UserKeyID_KEY_N)
{
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pKeyN = NULL_PTR;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32KeyNByteCount = 0u;
}
/* else do nothing */
#endif
eRet = HSM_FW_RsaSsaPssSign(&(pCtx->tCmd), pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssSignHash(HSM_L1_RtCtxType *pCtx,
const HSM_Ln_RsaSsaPssSignHashType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PSS_SIGN == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32UserKeyID_KEY_E = pCfg->u32PrivateKeyId;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32UserKeyID_KEY_N = pCfg->u32KeyNId;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32RsaBitCnt = pCfg->u32RsaBitCnt;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.bUsePseudoRand = HSM_TRUE;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.eMgfHashType = pCfg->eHashType;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.eInputFmt = pCfg->eInputFmt;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.eOutputFmt = pCfg->eOutputFmt;
if (pCfg->u32RsaBitCnt > 0u)
{
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32EmBitCnt = pCfg->u32RsaBitCnt - 1u;
}
else
{
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32EmBitCnt = 0u;
}
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.eHashType = pCfg->eHashType;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.eInputType = HSM_RSA_SSA_INPUT_HASH_DATA;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pInputData = pCfg->pHashData;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32InputDataByteCount =
pCfg->u32HashDataByteCount;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pPrivateKey = pCfg->pPrivateKey;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32PrivateKeyByteCnt =
pCfg->u32PrivateKeyByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.bUseInputSaltData = HSM_FALSE;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pSalt = NULL_PTR;
hsm_hash_get_result_byte_count(
(HFAM_MODE_E)pCfg->eHashType,
&pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32SaltByteCount);
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pKeyN = pCfg->pKeyN;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32KeyNByteCount = pCfg->u32KeyNByteCount;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pResult = pCfg->pResult;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32ResultBufByteCnt =
pCfg->u32ResultBufByteCnt;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pResultByteCnt = pCfg->pResultByteCnt;
#if (FC7XXX_HSM_SUBSYSTEM_TYPE != FC7240_HSM_SUBSYSTEM)
if (0u != pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32UserKeyID_KEY_E)
{
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pPrivateKey = NULL_PTR;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32PrivateKeyByteCnt = 0u;
}
if (0u != pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32UserKeyID_KEY_N)
{
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.pKeyN = NULL_PTR;
pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->tCfg.u32KeyNByteCount = 0u;
}
/* else do nothing */
#endif
eRet = HSM_FW_RsaSsaPssSign(&(pCtx->tCmd), pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssSignPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PSS_SIGN == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_RsaSsaPssSign_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssSignReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PSS_SIGN == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssSignExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_RSA_SSA_PSS_SIGN == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_RsaSsaPssSign_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tRsaSsaPssSign.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2VerifySetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_SM2_VERIFY;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm =
(HSMCom_Sm2VerifyType *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.aParmBuf[0]));
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->tCfg.pInputData_MOrHash =
pCtx->tL1AlgCtx.tSm2VerifyInf.aHash;
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->tCfg.pInputData_R = &pCtx->tL1AlgCtx.tSm2VerifyInf.aR;
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->tCfg.pInputData_S = &pCtx->tL1AlgCtx.tSm2VerifyInf.aS;
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->tCfg.pPublicKey_X = &pCtx->tL1AlgCtx.tSm2VerifyInf.akGx;
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->tCfg.pPublicKey_Y = &pCtx->tL1AlgCtx.tSm2VerifyInf.akGy;
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->tCfg.pInputData_ID = pCtx->tL1AlgCtx.tSm2VerifyInf.aUserID;
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2VerifyExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM2_VERIFY == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2Verify(HSM_L1_RtCtxType *pCtx,
const HSM_L1_Sm2VerifyType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM2_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
if ((pCfg->u32kGxByteCnt == 32u) && (pCfg->u32kGyByteCnt == 32u) &&
(pCfg->u32SM2InputIDByteCnt <= (sizeof(pCtx->tL1AlgCtx.tSm2VerifyInf.aUserID))) &&
(pCfg->u32RByteCnt == 32u) && (pCfg->u32SByteCnt == 32u))
{
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->u32UserKeyID_PublicKey = pCfg->u32PublicKeyId;
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->tCfg.bHashInput = HSM_TRUE;
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->tCfg.bUseDefaultID = pCfg->bUseDefaultID;
if (0u == pCfg->u32PublicKeyId)
{
hsm_memcpy((void *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.akGx[0])), pCfg->pkGx, 32u);
hsm_memcpy((void *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.akGy[0])), pCfg->pkGy, 32u);
if (HSM_DATA_FORMAT_1B == pCfg->ekGxyDataFmt)
{
hsm_u32_array_swap(
(hsm_uint32_t *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.akGx[0])),
8u);
hsm_u32_array_swap(
(hsm_uint32_t *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.akGy[0])),
8u);
}
}
hsm_memcpy((void *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.aHash[0])), pCfg->pData, 32u);
if (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.aHash[0])),
8u);
}
hsm_memcpy((void *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.aR[0])), pCfg->pR, 32u);
hsm_memcpy((void *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.aS[0])), pCfg->pS, 32u);
if (HSM_DATA_FORMAT_1B == pCfg->eRSDataFmt)
{
hsm_u32_array_swap((hsm_uint32_t *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.aR[0])),
8u);
hsm_u32_array_swap((hsm_uint32_t *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.aS[0])),
8u);
}
if (HSM_FALSE == pCfg->bUseDefaultID)
{
hsm_memset(&(pCtx->tL1AlgCtx.tSm2VerifyInf.aUserID[0]),
0,
sizeof(pCtx->tL1AlgCtx.tSm2VerifyInf.aUserID));
if (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
{
hsm_memcpy((void *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.aUserID[0])),
pCfg->pInputData_ID,
pCfg->u32SM2InputIDByteCnt);
hsm_u32_array_swap(
(hsm_uint32_t *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.aUserID[0])),
HSM_ADDRESS_UP_ALIGN(pCfg->u32SM2InputIDByteCnt) >> 2u);
}
else
{
hsm_memcpy((void *)(&(pCtx->tL1AlgCtx.tSm2VerifyInf.aUserID[0])),
pCfg->pInputData_ID,
HSM_ADDRESS_UP_ALIGN(pCfg->u32SM2InputIDByteCnt));
}
pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->tCfg.u32SM2InputIDByteCnt =
pCfg->u32SM2InputIDByteCnt;
}
eRet = HSM_Sm2Verify(&(pCtx->tCmd), pCtx->tL1AlgCtx.tSm2VerifyInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2Verify_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_PASS == pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_PASS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else if (MAILBOXAPI_RET_FAIL == pCtx->tL1AlgCtx.tSm2VerifyInf.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_FAIL;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_ERROR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2VerifyPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM2_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_Sm2Verify_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2VerifyReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM2_VERIFY == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2GenZaSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_SM2_GEN_ZA;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tSm2GenZaInf.pParm =
(HSMCom_Sm2GenZaType *)(&(pCtx->tL1AlgCtx.tSm2GenZaInf.aParmBuf[0]));
pCtx->tL1AlgCtx.tSm2GenZaInf.pParm->tCfg.pPublicKey_X = &pCtx->tL1AlgCtx.tSm2GenZaInf.akGx;
pCtx->tL1AlgCtx.tSm2GenZaInf.pParm->tCfg.pPublicKey_Y = &pCtx->tL1AlgCtx.tSm2GenZaInf.akGy;
pCtx->tL1AlgCtx.tSm2GenZaInf.pParm->tCfg.pInputData_ID = pCtx->tL1AlgCtx.tSm2GenZaInf.aUserID;
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2GenZaExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM2_GEN_ZA == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2GenZa(HSM_L1_RtCtxType *pCtx,
const HSM_LN_Sm2GenZaType *pCfg,
hsm_uint32_t u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if ((NULL_PTR != pCtx) && (NULL_PTR != pCfg))
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM2_GEN_ZA == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
if ((pCfg->u32kGxByteCnt == 32u) && (pCfg->u32kGyByteCnt == 32u) &&
(pCfg->u32SM2InputIDByteCnt <= (sizeof(pCtx->tL1AlgCtx.tSm2GenZaInf.aUserID))))
{
pCtx->tL1AlgCtx.tSm2GenZaInf.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tSm2GenZaInf.pParm->u32Timeout = u32TimeoutMs;
pCtx->tL1AlgCtx.tSm2GenZaInf.pParm->u32UserKeyID_PublicKey = pCfg->u32PublicKeyId;
pCtx->tL1AlgCtx.tSm2GenZaInf.pParm->tCfg.bUseDefaultID = pCfg->bUseDefaultID;
pCtx->tL1AlgCtx.tSm2GenZaInf.pParm->tCfg.pOutputData_Za = pCfg->pOutputData_Za;
if (HSM_DATA_FORMAT_1B == pCfg->eOutputFmt)
{
pCtx->tL1AlgCtx.tSm2GenZaInf.bSwapOut = HSM_TRUE;
}
else
{
pCtx->tL1AlgCtx.tSm2GenZaInf.bSwapOut = HSM_FALSE;
}
if (0u == pCfg->u32PublicKeyId)
{
hsm_memcpy((void *)(&(pCtx->tL1AlgCtx.tSm2GenZaInf.akGx[0])), pCfg->pkGx, 32u);
hsm_memcpy((void *)(&(pCtx->tL1AlgCtx.tSm2GenZaInf.akGy[0])), pCfg->pkGy, 32u);
if (HSM_DATA_FORMAT_1B == pCfg->ekGxyDataFmt)
{
hsm_u32_array_swap(
(hsm_uint32_t *)(&(pCtx->tL1AlgCtx.tSm2GenZaInf.akGx[0])),
8u);
hsm_u32_array_swap(
(hsm_uint32_t *)(&(pCtx->tL1AlgCtx.tSm2GenZaInf.akGy[0])),
8u);
}
}
if (HSM_FALSE == pCfg->bUseDefaultID)
{
hsm_memset(&(pCtx->tL1AlgCtx.tSm2GenZaInf.aUserID[0]),
0,
sizeof(pCtx->tL1AlgCtx.tSm2GenZaInf.aUserID));
if (HSM_DATA_FORMAT_1B == pCfg->eDataFmt)
{
hsm_memcpy((void *)(&(pCtx->tL1AlgCtx.tSm2GenZaInf.aUserID[0])),
pCfg->pInputData_ID,
pCfg->u32SM2InputIDByteCnt);
hsm_u32_array_swap(
(hsm_uint32_t *)(&(pCtx->tL1AlgCtx.tSm2GenZaInf.aUserID[0])),
HSM_ADDRESS_UP_ALIGN(pCfg->u32SM2InputIDByteCnt) >> 2u);
}
else
{
hsm_memcpy((void *)(&(pCtx->tL1AlgCtx.tSm2GenZaInf.aUserID[0])),
pCfg->pInputData_ID,
HSM_ADDRESS_UP_ALIGN(pCfg->u32SM2InputIDByteCnt));
}
pCtx->tL1AlgCtx.tSm2GenZaInf.pParm->tCfg.u32SM2InputIDByteCnt =
pCfg->u32SM2InputIDByteCnt;
}
eRet = HSM_Sm2GenZa(&(pCtx->tCmd), pCtx->tL1AlgCtx.tSm2GenZaInf.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2GenZa_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tSm2GenZaInf.pParm->u32HSMStatusRet)
{
if (HSM_TRUE == pCtx->tL1AlgCtx.tSm2GenZaInf.bSwapOut)
{
hsm_u32_array_swap(
(hsm_uint32_t *)(pCtx->tL1AlgCtx.tSm2GenZaInf.pParm->tCfg.pOutputData_Za),
8u);
}
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_ERROR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2GenZaPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM2_GEN_ZA == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_Sm2GenZa_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_Sm2GenZaReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_SM2_GEN_ZA == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_PKCS1_GetRsaPrivateKeyInfFromDer(const hsm_uint8_t *pDer,
HSM_L1_PKCS_RsaPrivateKeyInfType *pInf)
{
HSM_StatusType eRet = HSM_STATUS_ERROR;
hsm_uint32_t aLength[3u];
const hsm_uint8_t *aDataPointer[3u];
hsm_uint32_t u32Temp;
hsm_uint32_t u32Idx;
hsm_uint32_t u32Length;
const hsm_uint8_t *pPerData = pDer;
if (0x30u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
pPerData += ((*pPerData) & 0x7Fu);
}
pPerData++;
/* version */
pPerData += 3u;
/* n */
for (u32Idx = 0u; u32Idx < 3u; u32Idx++)
{
if (0x02u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
u32Temp = ((*pPerData) & 0x7Fu);
u32Length = 0u;
while (u32Temp > 0u)
{
pPerData++;
u32Length = (u32Length << 8u) | (*pPerData);
u32Temp--;
}
}
else
{
u32Length = (*pPerData);
}
pPerData++;
aDataPointer[u32Idx] = pPerData;
aLength[u32Idx] = u32Length;
pPerData += u32Length;
}
else
{
break; /* error */
}
}
if (u32Idx == 3u)
{
for (u32Idx = 0u; u32Idx < 3u; u32Idx++)
{
while ((*(aDataPointer[u32Idx]) == 0u) && (aLength[u32Idx] > 1u))
{
aDataPointer[u32Idx]++;
aLength[u32Idx]--;
}
}
pInf->pN = aDataPointer[0u];
pInf->pE = aDataPointer[1u];
pInf->pD = aDataPointer[2u];
pInf->u32NByteCnt = aLength[0u];
pInf->u32EByteCnt = aLength[1u];
pInf->u32DByteCnt = aLength[2u];
eRet = HSM_STATUS_SUCCESS;
}
}
return eRet;
}
HSM_StatusType HSM_L1_PKCS1_GetEccPrivateKeyInfFromDer(const hsm_uint8_t *pDer,
HSM_L1_PKCS_EccPrivateKeyInfType *pInf)
{
HSM_StatusType eRet = HSM_STATUS_ERROR;
hsm_uint32_t aLength[1u];
const hsm_uint8_t *aDataPointer[1u];
hsm_uint32_t u32Temp;
hsm_uint32_t u32Length;
const hsm_uint8_t *pPerData = pDer;
if (0x30u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
pPerData += ((*pPerData) & 0x7Fu);
}
pPerData++;
/* version */
pPerData += 3u;
/* privateKey */
if (0x04u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
u32Temp = (hsm_uint32_t)((hsm_uint32_t)(*pPerData) & 0x7Fu);
u32Length = 0u;
while (u32Temp > 0u)
{
pPerData++;
u32Length = (u32Length << 8u) | (*pPerData);
u32Temp--;
}
}
else
{
u32Length = (*pPerData);
}
pPerData++;
aDataPointer[0u] = pPerData;
aLength[0u] = u32Length;
pPerData += u32Length;
eRet = HSM_STATUS_SUCCESS;
/* to be continue */
}
/* else do nothing */
}
if (HSM_STATUS_SUCCESS == eRet)
{
while ((*(aDataPointer[0u]) == 0u) && (aLength[0u] > 1u))
{
aDataPointer[0u]++;
aLength[0u]--;
}
pInf->pPrivate = aDataPointer[0u];
pInf->u32PrivateByteCnt = aLength[0u];
}
return eRet;
}
HSM_StatusType HSM_L1_PKCS8_GetPrivateKeyInfFromDer(const hsm_uint8_t *pDer,
HSM_L1_PKCS8_PrivateKeyInfType *pInf)
{
HSM_StatusType eRet = HSM_STATUS_ERROR;
const hsm_uint8_t *pPerData = pDer;
if (0x30u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
pPerData += ((*pPerData) & 0x7Fu);
}
pPerData++;
/* version */
pPerData += 3u;
/* privateKeyAlgorithm */
pPerData += 3u;
if (0x9u == (*pPerData)) /* RSA OID length */
{
pPerData += (*pPerData);
/* 2a864886f70d010101 privateKeyAlgorithm.algorithm */
if (0x1u == (*pPerData)) /* oid last byte check */
{
pPerData++;
/* privateKeyAlgorithm.parameter */
pPerData += 2u;
/* privateKey */
if (0x04u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
pPerData += ((*pPerData) & 0x7Fu);
}
pPerData++;
/* RSAPrivateKey, pkcs1 format */
eRet = HSM_L1_PKCS1_GetRsaPrivateKeyInfFromDer(pPerData,
&(pInf->tPrivateInfo.tRsaKeyInf));
if (HSM_STATUS_SUCCESS == eRet)
{
pInf->eKeyType = HSM_L1_PKCS8_RSA_PRIVATE_KEY;
}
/* else do nothing */
}
}
}
else if (0x7u == (*pPerData)) /* ECC OID length */
{
pPerData += (*pPerData);
/* 2a8648ce3d0201 privateKeyAlgorithm.algorithm */
if (0x1u == (*pPerData)) /* oid last byte check */
{
pPerData++;
/* privateKeyAlgorithm.parameter */
pPerData++; /* after pPerData address, the following is the curve type OID */
pPerData += (*pPerData);
pPerData++;
/* privateKey */
if (0x04u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
pPerData += ((*pPerData) & 0x7Fu);
}
pPerData++;
/* ECPrivateKey, pkcs1 format */
eRet = HSM_L1_PKCS1_GetEccPrivateKeyInfFromDer(pPerData,
&(pInf->tPrivateInfo.tEccKeyInf));
if (HSM_STATUS_SUCCESS == eRet)
{
pInf->eKeyType = HSM_L1_PKCS8_ECC_PRIVATE_KEY;
}
/* else do nothing */
}
}
}
else
{
/* PRQA S 2013 */
}
}
return eRet;
}
HSM_StatusType HSM_L1_PKCS1_GetRsaPublicKeyInfFromDer(const hsm_uint8_t *pDer,
HSM_L1_PKCS_RsaPublicKeyInfType *pInf)
{
HSM_StatusType eRet = HSM_STATUS_ERROR;
hsm_uint32_t aLength[2u];
const hsm_uint8_t *aDataPointer[2u];
hsm_uint32_t u32Temp;
hsm_uint32_t u32Idx;
hsm_uint32_t u32Length;
const hsm_uint8_t *pPerData = pDer;
if (0x30u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
pPerData += ((*pPerData) & 0x7Fu);
}
pPerData++;
for (u32Idx = 0u; u32Idx < 2u; u32Idx++)
{
if (0x02u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
u32Temp = (hsm_uint32_t)((hsm_uint32_t)(*pPerData) & 0x7Fu);
u32Length = 0u;
while (u32Temp > 0u)
{
pPerData++;
u32Length = (u32Length << 8u) | (*pPerData);
u32Temp--;
}
}
else
{
u32Length = (*pPerData);
}
pPerData++;
aDataPointer[u32Idx] = pPerData;
aLength[u32Idx] = u32Length;
pPerData += u32Length;
}
else
{
break; /* error */
}
}
if (u32Idx == 2u)
{
for (u32Idx = 0u; u32Idx < 2u; u32Idx++)
{
while ((*(aDataPointer[u32Idx]) == 0u) && (aLength[u32Idx] > 1u))
{
aDataPointer[u32Idx]++;
aLength[u32Idx]--;
}
}
pInf->pN = aDataPointer[0u];
pInf->u32NByteCnt = aLength[0u];
pInf->pE = aDataPointer[1u];
pInf->u32EByteCnt = aLength[1u];
eRet = HSM_STATUS_SUCCESS;
}
}
return eRet;
}
HSM_StatusType hsm_l1_subjectpublicinfo_bitstring_geteccpublickeyinf(
const hsm_uint8_t *pDer,
HSM_L1_PKCS_EccPublicKeyInfType *pInf)
{
HSM_StatusType eRet = HSM_STATUS_ERROR;
hsm_uint32_t aLength[2u];
const hsm_uint8_t *aDataPointer[2u];
hsm_uint32_t u32Temp;
hsm_uint32_t u32Length;
const hsm_uint8_t *pPerData = pDer;
if (0x03u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
u32Temp = (hsm_uint32_t)((hsm_uint32_t)(*pPerData) & 0x7Fu);
u32Length = 0u;
while (u32Temp > 0u)
{
pPerData++;
u32Length = (u32Length << 8u) | (*pPerData);
u32Temp--;
}
}
else
{
u32Length = (*pPerData);
}
pPerData++;
u32Length -= 2u; /* byte count remove leading byte and compressed/uncompressed format byte */
if (0x0u == (*pPerData)) /* not support bit string shift now */
{
pPerData++;
if (0x04u == (*pPerData)) /* uncompressed format */
{
pPerData++;
aDataPointer[0u] = pPerData;
aLength[0u] = u32Length >> 1u;
aDataPointer[1u] = pPerData + aLength[0u];
aLength[1u] = u32Length >> 1u;
eRet = HSM_STATUS_SUCCESS;
}
}
}
if (HSM_STATUS_SUCCESS == eRet)
{
pInf->pKGx = aDataPointer[0u];
pInf->pKGy = aDataPointer[1u];
pInf->u32KGxByteCnt = aLength[0u];
pInf->u32KGyByteCnt = aLength[1u];
}
return eRet;
}
HSM_StatusType HSM_L1_SubjectPublicInfo_GetPublicKeyInfFromDer(const hsm_uint8_t *pDer,
HSM_L1_PublicKeyInfType *pInf)
{
HSM_StatusType eRet = HSM_STATUS_ERROR;
const hsm_uint8_t *pPerData = pDer;
if (0x30u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
pPerData += ((*pPerData) & 0x7Fu);
}
pPerData++;
/* algorithm AlgorithmIdentifier */
pPerData += 3u;
if (0x9u == (*pPerData)) /* RSA OID length */
{
pPerData += (*pPerData);
/* 2a864886f70d010101 algorithm */
if (0x1u == (*pPerData)) /* oid last byte check */
{
pPerData++;
/* parameter */
pPerData += 2u;
/* bit string RSAPublicKey wrapper */
if (0x03u == (*pPerData))
{
pPerData++;
if (0x80u & (*pPerData))
{
pPerData += ((*pPerData) & 0x7Fu);
}
pPerData++;
/* bit string leading byte */
if (0x0u == (*pPerData))
{
pPerData++;
/* RSAPublicKey */
eRet = HSM_L1_PKCS1_GetRsaPublicKeyInfFromDer(pPerData,
&(pInf->tPublicInf.tRsaKeyInf));
if (HSM_STATUS_SUCCESS == eRet)
{
pInf->eKeyType = HSM_L1_RSA_PUBLIC_KEY;
}
/* else do nothing */
}
}
}
}
else if (0x7u == (*pPerData)) /* ECC OID length */
{
pPerData += (*pPerData);
/* 2a8648ce3d0201 OBJ_X9_62_id_ecPublicKey */
if (0x1u == (*pPerData)) /* oid last byte check */
{
pPerData++;
/* parameter */
pPerData++; /* after pPerData address, the following is the curve type OID */
pPerData += (*pPerData);
pPerData++;
/* public key */
eRet = hsm_l1_subjectpublicinfo_bitstring_geteccpublickeyinf(
pPerData,
&(pInf->tPublicInf.tEccKeyInf));
if (HSM_STATUS_SUCCESS == eRet)
{
pInf->eKeyType = HSM_L1_ECC_PUBLIC_KEY;
}
/* else do nothing */
}
}
else
{
/* PRQA S 2013 */
}
}
return eRet;
}
HSM_StatusType HSM_L1_LoadFirmwareSetupEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = HSM_FALSE;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if (HSM_FALSE == bInProcess)
{
pCtx->bInProcess = HSM_TRUE;
pCtx->eOperationCata = HSM_OP_LOAD_FIRMWARE;
pCtx->eStat = HSM_DRV_SM_READY;
pCtx->tL1AlgCtx.tLoadFirmware.pParm = (HSMCom_LoadFirmwareType *)HSM_ADDRESS_UP_ALIGN(
&(pCtx->tL1AlgCtx.tLoadFirmware.aParmBuf[0]));
eRet = HSM_STATUS_SUCCESS;
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_LoadFirmware(HSM_L1_RtCtxType *pCtx, uint32 u32TimeoutMs)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
if (NULL_PTR != pCtx)
{
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_LOAD_FIRMWARE == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH != pCtx->eStat)
{
pCtx->tL1AlgCtx.tLoadFirmware.pParm->u32HSMStatusRet = MAILBOXAPI_RET_NONE;
pCtx->tL1AlgCtx.tLoadFirmware.pParm->u32Timeout = u32TimeoutMs;
eRet = HSM_LoadFirmware(&(pCtx->tCmd), pCtx->tL1AlgCtx.tLoadFirmware.pParm);
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_ARITH;
eRet = pCtx->pSendCmdCb(&(pCtx->tCmd));
if (HSM_STATUS_SUCCESS != eRet)
{
pCtx->eStat = HSM_DRV_SM_STOP;
eRet = HSM_STATUS_SEND_FAIL;
}
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_BUSY;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
}
else
{
eRet = HSM_STATUS_PARAM_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_LoadFirmwarePoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_LOAD_FIRMWARE == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pReadAckCb();
if (HSM_STATUS_BUSY == eRet)
{
eRet = HSM_STATUS_AGAIN;
}
else if (HSM_STATUS_SUCCESS == eRet)
{
eRet = HSM_L1_LoadFirmware_Isr(pCtx);
}
else
{
pCtx->eStat = HSM_DRV_SM_STOP;
}
}
else
{
eRet = HSM_STATUS_HW_IDLE;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_LoadFirmwareReset(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
bInProcess = pCtx->bInProcess;
if ((HSM_TRUE == bInProcess) && (HSM_OP_LOAD_FIRMWARE == pCtx->eOperationCata))
{
if (HSM_DRV_SM_ARITH == pCtx->eStat)
{
eRet = pCtx->pCancelCmdCb();
}
if (HSM_STATUS_SUCCESS == eRet)
{
pCtx->eStat = HSM_DRV_SM_READY;
}
else
{
;
}
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_LoadFirmwareExitEnv(HSM_L1_RtCtxType *pCtx)
{
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
if ((HSM_TRUE == bInProcess) && (HSM_OP_LOAD_FIRMWARE == pCtx->eOperationCata))
{
eRet = HSM_L1_CommonExitEnv(pCtx);
}
else
{
eRet = HSM_STATUS_LOGIC_ERR;
}
return eRet;
}
HSM_StatusType HSM_L1_LoadFirmware_Isr(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet;
if (MAILBOXAPI_RET_SUCCESS == pCtx->tL1AlgCtx.tLoadFirmware.pParm->u32HSMStatusRet)
{
eRet = HSM_STATUS_SUCCESS;
pCtx->eStat = HSM_DRV_SM_STOP;
}
else
{
eRet = HSM_STATUS_HW_ERR;
pCtx->eStat = HSM_DRV_SM_STOP;
}
return eRet;
}
HSM_StatusType HSM_L1_GetPoll(HSM_L1_RtCtxType *pCtx)
{
HSM_StatusType eRet = HSM_STATUS_SUCCESS;
HSM_BoolType bInProcess = HSM_FALSE;
bInProcess = pCtx->bInProcess;
if (HSM_TRUE == bInProcess)
{
switch (pCtx->eOperationCata)
{
case HSM_OP_AES_ENCRYPT:
{
eRet = HSM_L1_AesEncryptPoll(pCtx);
}
break;
case HSM_OP_AES_DECRYPT:
{
eRet = HSM_L1_AesDecryptPoll(pCtx);
}
break;
case HSM_OP_SM4_ENCRYPT:
{
eRet = HSM_L1_Sm4EncryptPoll(pCtx);
}
break;
case HSM_OP_SM4_DECRYPT:
{
eRet = HSM_L1_Sm4DecryptPoll(pCtx);
}
break;
case HSM_OP_CMAC:
{
eRet = HSM_L1_CMacPoll(pCtx);
}
break;
case HSM_OP_RNG:
{
eRet = HSM_L1_RngPoll(pCtx);
}
break;
case HSM_OP_SHA:
{
eRet = HSM_L1_RngPoll(pCtx);
}
break;
case HSM_OP_MD5:
{
eRet = HSM_L1_Md5Poll(pCtx);
}
break;
case HSM_OP_SM3:
{
eRet = HSM_L1_Sm3Poll(pCtx);
}
break;
#if 0
/*
* IF use key id of RSA E/D/N, the key data in key space of HSM side,
* only support 4B format,
* and the N size must 8bytes aligned,
* the D/E size should equal to N size.
* So use HSM_L1_BnCalc instead.
*/
case HSM_OP_RSA:
{
eRet = HSM_L1_RsaPoll(pCtx);
}
break;
#endif
case HSM_OP_BN_CALC:
{
eRet = HSM_L1_BnCalcPoll(pCtx);
}
break;
case HSM_OP_ECC_VERIFY:
{
eRet = HSM_L1_EccVerifyPoll(pCtx);
}
break;
case HSM_OP_ECC_EASYDECRY:
{
eRet = HSM_L1_EccDecryptPoll(pCtx);
}
break;
case HSM_OP_SCATTER_HASH:
{
eRet = HSM_L1_ScatterHashPoll(pCtx);
}
break;
case HSM_OP_SCATTER_CMAC:
{
eRet = HSM_L1_ScatterCMacPoll(pCtx);
}
break;
case HSM_OP_ECC_SIGN:
{
eRet = HSM_L1_EccSignPoll(pCtx);
}
break;
case HSM_OP_ECC_CALC:
{
eRet = HSM_L1_EccCalculatePoll(pCtx);
}
break;
case HSM_OP_KEY_MANAGE_IMPORT:
{
eRet = HSM_L1_KeyImportPoll(pCtx);
}
break;
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
case HSM_OP_KEY_MANAGE_VALIDATE:
{
eRet = HSM_L1_KeyValidatePoll(pCtx);
}
break;
#endif
case HSM_OP_KEY_MANAGE_COPY:
{
eRet = HSM_L1_KeyCopyPoll(pCtx);
}
break;
case HSM_OP_KEY_MANAGE_REVOKE:
{
eRet = HSM_L1_KeyRevokePoll(pCtx);
}
break;
case HSM_OP_KEY_MANAGE_TIDYUP:
{
eRet = HSM_L1_KeySpaceTidyUpPoll(pCtx);
}
break;
case HSM_OP_RSA_SSA_PSS_VERIFY:
{
eRet = HSM_L1_RsaSsaPssVerifyPoll(pCtx);
}
break;
case HSM_OP_RSA_SSA_PKCS1V15_VERIFY:
{
eRet = HSM_L1_RsaSsaPkcs1V15VerifyPoll(pCtx);
}
break;
case HSM_OP_KEY_MANAGE_GETSTATUS:
{
eRet = HSM_L1_KeySpaceGetStatusPoll(pCtx);
}
break;
case HSM_OP_RSA_SSA_PKCS1V15_SIGN:
{
eRet = HSM_L1_RsaSsaPkcs1V15SignPoll(pCtx);
}
break;
case HSM_OP_RSA_SSA_PSS_SIGN:
{
eRet = HSM_L1_RsaSsaPssSignPoll(pCtx);
}
break;
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
case HSM_OP_KEY_MANAGE_GET_ID_STATUS:
{
eRet = HSM_L1_GetKeyIdStatusPoll(pCtx);
}
break;
#endif
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
#else
case HSM_OP_KEY_MANAGE_UPDATE_KEY_ID_CONTENT:
{
eRet = HSM_L1_UpdateKeyIdContentPoll(pCtx);
}
break;
#endif
default:
{
eRet = HSM_STATUS_LOGIC_ERR;
}
break;
}
}
else
{
eRet = HSM_STATUS_IDLE;
}
return eRet;
}
void HSM_L1_Ack_IrqHandler(void *pUpperCtx, HSM_StatusType eRet)
{
HSM_Ln_RtCtxType *pLnCtx = (HSM_Ln_RtCtxType *)pUpperCtx;
HSM_L1_RtCtxType *pCtx = &(pLnCtx->tHsmL1Ctx);
HSM_BoolType bInProcess = pCtx->bInProcess;
HSM_BoolType bErrorHappen = HSM_FALSE;
if (NULL_PTR != (pCtx->pCleanAndFlushDcache))
{
pCtx->pCleanAndFlushDcache();
}
/* else do nothing */
if (HSM_TRUE == bInProcess)
{
switch (pCtx->eOperationCata)
{
case HSM_OP_SHA:
{
eRet = HSM_L1_Sha_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_MD5:
{
eRet = HSM_L1_Md5_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_SM3:
{
eRet = HSM_L1_Sm3_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
#if 0
/*
* IF use key id of RSA E/D/N, the key data in key space of HSM side,
* only support 4B format,
* and the N size must 8bytes aligned,
* the D/E size should equal to N size.
* So use HSM_L1_BnCalc instead.
*/
case HSM_OP_RSA:
{
eRet = HSM_L1_Rsa_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
#endif
case HSM_OP_BN_CALC:
{
eRet = HSM_L1_BnCalc_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_RNG:
{
eRet = HSM_L1_Rng_Isr(pCtx);
if (HSM_STATUS_AGAIN != eRet)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
if (NULL_PTR != pCtx->pStopCb)
{
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
/* else do nothing */
}
break;
case HSM_OP_ECC_VERIFY:
{
eRet = HSM_L1_EccVerify_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_ERROR == eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_ECC_EASYDECRY:
{
eRet = HSM_L1_EccDecrypt_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_CMAC:
{
eRet = HSM_L1_CMac_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_AES_ENCRYPT:
{
eRet = HSM_L1_AesEncrypt_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_AES_DECRYPT:
{
eRet = HSM_L1_AesDecrypt_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_SM4_ENCRYPT:
{
eRet = HSM_L1_Sm4Encrypt_Isr(pCtx);
if (HSM_STATUS_AGAIN != eRet)
{
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
else
{
;
}
}
/* else nothing, need more process revoke */
}
break;
case HSM_OP_SM4_DECRYPT:
{
eRet = HSM_L1_Sm4Decrypt_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_SCATTER_HASH:
{
eRet = HSM_L1_ScatterHash_Isr(pCtx);
if (HSM_STATUS_AGAIN != eRet)
{
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
}
break;
case HSM_OP_SCATTER_CMAC:
{
eRet = HSM_L1_ScatterCMac_Isr(pCtx);
if (HSM_STATUS_AGAIN != eRet)
{
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
}
break;
case HSM_OP_ECC_SIGN:
{
eRet = HSM_L1_EccSign_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_ERROR == eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_RSA_SSA_PSS_VERIFY:
{
eRet = HSM_L1_RsaSsaPssVerify_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_ERROR == eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_RSA_SSA_PKCS1V15_VERIFY:
{
eRet = HSM_L1_RsaSsaPkcs1V15Verify_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_ERROR == eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_ECC_CALC:
{
eRet = HSM_L1_EccCalculate_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_KEY_MANAGE_IMPORT:
{
eRet = HSM_L1_KeyImport_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
case HSM_OP_KEY_MANAGE_VALIDATE:
{
eRet = HSM_L1_KeyValidate_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if ((HSM_STATUS_EXIST != eRet) && (HSM_STATUS_NOT_EXIST != eRet))
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
#endif
case HSM_OP_KEY_MANAGE_COPY:
{
eRet = HSM_L1_KeyCopy_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_KEY_MANAGE_REVOKE:
{
eRet = HSM_L1_KeyRevoke_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_KEY_MANAGE_TIDYUP:
{
eRet = HSM_L1_KeySpaceTidyup_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_KEY_MANAGE_GETSTATUS:
{
eRet = HSM_L1_KeySpaceGetStatus_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_RSA_SSA_PKCS1V15_SIGN:
{
eRet = HSM_L1_RsaSsaPkcs1V15Sign_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_RSA_SSA_PSS_SIGN:
{
eRet = HSM_L1_RsaSsaPssSign_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
case HSM_OP_KEY_MANAGE_GET_ID_STATUS:
{
eRet = HSM_L1_GetKeyIdStatus_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if ((HSM_STATUS_ERROR == eRet) || (HSM_STATUS_HW_ERR == eRet))
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
#endif
case HSM_OP_LOAD_FIRMWARE:
{
eRet = HSM_L1_LoadFirmware_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_HW_ERR == eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
}
break;
#if ((FC7XXX_HSM_SUBSYSTEM_TYPE == FC7240_HSM_SUBSYSTEM) || \
(FC7XXX_HSM_SUBSYSTEM_TYPE == FC7300_HSM_SUBSYSTEM))
#else
case HSM_OP_KEY_MANAGE_UPDATE_KEY_ID_CONTENT:
{
eRet = HSM_L1_UpdateKeyIdContent_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
#endif
case HSM_OP_SM2_VERIFY:
{
eRet = HSM_L1_Sm2Verify_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
case HSM_OP_SM2_GEN_ZA:
{
eRet = HSM_L1_Sm2GenZa_Isr(pCtx);
if (NULL_PTR != pCtx->pStopCb)
{
if (HSM_STATUS_SUCCESS != eRet)
{
bErrorHappen = HSM_TRUE;
}
pCtx->pStopCb(pUpperCtx, bErrorHappen, eRet);
}
/* else do nothing */
}
break;
/* PRQA S 2016 ++ #Misra-C:Rule-16.4 Every switch statement shall have a default label
* Reason: It doesn't go to the default branch */
default:
break;
/* PRQA S 2016 -- */
}
}
else
{
;
}
}