/* ****************************************************************************** * SOURCE FILE * * Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: sec4_request.c,v $ $Revision: 1.8.12.1 $ * $Source: /home/interpeak/CVSRoot/ipfreescale/sec4/sec4_request.c,v $ * $Author: jsheng $ * $State: Exp $ $Locker: $ * * INTERPEAK_COPYRIGHT_STRING ****************************************************************************** */ /* **************************************************************************** * 1 DESCRIPTION **************************************************************************** */ /**************************************************************************** * sec4_request.c - request/response handler * Based on sec2_request.c for SEC2 driver. **************************************************************************** * Copyright (c) 2003-2005 Freescale Semiconductor * All Rights Reserved. Proprietary and Confidential. * * NOTICE: The information contained in this file is proprietary * to Freescale Semiconductor, and is being made available to * Freescale's customers under strict license agreements. * Use or disclosure of this information is permissible only * under the terms of the existing license agreement. ***************************************************************************/ /* Revision History: * 1.0 Mar 11,2011 - Based on sec2_request.c v1.2 */ /* **************************************************************************** * 2 CONFIGURATION **************************************************************************** */ /* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */ #include #include #include #include #include #include #include "sec.h" #include "Sec4Driver.h" /* **************************************************************************** * 4 DEFINES **************************************************************************** */ /* Define module for errors reported from this file (as used in SEC4 driver) */ #define __ERR_MODULE__ MODULE_SEC /* **************************************************************************** * 5 TYPES **************************************************************************** */ /* **************************************************************************** * 6 EXTERN PROTOTYPES **************************************************************************** */ /* **************************************************************************** * 7 LOCAL PROTOTYPES **************************************************************************** */ /* **************************************************************************** * 8 DATA **************************************************************************** */ /* Global handles */ SEC4_GLOBAL t_Handle h_Sec4; SEC4_GLOBAL t_Handle h_SecDcl; SEC4_GLOBAL t_Handle h_SecJobQueue; #ifdef SEC4_USE_SHARED_JOB_QUEUE SEC4_GLOBAL t_sec4IpcMsg *sec4IpcVector; SEC4_GLOBAL uint32_t sec4CoreId; #endif /* **************************************************************************** * 9 LOCAL FUNCTIONS **************************************************************************** */ /* **************************************************************************** * 10 PUBLIC FUNCTIONS **************************************************************************** */ /********************************************************************************/ /* Function Name: ProcessRequest */ /* Purpose: To handle the IO request routine */ /* Input: req - the pointer of the IO request */ /* callingTaskId - the task Id */ /* Output: req - the pointer of the IO request buffer */ /* Return: SEC4_SUCCESS if success, otherwise error code */ /********************************************************************************/ int ProcessRequest(GENERIC_REQ *req, int callingTaskId) { t_Error status; t_Handle h_JobDesc; t_Handle h_Context; t_JobDescParam jobDescParam; t_IpsecJobDescParam ipsecJobDescParam; bool jobIsIpsec = FALSE; t_sec4SgtEntry *p_sec4Sgt; SEC4Dump(DBGTXT_SETRQ, ("ProcessRequest(): taskId = 0x%x, opId = 0x%x\n", callingTaskId, req->opId)); /* Prepare parameters for SEC job descriptor */ memset(&jobDescParam, 0, sizeof(t_JobDescParam)); switch (req->opId) { case DPD_RNG_GETRN: jobDescParam.jobTypeId = e_DCL_JOB_RANDNUM; jobDescParam.outDataBytes = (uint32_t) ((RNG_REQ *)req)->rngBytes; jobDescParam.outData = (uint8_t *) ((RNG_REQ *)req)->rngData; break; case DPD_MD5_LDCTX_IDGS_HASH_PAD_ULCTX: jobDescParam.jobTypeId = e_DCL_JOB_MD5_DIGEST; jobDescParam.inDataBytes = (uint32_t) ((HASH_REQ *)req)->inBytes; jobDescParam.inData = (uint8_t *) ((HASH_REQ *)req)->inData; jobDescParam.outDataBytes = (uint32_t) ((HASH_REQ *)req)->outBytes; jobDescParam.outData = (uint8_t *) ((HASH_REQ *)req)->outData; break; case DPD_MD5_LDCTX_HMAC_PAD_ULCTX: jobDescParam.jobTypeId = e_DCL_JOB_MD5_HMAC; jobDescParam.keyDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((HMAC_PAD_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->inBytes; jobDescParam.inData = (uint8_t *) ((HMAC_PAD_REQ *)req)->inData; jobDescParam.outDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->outBytes; jobDescParam.outData = (uint8_t *) ((HMAC_PAD_REQ *)req)->outData; break; case DPD_SHA_LDCTX_IDGS_HASH_PAD_ULCTX: jobDescParam.jobTypeId = e_DCL_JOB_SHA1_DIGEST; jobDescParam.inDataBytes = (uint32_t) ((HASH_REQ *)req)->inBytes; jobDescParam.inData = (uint8_t *) ((HASH_REQ *)req)->inData; jobDescParam.outDataBytes = (uint32_t) ((HASH_REQ *)req)->outBytes; jobDescParam.outData = (uint8_t *) ((HASH_REQ *)req)->outData; break; case DPD_SHA_LDCTX_HMAC_PAD_ULCTX: jobDescParam.jobTypeId = e_DCL_JOB_SHA1_HMAC; jobDescParam.keyDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((HMAC_PAD_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->inBytes; jobDescParam.inData = (uint8_t *) ((HMAC_PAD_REQ *)req)->inData; jobDescParam.outDataBytes = (uint32_t) ((HMAC_PAD_REQ *)req)->outBytes; jobDescParam.outData = (uint8_t *) ((HMAC_PAD_REQ *)req)->outData; break; case DPD_SDES_CBC_CTX_ENCRYPT: jobDescParam.jobTypeId = e_DCL_JOB_DES_CBC_ENCRYPT; jobDescParam.keyDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inBytes; jobDescParam.inCtxDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvBytes; jobDescParam.inData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inData; jobDescParam.inCtxData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvData; jobDescParam.outData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->outData; break; case DPD_SDES_CBC_CTX_DECRYPT: jobDescParam.jobTypeId = e_DCL_JOB_DES_CBC_DECRYPT; jobDescParam.keyDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inBytes; jobDescParam.inCtxDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvBytes; jobDescParam.inData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inData; jobDescParam.inCtxData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvData; jobDescParam.outData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->outData; break; case DPD_SDES_ECB_ENCRYPT: jobDescParam.jobTypeId = e_DCL_JOB_DES_ECB_ENCRYPT; jobDescParam.keyDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((DES_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->inBytes; jobDescParam.inData = (uint8_t *) ((DES_CRYPT_REQ *)req)->inData; jobDescParam.outData = (uint8_t *) ((DES_CRYPT_REQ *)req)->outData; break; case DPD_SDES_ECB_DECRYPT: jobDescParam.jobTypeId = e_DCL_JOB_DES_ECB_DECRYPT; jobDescParam.keyDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((DES_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->inBytes; jobDescParam.inData = (uint8_t *) ((DES_CRYPT_REQ *)req)->inData; jobDescParam.outData = (uint8_t *) ((DES_CRYPT_REQ *)req)->outData; break; case DPD_TDES_CBC_CTX_ENCRYPT: jobDescParam.jobTypeId = e_DCL_JOB_TDES_CBC_ENCRYPT; jobDescParam.keyDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inBytes; jobDescParam.inCtxDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvBytes; jobDescParam.inData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inData; jobDescParam.inCtxData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvData; jobDescParam.outData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->outData; break; case DPD_TDES_CBC_CTX_DECRYPT: jobDescParam.jobTypeId = e_DCL_JOB_TDES_CBC_DECRYPT; jobDescParam.keyDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inBytes; jobDescParam.inCtxDataBytes = (uint32_t) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvBytes; jobDescParam.inData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inData; jobDescParam.inCtxData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->inIvData; jobDescParam.outData = (uint8_t *) ((DES_LOADCTX_CRYPT_REQ *)req)->outData; break; case DPD_TDES_ECB_ENCRYPT: jobDescParam.jobTypeId = e_DCL_JOB_TDES_ECB_ENCRYPT; jobDescParam.keyDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((DES_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->inBytes; jobDescParam.inData = (uint8_t *) ((DES_CRYPT_REQ *)req)->inData; jobDescParam.outData = (uint8_t *) ((DES_CRYPT_REQ *)req)->outData; break; case DPD_TDES_ECB_DECRYPT: jobDescParam.jobTypeId = e_DCL_JOB_TDES_ECB_DECRYPT; jobDescParam.keyDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((DES_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((DES_CRYPT_REQ *)req)->inBytes; jobDescParam.inData = (uint8_t *) ((DES_CRYPT_REQ *)req)->inData; jobDescParam.outData = (uint8_t *) ((DES_CRYPT_REQ *)req)->outData; break; case DPD_AESA_CBC_ENCRYPT_CRYPT: jobDescParam.jobTypeId = e_DCL_JOB_AES_CBC_ENCRYPT; jobDescParam.keyDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inBytes; jobDescParam.inCtxDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inIvBytes; jobDescParam.outCtxDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->outCtxBytes; jobDescParam.inData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inData; jobDescParam.inCtxData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inIvData; jobDescParam.outData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outData; jobDescParam.outCtxData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outCtxData; break; case DPD_AESA_CBC_DECRYPT_CRYPT: jobDescParam.jobTypeId = e_DCL_JOB_AES_CBC_DECRYPT; jobDescParam.keyDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inBytes; jobDescParam.inCtxDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inIvBytes; jobDescParam.outCtxDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->outCtxBytes; jobDescParam.inData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inData; jobDescParam.inCtxData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inIvData; jobDescParam.outData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outData; jobDescParam.outCtxData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outCtxData; break; case DPD_AESA_ECB_ENCRYPT_CRYPT: jobDescParam.jobTypeId = e_DCL_JOB_AES_ECB_ENCRYPT; jobDescParam.keyDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inBytes; jobDescParam.inData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inData; jobDescParam.outData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outData; break; case DPD_AESA_ECB_DECRYPT_CRYPT: jobDescParam.jobTypeId = e_DCL_JOB_AES_ECB_DECRYPT; jobDescParam.keyDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((AESA_CRYPT_REQ *)req)->inBytes; jobDescParam.inData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->inData; jobDescParam.outData = (uint8_t *) ((AESA_CRYPT_REQ *)req)->outData; break; /* RC4 stream cipher */ case DPD_RC4_LDKEY_CRYPT_ULCTX: jobDescParam.jobTypeId = e_DCL_JOB_RC4_ENCRYPT; jobDescParam.keyDataBytes = (uint32_t) ((ARC4_LOADKEY_CRYPT_UNLOADCTX_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((ARC4_LOADKEY_CRYPT_UNLOADCTX_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inBytes; jobDescParam.inCtxDataBytes = (uint32_t) 0; jobDescParam.inData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inData; jobDescParam.inCtxData = (uint8_t *) NULL; jobDescParam.outData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outData; jobDescParam.outCtxDataBytes = (uint32_t) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outCtxBytes; jobDescParam.outCtxData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outCtxData; break; case DPD_RC4_LDCTX_CRYPT_ULCTX: jobDescParam.jobTypeId = e_DCL_JOB_RC4_ENCRYPT; jobDescParam.keyDataBytes = (uint32_t) 0; jobDescParam.keyData = (uint8_t *) NULL; jobDescParam.inDataBytes = (uint32_t) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inBytes; jobDescParam.inCtxDataBytes = (uint32_t) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inCtxBytes; jobDescParam.inData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inData; jobDescParam.inCtxData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->inCtxData; jobDescParam.outData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outData; jobDescParam.outCtxDataBytes = (uint32_t) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outCtxBytes; jobDescParam.outCtxData = (uint8_t *) ((ARC4_LOADCTX_CRYPT_REQ *)req)->outCtxData; break; case DPD_MM_SS_RSA_EXP: jobDescParam.jobTypeId = e_DCL_JOB_MODEXP; jobDescParam.keyDataBytes = (uint32_t) ((MOD_SS_EXP_REQ *)req)->expBytes; jobDescParam.inDataBytes = (uint32_t) ((MOD_SS_EXP_REQ *)req)->aDataBytes; jobDescParam.modDataBytes = (uint32_t) ((MOD_SS_EXP_REQ *)req)->modBytes; jobDescParam.outDataBytes = (uint32_t) ((MOD_SS_EXP_REQ *)req)->bDataBytes; jobDescParam.keyData = (uint8_t *) ((MOD_SS_EXP_REQ *)req)->expData; jobDescParam.inData = (uint8_t *) ((MOD_SS_EXP_REQ *)req)->aData; jobDescParam.modData = (uint8_t *) ((MOD_SS_EXP_REQ *)req)->modData; jobDescParam.outData = (uint8_t *) ((MOD_SS_EXP_REQ *)req)->bData; break; case DPD_802_11_CCMP_OUTBOUND: jobDescParam.jobTypeId = e_DCL_JOB_CCMP_ENCRYPT; jobDescParam.keyDataBytes = (uint32_t) ((CCMP_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((CCMP_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((CCMP_REQ *)req)->FrameDataBytes; jobDescParam.inData = (uint8_t *) ((CCMP_REQ *)req)->FrameData; jobDescParam.MICDataBytes = (uint32_t) ((CCMP_REQ *)req)->MICBytes; jobDescParam.inMICData = (uint8_t *) ((CCMP_REQ *)req)->MICData; jobDescParam.AADDataBytes = (uint32_t) ((CCMP_REQ *)req)->AADBytes; jobDescParam.AADData = (uint8_t *) ((CCMP_REQ *)req)->AADData; jobDescParam.outDataBytes = (uint32_t) ((CCMP_REQ *)req)->cryptDataBytes; jobDescParam.outData = (uint8_t *) ((CCMP_REQ *)req)->cryptDataOut; jobDescParam.inCtxDataBytes = (uint32_t) ((CCMP_REQ *)req)->ctxBytes; jobDescParam.inCtxData = (uint8_t *) ((CCMP_REQ *)req)->context; break; case DPD_802_11_CCMP_INBOUND: /* TODO: Should this be supported? */ break; case DPD_CHKSUM_CRC: jobDescParam.jobTypeId = e_DCL_JOB_CHKSUM_CRC; jobDescParam.inDataBytes = (uint32_t) ((CHKSUM_CRC_REQ *)req)->inDataBytes; jobDescParam.inData = (uint8_t *) ((CHKSUM_CRC_REQ *)req)->inData; jobDescParam.inCtxDataBytes = (uint32_t) ((CHKSUM_CRC_REQ *)req)->inCtxDataBytes; jobDescParam.inCtxData = (uint8_t *) ((CHKSUM_CRC_REQ *)req)->inCtxData; jobDescParam.outDataBytes = (uint32_t) ((CHKSUM_CRC_REQ *)req)->crcOutBytes; jobDescParam.outData = (uint8_t *) ((CHKSUM_CRC_REQ *)req)->crcOut; jobDescParam.keyDataBytes = (uint32_t) ((CHKSUM_CRC_REQ *)req)->crcOutBytes; /* Polynomial is always same size as crcOut */ jobDescParam.keyData = (uint8_t *) ((CHKSUM_CRC_REQ *)req)->polynomialData; jobDescParam.options = (uint32_t) ((CHKSUM_CRC_REQ *)req)->crcOptions; break; case DPD_DMA: jobDescParam.jobTypeId = e_DCL_JOB_MOVE_DATA; jobDescParam.inDataBytes = (uint32_t) ((DMA_REQ *)req)->inDataBytes; jobDescParam.inData = (uint8_t *) ((DMA_REQ *)req)->inData; jobDescParam.outData = (uint8_t *) ((DMA_REQ *)req)->outData; jobDescParam.options = (uint32_t) ((DMA_REQ *)req)->options; break; case DPD_AESCCM_ENCRYPT: jobDescParam.jobTypeId = e_DCL_JOB_AESCCM_ENCRYPT; jobDescParam.keyDataBytes = (uint32_t) ((AESCCM_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((AESCCM_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((AESCCM_REQ *)req)->inDataBytes; jobDescParam.inData = (uint8_t *) ((AESCCM_REQ *)req)->inData; jobDescParam.MICDataBytes = (uint32_t) ((AESCCM_REQ *)req)->MICBytes; jobDescParam.inMICData = (uint8_t *) ((AESCCM_REQ *)req)->inMICData; jobDescParam.outMICData = (uint8_t *) ((AESCCM_REQ *)req)->outMICData; jobDescParam.AADDataBytes = (uint32_t) ((AESCCM_REQ *)req)->AADBytes; jobDescParam.AADData = (uint8_t *) ((AESCCM_REQ *)req)->AADData; jobDescParam.outDataBytes = (uint32_t) ((AESCCM_REQ *)req)->outDataBytes; jobDescParam.outData = (uint8_t *) ((AESCCM_REQ *)req)->outData; jobDescParam.inCtxDataBytes = (uint32_t) ((AESCCM_REQ *)req)->ctxBytes; jobDescParam.inCtxData = (uint8_t *) ((AESCCM_REQ *)req)->ctx; jobDescParam.options = (uint32_t) ((AESCCM_REQ *)req)->options; break; case DPD_AESCCM_DECRYPT: jobDescParam.jobTypeId = e_DCL_JOB_AESCCM_DECRYPT; jobDescParam.keyDataBytes = (uint32_t) ((AESCCM_REQ *)req)->keyBytes; jobDescParam.keyData = (uint8_t *) ((AESCCM_REQ *)req)->keyData; jobDescParam.inDataBytes = (uint32_t) ((AESCCM_REQ *)req)->inDataBytes; jobDescParam.inData = (uint8_t *) ((AESCCM_REQ *)req)->inData; jobDescParam.MICDataBytes = (uint32_t) ((AESCCM_REQ *)req)->MICBytes; jobDescParam.inMICData = (uint8_t *) ((AESCCM_REQ *)req)->inMICData; jobDescParam.outMICData = (uint8_t *) ((AESCCM_REQ *)req)->outMICData; jobDescParam.AADDataBytes = (uint32_t) ((AESCCM_REQ *)req)->AADBytes; jobDescParam.AADData = (uint8_t *) ((AESCCM_REQ *)req)->AADData; jobDescParam.outDataBytes = (uint32_t) ((AESCCM_REQ *)req)->outDataBytes; jobDescParam.outData = (uint8_t *) ((AESCCM_REQ *)req)->outData; jobDescParam.inCtxDataBytes = (uint32_t) ((AESCCM_REQ *)req)->ctxBytes; jobDescParam.inCtxData = (uint8_t *) ((AESCCM_REQ *)req)->ctx; jobDescParam.options = (uint32_t) ((AESCCM_REQ *)req)->options; break; #ifdef IPIPSEC2 case DPD_IPSEC_CBC_SDES_DECRYPT_MD5_PAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_DES; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96; break; case DPD_IPSEC_CBC_SDES_ENCRYPT_MD5_PAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_DES; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96; break; case DPD_IPSEC_CBC_SDES_DECRYPT_SHA_PAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_DES; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96; break; case DPD_IPSEC_CBC_SDES_ENCRYPT_SHA_PAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_DES; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96; break; case DPD_IPSEC_CBC_TDES_DECRYPT_MD5_PAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_3DES; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96; break; case DPD_IPSEC_CBC_TDES_ENCRYPT_MD5_PAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_3DES; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96; break; case DPD_IPSEC_CBC_TDES_DECRYPT_SHA_PAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_3DES; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96; break; case DPD_IPSEC_CBC_TDES_ENCRYPT_SHA_PAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_3DES; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96; break; case DPD_IPSEC_AES_CBC_DECRYPT_MD5_APAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_AES_CBC; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96; break; case DPD_IPSEC_AES_CBC_ENCRYPT_MD5_APAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_AES_CBC; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_MD5_96; break; case DPD_IPSEC_AES_CBC_DECRYPT_SHA_APAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_DEC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_AES_CBC; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96; break; case DPD_IPSEC_AES_CBC_ENCRYPT_SHA_APAD: jobIsIpsec = TRUE; ipsecJobDescParam.jobTypeId = e_DCL_JOB_IPSEC; ipsecJobDescParam.jobDirection = e_DCL_JOB_ENC; ipsecJobDescParam.cryptoAlg = e_IPSEC_CRYPTO_ALG_AES_CBC; ipsecJobDescParam.authAlg = e_IPSEC_AUTHEN_ALG_HMAC_SHA1_96; break; #endif default: return ERROR_CODE(E_NOT_SUPPORTED); } /* Create job descriptor */ if(jobIsIpsec == TRUE) { ipsecJobDescParam.cryptoKeyData = ((IPSEC_CBC_REQ *)req)->cryptKeyData; ipsecJobDescParam.cryptoKeyDataBytes = ((IPSEC_CBC_REQ *)req)->cryptKeyBytes; ipsecJobDescParam.hashKeyDataBytes = ((IPSEC_CBC_REQ *)req)->hashKeyBytes; ipsecJobDescParam.hashKeyData = ((IPSEC_CBC_REQ *)req)->hashKeyData; ipsecJobDescParam.hashInDataBytes = ((IPSEC_CBC_REQ *)req)->hashInDataBytes; ipsecJobDescParam.hashInData = ((IPSEC_CBC_REQ *)req)->hashInData; ipsecJobDescParam.hashOutDataBytes = ((IPSEC_CBC_REQ *)req)->hashDataOutBytes; ipsecJobDescParam.hashOutData = ((IPSEC_CBC_REQ *)req)->hashDataOut; ipsecJobDescParam.inCtxData = ((IPSEC_CBC_REQ *)req)->cryptCtxInData; ipsecJobDescParam.inCtxDataBytes = ((IPSEC_CBC_REQ *)req)->cryptCtxInBytes; ipsecJobDescParam.outCtxData = NULL; /* Next packet IV is currently handled by caller */ ipsecJobDescParam.outCtxDataBytes = 0; ipsecJobDescParam.inData = ((IPSEC_CBC_REQ *)req)->inData; ipsecJobDescParam.inDataBytes = ((IPSEC_CBC_REQ *)req)->inDataBytes; ipsecJobDescParam.outData = ((IPSEC_CBC_REQ *)req)->cryptDataOut - ipsecJobDescParam.hashInDataBytes; SEC4Dump(DBGTXT_SETRQ, ("SEC4 IPsec Job request params:\n"\ " jobDirection: %u\n"\ " cryptoAlg: %u\n"\ " authAlg: %u\n"\ " cryptoKeyDataBytes: %u\n"\ " hashKeyDataBytes: %u\n"\ " hashInDataBytes: %u\n"\ " hashOutDataBytes: %u\n"\ " inCtxDataBytes: %u\n"\ " outCtxDataBytes: %u\n"\ " inDataBytes: %u\n",\ ipsecJobDescParam.jobDirection,\ ipsecJobDescParam.cryptoAlg,\ ipsecJobDescParam.authAlg,\ ipsecJobDescParam.cryptoKeyDataBytes,\ ipsecJobDescParam.hashKeyDataBytes,\ ipsecJobDescParam.hashInDataBytes,\ ipsecJobDescParam.hashOutDataBytes,\ ipsecJobDescParam.inCtxDataBytes,\ ipsecJobDescParam.outCtxDataBytes,\ ipsecJobDescParam.inDataBytes)); h_JobDesc = SEC_DCL_InitIpsecJobDesc(h_SecDcl, &ipsecJobDescParam); } else { SEC4Dump(DBGTXT_SETRQ, ("SEC4 Job request params:\n"\ " jobTypeId: %u\n"\ " inDataBytes: %u\n"\ " outDataBytes: %u\n"\ " keyDataBytes: %u\n"\ " inCtxDataBytes: %u\n"\ " outCtxDataBytes: %u\n"\ " modDataBytes: %u\n"\ " MICDataBytes: %u\n"\ " AADDataBytes: %u\n", jobDescParam.jobTypeId,\ jobDescParam.inDataBytes,\ jobDescParam.outDataBytes,\ jobDescParam.keyDataBytes,\ jobDescParam.inCtxDataBytes,\ jobDescParam.outCtxDataBytes,\ jobDescParam.modDataBytes,\ jobDescParam.MICDataBytes,\ jobDescParam.AADDataBytes)); h_JobDesc = SEC_DCL_InitJobDesc(h_SecDcl, &jobDescParam); } if(NULL == h_JobDesc) { SEC4Dump(DBGTXT_SETRQ,("SEC_JQ_Enqueue() :: Error creating jobDescriptor\n")); return ERROR_CODE(E_NO_MEMORY); } req->jobDesc = h_JobDesc; /* Print descriptor */ SEC4DbgDo(DBGTXT_DESCSHOW, SEC_DCL_DebugPrintDescriptor((t_Desc *)h_JobDesc)); /* Enqueue job to SEC engine*/ h_Context = (t_Handle) req; IOLockJobEnqueue(); #ifdef SEC4_USE_SHARED_JOB_QUEUE sec4IpcVector[sec4CoreId].state = SEC4_IPC_STATE_PENDING; sec4IpcVector[sec4CoreId].req = req; /* Update core ID in request to be able to get the job back to the same core */ req->coreId = sec4CoreId; /* Protect the shared job queue while enqueueing job */ sec4spinLockLock(SEC4_SH_JQ_SPINLOCK_ID); #endif status = SEC_JQ_Enqueue(h_SecJobQueue, (void *) ((t_Desc *)h_JobDesc)->p_Buffer, h_Context); #ifdef SEC4_USE_SHARED_JOB_QUEUE sec4spinLockUnlock(SEC4_SH_JQ_SPINLOCK_ID); #endif IOUnLockJobEnqueue(); if(E_OK != status) { SEC4Dump(DBGTXT_SETRQ,("SEC_JQ_Enqueue() :: Error: 0x%x, from SEC_JQ_Enqueue\n", status)); SEC_DCL_FreeDesc(h_JobDesc); return status; } SEC4Dump(DBGTXT_SETRQ, ("SEC_JQ_Enqueue() :: h_Context=0x%x, h_JobDesc=0x%x, JobDescBuffer=0x%x\n", (uint32_t) h_Context, (uint32_t) h_JobDesc, ((t_Desc *)h_JobDesc)->p_Buffer)); return SEC4_SUCCESS; } /* end of ProcessRequest() */ /* *=========================================================================== * ProcessingComplete *=========================================================================== * Description: Process completed jobs that is sent by the ISR. * Parameters: * Returns: * */ void ProcessingComplete(void) { static COMPLETED_JOB completedJob; GENERIC_REQ *pReq; static int jobStatus; COMPLETED_JOB *pCompletedJob = &completedJob; int i; #ifdef SEC4_USE_SHARED_JOB_QUEUE /* Wait for vector to be initialized */ while((volatile)(sec4IpcVector) == NULL) { taskDelay(10); } #endif /* we sit here forever, waiting for job completion messages from the ISR */ for(;;) { #ifdef SEC4_USE_SHARED_JOB_QUEUE /* Poll shared vector for completed jobs */ while((volatile)(sec4IpcVector[sec4CoreId].state) != SEC4_IPC_STATE_DONE) { taskDelay(1); /* TODO */ } pReq = (GENERIC_REQ *)sec4IpcVector[sec4CoreId].req; jobStatus = pReq->status; /* Clear shared vector */ sec4IpcVector[sec4CoreId].req = NULL; sec4IpcVector[sec4CoreId].state = SEC4_IPC_STATE_IDLE; #else /* Wait for job completion message from the ISR */ if (msgQReceive(IsrMsgQId, (char*)pCompletedJob, sizeof(COMPLETED_JOB), WAIT_FOREVER) != sizeof(COMPLETED_JOB)) { SEC4Dump(DBGTXT_ERROR,("ProcessingComplete() :: Error: msgQReceive errno = %d\n", errno)); continue; } if(pCompletedJob == NULL) { SEC4Dump(DBGTXT_ERROR, ("ProcessingComplete() :: job error: pCompletedJob=NULL\n")); return; } pReq = pCompletedJob->req; if(pReq == NULL) { SEC4Dump(DBGTXT_ERROR, ("ProcessingComplete() :: job error: pReq=NULL\n")); pCompletedJob->jobStatus = SEC4_JOB_ERROR; return; } jobStatus = pCompletedJob->jobStatus; pReq->status = jobStatus; #endif if((0 == jobStatus) && (pReq->jobDesc != NULL)) { /* Job executed without errors */ SEC4Dump(DBGTXT_SVCRQ, ("ProcessingComplete() :: job ok: jobDesc=0x%x, notifyCtx=0x%x, jobStatus=0x%x\n", pReq->jobDesc, pReq->pNotifyCtx, jobStatus)); SEC4DbgDo(DBGTXT_DESCSHOW, SEC_DCL_DebugPrintDescriptor((t_Desc *) pReq->jobDesc)); /* Free job descriptor as its job is done*/ SEC_DCL_FreeDesc((t_Handle *) (pReq->jobDesc)); pReq->jobDesc = NULL; /* Notify waiting context, that may now continue */ if (pReq->notifyFlags & NOTIFY_IS_PID) { kill((long)(pReq->notify), SIGUSR1); } else { if ((pReq->notify) != NULL) pReq->notify(pReq->pNotifyCtx); } } else { /* Job had errors */ pReq->status = SEC4_JOB_ERROR; SEC4Dump(DBGTXT_ERROR, ("ProcessingComplete() :: job error: jobDesc=0x%x, notifyCtx=0x%x, jobStatus=0x%x\n", (uint32_t) pReq->jobDesc, (uint32_t) pReq->pNotifyCtx, jobStatus)); SEC4DbgDo(DBGTXT_ERROR, SEC_PrintJobStatus(jobStatus)); if(pReq->jobDesc != NULL) { SEC4DbgDo(DBGTXT_DESCSHOW, SEC_DCL_DebugPrintDescriptor((t_Desc *)pReq->jobDesc)); /* Free job descriptor as its job is done*/ SEC_DCL_FreeDesc((t_Handle *) (pReq->jobDesc)); pReq->jobDesc = NULL; } /* Notify waiting context, that may now continue */ if (pReq->notifyFlags & NOTIFY_ERROR_IS_PID) { kill((long)(pReq->notify_on_error), SIGUSR2); } else { if ((pReq->notify_on_error) != NULL) { /* (Error code may be decoded using SEC_DecodeJobStatus() )*/ pReq->ctxNotifyOnErr.errorcode = jobStatus; pReq->ctxNotifyOnErr.request = pReq; /* Call the handler */ pReq->notify_on_error(&(pReq->ctxNotifyOnErr)); } else { SEC4Dump(DBGTXT_ERROR, ("ProcessingComplete() :: Error: pReq->notify_on_error=NULL. Can not notify calling context\n")); } } } /* Dump job queue registers */ SEC4DbgDo(DBGTXT_DESCSHOW, SEC_JQ_DumpRegisters(h_SecJobQueue)); SEC4Dump(DBGTXT_SVCRQ, ("ProcessingComplete Done\n")); } /* if (message from queue) */ } /* End of ProcessingComplete */ #ifdef SEC4_POLLED_MODE /* *=========================================================================== * PollComplete *=========================================================================== * Description: Poll SEC4 engine job queue for completed jobs. * They will call their job completion callback function. * Parameters: * Returns: * */ void PollComplete(void) { t_Error jobStatus; /* we sit here forever, looking for job completion from the SEC job queue */ for(;;) { taskDelay(1); /* TODO: What delay to use here? */ #ifdef SEC4_USE_SHARED_JOB_QUEUE /* Only master core polls for completed jobs */ if(sec4CoreId == NCSW_MASTER_ID) #endif { if(h_SecJobQueue != NULL) { jobStatus = SEC_JQ_Dequeue(h_SecJobQueue); if(jobStatus != E_OK) { SEC4DbgDo(DBGTXT_ERROR, ("PollComplete: Error: SEC_JQ_Dequeue returned %d\n", jobStatus)); } } } } } #endif /* #ifdef SEC4_POLLED_MODE */ /* *=========================================================================== * GetStatus *=========================================================================== * Description: Get current values of SEC4 status registers. * Parameters: * Returns: * */ int GetStatus(STATUS_REQ *pStatus, int callingTaskId) { t_Sec* p_Sec = (t_Sec*)h_Sec4; t_SecStatRegs* p_SecStatCopy = (t_SecStatRegs*) pStatus; /* Copy device registers */ p_SecStatCopy->ccbvidr = p_Sec->p_MemMap->stat.ccbvidr; p_SecStatCopy->chanumr = p_Sec->p_MemMap->stat.chanumr; p_SecStatCopy->chavidr = p_Sec->p_MemMap->stat.chavidr; p_SecStatCopy->crnr = p_Sec->p_MemMap->stat.crnr; p_SecStatCopy->ctpr = p_Sec->p_MemMap->stat.ctpr; p_SecStatCopy->fadr = p_Sec->p_MemMap->stat.fadr; p_SecStatCopy->falr = p_Sec->p_MemMap->stat.falr; p_SecStatCopy->far = p_Sec->p_MemMap->stat.far; p_SecStatCopy->ib_dec_req = p_Sec->p_MemMap->stat.ib_dec_req; p_SecStatCopy->ib_decrypt = p_Sec->p_MemMap->stat.ib_decrypt; p_SecStatCopy->ib_validated = p_Sec->p_MemMap->stat.ib_validated; p_SecStatCopy->ob_enc_req = p_Sec->p_MemMap->stat.ob_enc_req; p_SecStatCopy->ob_encrypt = p_Sec->p_MemMap->stat.ob_encrypt; p_SecStatCopy->ob_protect = p_Sec->p_MemMap->stat.ob_protect; p_SecStatCopy->req_deq = p_Sec->p_MemMap->stat.req_deq; p_SecStatCopy->rvidr = p_Sec->p_MemMap->stat.rvidr; p_SecStatCopy->secvidr = p_Sec->p_MemMap->stat.secvidr; p_SecStatCopy->sstar = p_Sec->p_MemMap->stat.sstar; return SEC4_SUCCESS; } /* **************************************************************************** * END OF FILE **************************************************************************** */