original files of m241

This commit is contained in:
neelimap
2026-07-30 11:19:44 +05:30
parent 170c2b3f3a
commit afc7070c1f
12254 changed files with 7655111 additions and 0 deletions
@@ -0,0 +1,798 @@
/*
******************************************************************************
* 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 <stdio.h>
#include <sec_ext.h>
#include <sec_jq_ext.h>
#include <sec_dcl_cmd.h>
#include <sec_dcl.h>
#include <sec_dcl_ipfreescale.h>
#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
****************************************************************************
*/