📄 sec2_algo.c
字号:
#else
if((inType != ESP_ALGO_TYPE) && (inType != IKE_ALGO_TYPE))
{
DRV_IPSEC_DBG("drv_sec2_des_crypt: inType error!\n");
return SEC2_ERROR;
}
if(inType == ESP_ALGO_TYPE)
{
switch(algoid)
{
case ALGO_ESP_OUTPUT_DES_NULL: /* DES 加密 */
dpdOpId = DPD_SDES_CBC_CTX_ENCRYPT;
break;
case ALGO_ESP_INPUT_DES_NULL: /* DES 解密 */
dpdOpId = DPD_SDES_CBC_CTX_DECRYPT;
break;
default:
DRV_IPSEC_DBG("drv_sec2_des_crypt: algoType error!\n");
return SEC2_ERROR;
}
}
else if(inType == IKE_ALGO_TYPE)
{
switch(algoid)
{
case ALGO_IKE_CBC_ENCRYPT_DES:
dpdOpId = DPD_SDES_CBC_CTX_ENCRYPT;
break;
case ALGO_IKE_CBC_DECRYPT_DES:
dpdOpId = DPD_SDES_CBC_CTX_DECRYPT;
break;
default:
DRV_IPSEC_DBG("drv_sec2_des_crypt: algoType error!\n");
return SEC2_ERROR;
}
}
#endif
/**************** 分配上下文内存 ****************/
ctx = (DRV_SEC2_CONTEXT*)SEC2_GETBUF(sizeof(DRV_SEC2_CONTEXT));
if (NULL == ctx)
{
DRV_IPSEC_DBG("drv_sec2_des_crypt: malloc DRV_SEC2_CONTEXT failed!\n");
return SEC2_ERROR;
}
ctx->msg = msg; /* 平台传入的算法消息 */
/**************** 分配描述符内存 ****************/
dpdReqLen = sizeof(DES_LOADCTX_CRYPT_REQ);
ctx->dpdReqMem= (UINT8*)SEC2_GETBUF(dpdReqLen);
if (NULL == ctx->dpdReqMem)
{
DRV_IPSEC_DBG("drv_sec2_des_crypt: malloc ctx->dpdReqMem failed!\n");
drv_sec2_free_context(ctx);
return SEC2_ERROR;
}
cryptReq = (DES_LOADCTX_CRYPT_REQ*) (ctx->dpdReqMem);
/**************** 描述符填充: DES_LOADCTX_CRYPT_REQ ****************/
cryptReq->opId = dpdOpId;
cryptReq->channel = 0; /*动态处理*/
cryptReq->notify = (PSEC_NOTIFY_ROUTINE)drv_sec2_callback;
cryptReq->pNotifyCtx = ctx;
cryptReq->notify_on_error = (PSEC_NOTIFY_ON_ERROR_ROUTINE)drv_sec2_error_callback;
cryptReq->ctxNotifyOnErr.request = ctx;
cryptReq->status = 0;
cryptReq->nextReq = NULL; /*the next req will be NULL*/
cryptReq->inIvBytes = crypt->ivlen;
cryptReq->inIvData = crypt->iv;
cryptReq->keyBytes = crypt->keyLen;
cryptReq->keyData = crypt->key;
cryptReq->inBytes = crypt->inLen;
cryptReq->inData = crypt->inData; /* 输入数据内存不需要再分配*/
cryptReq->outIvBytes = crypt->ivlen;
cryptReq->outIvData = drv_ipsec_iv_out;
#if DRIVER_IPSEC_DBG
if(algoType == DRV_IPSEC_DES_ENCRYPT)
cryptReq->outData = drv_ipsec_out_internalSec2;
else
cryptReq->outData = ipsec_onlytest;
#else
cryptReq->outData = crypt->outData;
#endif
/**************** 下发硬件处理 ****************/
ipsec_status = SEC2_ioctl(IOCTL_PROC_REQ, cryptReq);
if (SEC2_SUCCESS != ipsec_status)
{
DRV_IPSEC_DBG("drv_sec2_des_crypt: Ioctl failed!\n");
drv_sec2_free_context(ctx);
}
return ipsec_status;
}
/**************************************************************************
* 函数名称:drv_sec2_tdes_crypt
* 功能描述:对称加解密tDES算法的实现
* 输入参数:algoid --算法标识
* arg_in --mux传入参数
* withQflag --是否需要sec2引入队列
* 输出 :SEC2_ioctl,下发硬件模块
* 返 回 值:成功返回SEC2_SUCCESS,错误返回SEC2_ERROR或者下层返回的错误码
* 其它说明:8349或8541内置加密核适配模块
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006-7-12 V1.0 陈晓 创建
**************************************************************************/
int drv_sec2_tdes_crypt(DRV_IPSEC_ALGO_TYPE algoType, VOID* arg_in)
{
UINT32 dpdReqLen; /* 描述符字节长度 */
UINT32 dpdOpId = 0; /* 描述符标识符 */
int ipsec_status = SEC2_ERROR;
DRV_SEC2_CONTEXT *ctx = (DRV_SEC2_CONTEXT *)NULL; /* 上下文结构 */
DES_LOADCTX_CRYPT_REQ *cryptReq = (DES_LOADCTX_CRYPT_REQ *)NULL; /* 描述符 请求结构 */
algo_msg_crypt_t *crypt = (algo_msg_crypt_t *)NULL;
void *msg = NULL;
UINT32 algoid = 0;
UINT32 inType = 0;
DRV_LNDEC_ALG_REQ_PARA *in_param = (DRV_LNDEC_ALG_REQ_PARA *)NULL;
/**************** 参数合法性检查和赋值 ****************/
in_param = (DRV_LNDEC_ALG_REQ_PARA*)arg_in;
algoid = in_param->algoid;
inType = in_param->algotype;
if(NULL != (algo_msg_crypt_t*)in_param->crypt)
{
crypt = (algo_msg_crypt_t*)in_param->crypt;
}
else
{
DRV_IPSEC_DBG("drv_sec2_tdes_crypt: in param crypt null!\n");
return SEC2_ERROR;
}
if (NULL != in_param->data)
{
msg = in_param->data;
}
else
{
DRV_IPSEC_DBG("drv_sec2_tdes_crypt: in param msg NULL!\n");
return SEC2_ERROR;
}
if ( (NULL == crypt->inData)|| (NULL == crypt->key)
|| (NULL == crypt->iv) || (NULL == crypt->outData))
{
DRV_IPSEC_DBG("drv_sec2_tdes_crypt: algoid or auth error!\n");
return SEC2_ERROR;
}
/**************** 算法参数长度检查 ****************/
if (!ChkDesDataLen(crypt->inLen) || !ChkDesKeyLen(crypt->keyLen)||!ChkDesIvLen(crypt->ivlen))
{
DRV_IPSEC_DBG("drv_sec2_tdes_crypt: Parameters length error!\n");
return SEC2_ERROR;
}
#if DRIVER_IPSEC_DBG
/* 算法类型检查和获得相应描述符标识 */
switch(algoType)
{
case DRV_IPSEC_3DES_ENCRYPT: /* 3DES 加密 */
dpdOpId = DPD_TDES_CBC_CTX_ENCRYPT;
break;
case DRV_IPSEC_3DES_DECRYPT: /* 3DES 解密 */
dpdOpId = DPD_TDES_CBC_CTX_DECRYPT;
break;
default:
DRV_IPSEC_DBG("drv_sec2_tdes_crypt: algoType error!\n");
return SEC2_ERROR;
}
#else
if((inType != ESP_ALGO_TYPE) && (inType != IKE_ALGO_TYPE))
{
DRV_IPSEC_DBG("drv_sec2_tdes_crypt2: algoType error!\n");
return SEC2_ERROR;
}
if(inType == ESP_ALGO_TYPE)
{
switch(algoid)
{
case ALGO_ESP_OUTPUT_3DES_NULL: /* DES 加密 */
dpdOpId = DPD_TDES_CBC_CTX_ENCRYPT;
break;
case ALGO_ESP_INPUT_3DES_NULL: /* DES 解密 */
dpdOpId = DPD_TDES_CBC_CTX_DECRYPT;
break;
default:
DRV_IPSEC_DBG("drv_sec2_tdes_crypt: algoType error!\n");
return SEC2_ERROR;
}
}
else if(inType == IKE_ALGO_TYPE)
{
switch(algoid)
{
case ALGO_IKE_CBC_ENCRYPT_3DES:
dpdOpId = DPD_TDES_CBC_CTX_ENCRYPT;
break;
case ALGO_IKE_CBC_DECRYPT_3DES:
dpdOpId = DPD_TDES_CBC_CTX_DECRYPT;
break;
default:
DRV_IPSEC_DBG("drv_sec2_tdes_crypt: algoType error!\n");
return SEC2_ERROR;
}
}
#endif
/**************** 分配上下文内存 ****************/
ctx = (DRV_SEC2_CONTEXT*)SEC2_GETBUF(sizeof(DRV_SEC2_CONTEXT));
if (NULL == ctx)
{
DRV_IPSEC_DBG("drv_sec2_tdes_crypt: malloc DRV_SEC2_CONTEXT failed!\n");
return SEC2_ERROR;
}
ctx->msg = msg; /* 平台传入的算法消息 */
/**************** 分配描述符内存 ****************/
dpdReqLen = sizeof(DES_LOADCTX_CRYPT_REQ);
ctx->dpdReqMem= (UINT8*)SEC2_GETBUF(dpdReqLen);
if (NULL == ctx->dpdReqMem)
{
DRV_IPSEC_DBG("drv_sec2_tdes_crypt: malloc ctx->dpdReqMem failed!\n");
drv_sec2_free_context(ctx);
return SEC2_ERROR;
}
cryptReq = (DES_LOADCTX_CRYPT_REQ*) (ctx->dpdReqMem);
/**************** 描述符填充: DES_LOADCTX_CRYPT_REQ 1****************/
cryptReq->opId = dpdOpId;
cryptReq->channel = 0;
cryptReq->notify = (PSEC_NOTIFY_ROUTINE)drv_sec2_callback;
cryptReq->pNotifyCtx = ctx;
cryptReq->notify_on_error = (PSEC_NOTIFY_ON_ERROR_ROUTINE)drv_sec2_error_callback;
cryptReq->ctxNotifyOnErr.request = ctx;
cryptReq->status = 0;
cryptReq->nextReq = NULL;
cryptReq->inIvBytes = crypt->ivlen;
cryptReq->inIvData = crypt->iv;
cryptReq->keyBytes = crypt->keyLen;
cryptReq->keyData = crypt->key;
cryptReq->inBytes = crypt->inLen;
cryptReq->inData = crypt->inData; /* 输入数据内存不需要再分配*/
cryptReq->outIvBytes = crypt->ivlen;
cryptReq->outIvData = drv_ipsec_iv_out;
#if DRIVER_IPSEC_DBG
cryptReq->outData = drv_ipsec_out_internalSec2;
#else
cryptReq->outData = crypt->outData;
#endif
/**************** 下发硬件处理 ****************/
ipsec_status = (UINT32)SEC2_ioctl(IOCTL_PROC_REQ, cryptReq);
if (SEC2_SUCCESS != ipsec_status)
{
DRV_IPSEC_DBG("drv_sec2_tdes_crypt: Ioctl failed!\n");
drv_sec2_free_context(ctx);
}
return ipsec_status;
}
/**************************************************************************
* 函数名称:drv_sec2_Aes_crypt
* 功能描述:对称加解密AES算法的实现
* 输入参数:algoid--算法标识
* algo --算法参数
* msg --平台传入具有算法头的消息
* 输出 :SEC2_ioctl,下发硬件模块
* 返 回 值:成功返回SEC2_SUCCESS,错误返回SEC2_ERROR或者下层返回的错误码
* 其它说明:8349或8541内置加密核适配模块
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006-7-12 V1.0 陈晓 创建
**************************************************************************/
int drv_sec2_Aes_crypt(DRV_IPSEC_ALGO_TYPE algoType, VOID *arg_in)
{
UINT32 dpdReqLen; /* 描述符字节长度 */
UINT32 dpdOpId = 0; /* 描述符标识符 */
int ipsec_status = SEC2_ERROR;
AESA_CRYPT_REQ *aesReq = (AESA_CRYPT_REQ *)NULL;
DRV_SEC2_CONTEXT *ctx = (DRV_SEC2_CONTEXT *)NULL; /* 上下文结构 */
algo_msg_crypt_t *crypt = (algo_msg_crypt_t *)NULL;
void* msg = NULL;
UINT32 algoid = 0;
UINT32 inType = 0;
DRV_LNDEC_ALG_REQ_PARA *in_param = (DRV_LNDEC_ALG_REQ_PARA *)NULL;
/**************** 参数合法性检查和赋值 ****************/
in_param = (DRV_LNDEC_ALG_REQ_PARA*)arg_in;
algoid = in_param->algoid;
inType = in_param->algotype;
if(NULL != (algo_msg_crypt_t*)in_param->crypt)
{
crypt = (algo_msg_crypt_t*)in_param->crypt;
}
else
{
DRV_IPSEC_DBG("drv_sec2_aes_crypt: in param crypt null!\n");
return SEC2_ERROR;
}
if (NULL != in_param->data)
{
msg = in_param->data;
}
else
{
DRV_IPSEC_DBG("drv_sec2_aes_crypt: in param msg NULL!\n");
return SEC2_ERROR;
}
if ( (NULL == crypt->inData)|| (NULL == crypt->key)
|| (NULL == crypt->iv) || (NULL == crypt->outData))
{
DRV_IPSEC_DBG("drv_sec2_aes_crypt: algoid or auth error!\n");
return SEC2_ERROR;
}
if (!ChkAesKeyLen(crypt->keyLen)||!ChkAesIvLen(crypt->ivlen))
{
DRV_IPSEC_DBG("drv_sec2_aes_crypt: Parameters length error!\n");
return SEC2_ERROR;
}
#if DRIVER_IPSEC_DBG
switch(algoType)
{
case DRV_IPSEC_AES_ENCRYPT: /* DES 加密 */
dpdOpId = DPD_AESA_CBC_ENCRYPT_CRYPT;
break;
case DRV_IPSEC_AES_DECRYPT: /* DES 解密 */
dpdOpId = DPD_AESA_CBC_DECRYPT_CRYPT;
break;
default:
DRV_IPSEC_DBG("drv_sec2_aes_crypt: algoType error!\n");
return SEC2_ERROR;
}
#else
if((inType != ESP_ALGO_TYPE) && (inType != IKE_ALGO_TYPE))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -