📄 sec2_algo.c
字号:
{
DRV_IPSEC_DBG("drv_sec2_aes_crypt: inType error!\n");
return SEC2_ERROR;
}
if(inType == ESP_ALGO_TYPE)
{
switch(algoid)
{
case ALGO_ESP_OUTPUT_AES_NULL: /* DES 加密 */
dpdOpId = DPD_AESA_CBC_ENCRYPT_CRYPT;
break;
case ALGO_ESP_INPUT_AES_NULL: /* 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 == IKE_ALGO_TYPE)
{
switch(algoid)
{
case ALGO_IKE_CBC_ENCRYPT_AES:
dpdOpId = DPD_AESA_CBC_ENCRYPT_CRYPT;
break;
case ALGO_IKE_CBC_DECRYPT_AES:
dpdOpId = DPD_AESA_CBC_DECRYPT_CRYPT;
break;
default:
DRV_IPSEC_DBG("drv_sec2_aes_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_aes_crypt: malloc DRV_SEC2_CONTEXT failed!\n");
return SEC2_ERROR;
}
ctx->msg = msg; /* 平台传入的算法消息 */
/**************** 分配描述符内存 ****************/
dpdReqLen = sizeof(AESA_CRYPT_REQ);
ctx->dpdReqMem= (UINT8*)SEC2_GETBUF(dpdReqLen);
if (NULL == ctx->dpdReqMem)
{
DRV_IPSEC_DBG("drv_sec2_aes_crypt: malloc ctx->dpdReqMem failed!\n");
drv_sec2_free_context(ctx);
return SEC2_ERROR;
}
aesReq = (AESA_CRYPT_REQ*) (ctx->dpdReqMem);
/**************** 描述符填充: DES_LOADCTX_CRYPT_REQ ****************/
aesReq->opId = dpdOpId;
aesReq->channel = 0; /*动态处理*/
aesReq->notify = (PSEC_NOTIFY_ROUTINE)drv_sec2_callback;
aesReq->pNotifyCtx = ctx;
aesReq->notify_on_error = (PSEC_NOTIFY_ON_ERROR_ROUTINE)drv_sec2_error_callback;
aesReq->ctxNotifyOnErr.request = ctx;
aesReq->status = 0;
aesReq->nextReq = NULL; /*the next req will be NULL*/
aesReq->inIvBytes = crypt->ivlen;
aesReq->inIvData = crypt->iv;
aesReq->keyBytes = crypt->keyLen;
aesReq->keyData = crypt->key;
aesReq->inBytes = crypt->inLen;
aesReq->inData = crypt->inData; /* 输入数据内存不需要再分配*/
aesReq->outCtxBytes = crypt->ivlen;
aesReq->outCtxData = drv_ipsec_iv_out;
#if DRIVER_IPSEC_DBG
aesReq->outData = drv_ipsec_out_internalSec2; /* 8byte 边界对齐*/
#else
aesReq->outData = crypt->outData; /* 输出需要8byte 对齐 */
#endif
/**************** 下发硬件处理 ****************/
ipsec_status = (UINT32)SEC2_ioctl(IOCTL_PROC_REQ, aesReq);
if (SEC2_SUCCESS != ipsec_status)
{
DRV_IPSEC_DBG("drv_sec2_aes_crypt: Ioctl failed!\n");
drv_sec2_free_context(ctx);
}
return ipsec_status;
}
/**************************************************************************
* 函数名称:drv_sec2_Aes_ctr_crypt
* 功能描述:对称加解密AES算法的实现
* 输入参数:algoid --算法标识
* arg_in --mux传入参数
* withQflag --是否需要sec2引入队列
* 输出 :SEC2_ioctl,下发硬件模块
* 返 回 值:成功返回SEC2_SUCCESS,错误返回SEC2_ERROR或者下层返回的错误码
* 其它说明:8349或8541内置加密核适配模块
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006-7-12 V1.0 陈晓 创建
**************************************************************************/
int drv_sec2_Aes_ctr_crypt(DRV_IPSEC_ALGO_TYPE algoType, VOID *arg_in)
{
UINT32 dpdReqLen; /* 描述符字节长度 */
UINT32 outParaLen; /* 输出参数字节数 */
unsigned char *inParaKey;
int ipsec_status = SEC2_ERROR;
DRV_SEC2_CONTEXT *ctx = (DRV_SEC2_CONTEXT *)NULL; /* 上下文结构 */
algo_msg_crypt_t *crypt = (algo_msg_crypt_t *)NULL;
AESA_CRYPT_REQ *aesReq = (AESA_CRYPT_REQ *)NULL;
void* msg = NULL;
DRV_LNDEC_ALG_REQ_PARA *in_param = (DRV_LNDEC_ALG_REQ_PARA *)NULL;
/**************** 参数合法性检查和赋值 ****************/
in_param = (DRV_LNDEC_ALG_REQ_PARA*)arg_in;
if(NULL != (algo_msg_crypt_t*)in_param->crypt)
{
crypt = (algo_msg_crypt_t*)in_param->crypt;
}
else
{
DRV_IPSEC_DBG("drv_sec2_aes_ctr_crypt: in param crypt null!");
return SEC2_ERROR;
}
if (NULL != in_param->data)
{
msg = in_param->data;
}
else
{
DRV_IPSEC_DBG("drv_sec2_aes_ctr_crypt: msg == NULL!");
return SEC2_ERROR;
}
if ((NULL == crypt) || (NULL == crypt->inData)
|| (NULL == crypt->key) || (NULL == crypt->outData))
{
DRV_IPSEC_DBG("drv_sec2_aes_ctr_crypt: algoid or auth error!");
return SEC2_ERROR;
}
if (!ChkAesKeyLen(crypt->keyLen))
{
DRV_IPSEC_DBG("drv_sec2_aes_ctr_crypt: Parameters length error!");
return SEC2_ERROR;
}
/**************** 分配上下文内存 ****************/
ctx = (DRV_SEC2_CONTEXT*)SEC2_GETBUF(sizeof(DRV_SEC2_CONTEXT));
if (NULL == ctx)
{
DRV_IPSEC_DBG("drv_sec2_aes_ctr_crypt: malloc DRV_SEC2_CONTEXT failed!");
return SEC2_ERROR;
}
ctx->msg = msg; /* 平台传入的算法消息 */
/**************** 分配描述符内存 ****************/
dpdReqLen = sizeof(AESA_CRYPT_REQ);
ctx->dpdReqMem= (UINT8*) SEC2_GETBUF(dpdReqLen);
if (NULL == ctx->dpdReqMem)
{
DRV_IPSEC_DBG("drv_sec2_aes_ctr_crypt: malloc ctx->dpdReqMem failed!");
drv_sec2_free_context(ctx);
return SEC2_ERROR;
}
aesReq = (AESA_CRYPT_REQ*)(ctx->dpdReqMem);
/**************** 分配输入参数 ****************/
inParaKey = crypt->key;
/**************** 分配输出参数内存 ****************/
/* 输出数据内存 ,需要以8byte 边界对齐*/
outParaLen = DRV_MULT_8BYTES((crypt->outLen));
/**************** 描述符填充: DES_LOADCTX_CRYPT_REQ ****************/
aesReq->opId = DPD_AESA_CTR_CRYPT;
aesReq->channel = 0; /*动态处理*/
aesReq->notify = (PSEC_NOTIFY_ROUTINE)drv_sec2_callback;
aesReq->pNotifyCtx = ctx;
aesReq->notify_on_error = (PSEC_NOTIFY_ON_ERROR_ROUTINE)drv_sec2_error_callback;
aesReq->ctxNotifyOnErr.request = ctx;
aesReq->status = 0;
aesReq->nextReq = NULL; /*the next req will be NULL*/
aesReq->keyBytes= crypt->keyLen;
aesReq->keyData = crypt->key;
aesReq->inBytes = crypt->inLen;
aesReq->inData = crypt->inData; /* 输入数据内存不需要再分配*/
aesReq->outData = crypt->outData;
#if DRIVER_IPSEC_DBG
aesReq->outData = drv_ipsec_out_internalSec2; /* 8byte 边界对齐*/
#else
aesReq->outData = crypt->outData; /* 输出需要8byte 对齐 */
#endif
/**************** 下发硬件处理 ****************/
ipsec_status = (UINT32)SEC2_ioctl(IOCTL_PROC_REQ, aesReq);
if (SEC2_SUCCESS != ipsec_status)
{
DRV_IPSEC_DBG("drv_sec2_aes_ctr_crypt: Ioctl failed!\n");
drv_sec2_free_context(ctx);
}
return ipsec_status;
}
/**************************************************************************
* 函数名称:drv_sec2_hmac_auth
* 功能描述:实现了MD5/SHA 两种HMAC 算法,用于协议认证
* 需要满足 (1) 输入处理数据长度<= 2048 byte
* (2)输出数据长度MD5 <= 16 byte, SHA <= 20 byte
* 输入参数:algoid --算法标识
* arg_in --mux传入参数
* withQflag --是否需要sec2引入队列
* 输出参数:SEC2_ioctl,下发硬件模块
* 返 回 值:成功返回SEC2_SUCCESS,错误返回SEC2_ERROR或者下层返回的错误码
* 其它说明:8349或8541内置加密核适配模块
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006-7-12 V1.0 陈晓 创建
**************************************************************************/
int drv_sec2_hmac_auth(DRV_IPSEC_ALGO_TYPE algoType, VOID* arg_in)
{
UINT32 hashLen=0; /* HASH 算法产生的消息摘要长度 */
UINT32 dpdReqLen; /* 描述符字节长度 */
UINT32 dpdpadOpId = 0; /* 描述符标识符 */
int ipsec_status = SEC2_ERROR; /* 返回状态*/
DRV_SEC2_CONTEXT *ctx = (DRV_SEC2_CONTEXT *)NULL; /* 上下文结构 */
HMAC_PAD_REQ *padReq = (HMAC_PAD_REQ *)NULL; /* SEC2的 HMAC pad 请求结构 */
algo_msg_hmac_t *auth = (algo_msg_hmac_t *)NULL;
void* msg = NULL;
DRV_LNDEC_ALG_REQ_PARA *in_param = (DRV_LNDEC_ALG_REQ_PARA *)NULL;
UINT32 algoid = 0;
UINT32 inType = 0;
/**************** 参数合法性检查和赋值 ****************/
in_param = (DRV_LNDEC_ALG_REQ_PARA*)arg_in;
algoid = in_param->algoid;
inType = in_param->algotype;
if(NULL != (algo_msg_hmac_t*)in_param->auth)
{
auth = (algo_msg_hmac_t*)in_param->auth;
}
else
{
DRV_IPSEC_DBG("drv_sec2_hmac_auth: in param auth null!\n");
return SEC2_ERROR;
}
if (NULL != in_param->data)
{
msg = in_param->data;
}
else
{
DRV_IPSEC_DBG("drv_sec2_hmac_auth: in param msg NULL!\n");
return SEC2_ERROR;
}
#if DRIVER_IPSEC_DBG
if (((algoType != DRV_IPSEC_HMAC_MD5_AUTH) && (algoType != DRV_IPSEC_HMAC_SHA_AUTH)
&& (algoType != DRV_IPSEC_HMAC_SHA256_AUTH))
|| (NULL == auth) || (NULL == auth->inData) || (NULL == auth->key) || (NULL == auth->outData)
|| ((algoType == DRV_IPSEC_HMAC_MD5_AUTH) && (auth->outLen > DRV_IPSEC_MD5_DIG_LEN))
|| ((algoType == DRV_IPSEC_HMAC_SHA_AUTH) && (auth->outLen > DRV_IPSEC_SHA_DIG_LEN))
|| ((algoType == DRV_IPSEC_HMAC_SHA256_AUTH) && (auth->outLen > DRV_IPSEC_SHA256_DIG_LEN)))
{
DRV_IPSEC_DBG("drv_sec2_hmac_auth: algoid or algo error!\n");
return SEC2_ERROR;
}
#else
if ((NULL == auth) || (NULL == auth->inData) || (NULL == auth->key) || (NULL == auth->outData))
{
DRV_IPSEC_DBG("drv_sec2_hmac_auth: algoid or algo error!\n");
return SEC2_ERROR;
}
#endif
/* 算法类型检查和获得相应描述符标识 */
#if DRIVER_IPSEC_DBG
switch(algoType)
{
case DRV_IPSEC_HMAC_MD5_AUTH: /* MD5 */
hashLen = DRV_IPSEC_MD5_DIG_LEN;
dpdpadOpId = DPD_MD5_LDCTX_HMAC_PAD_ULCTX;
break;
case DRV_IPSEC_HMAC_SHA_AUTH: /* SHA1 */
hashLen = DRV_IPSEC_SHA_DIG_LEN;
dpdpadOpId = DPD_SHA_LDCTX_HMAC_PAD_ULCTX;
break;
case DRV_IPSEC_HMAC_SHA256_AUTH:
hashLen = DRV_IPSEC_SHA256_DIG_LEN;
dpdpadOpId = DPD_SHA256_LDCTX_HMAC_PAD_ULCTX;
break;
default:
DRV_IPSEC_DBG("drv_sec2_hmac_auth: algoType error!\n");
return SEC2_ERROR;
}
#else
if((inType != AH_ALGO_TYPE) && (inType != ESP_ALGO_TYPE)&&(inType != IKE_ALGO_TYPE))
{
DRV_IPSEC_DBG("drv_sec2_hmac_auth: inType error!\n");
return SEC2_ERROR;
}
if(inType == AH_ALGO_TYPE)
{
switch(algoid)
{
case ALGO_AH_MD5:
hashLen = DRV_IPSEC_MD5_DIG_LEN;
dpdpadOpId = DPD_MD5_LDCTX_HMAC_PAD_ULCTX;
break;
case ALGO_AH_SHA:
hashLen = DRV_IPSEC_SHA_DIG_LEN;
dpdpadOpId = DPD_SHA_LDCTX_HMAC_PAD_ULCTX;
break;
#if 0
case ALGO_AH_SHA256:
hashLen = DRV_IPSEC_SHA256_DIG_LEN;
dpdpadOpId = DPD_SHA256_LDCTX_HMAC_PAD_ULCTX;
break;
#endif
default:
DRV_IPSEC_DBG("drv_sec2_hmac_auth: algoid error!\n");
return SEC2_ERROR;
}
}
else if(inType == ESP_ALGO_TYPE)
{
switch(algoid)
{
case ALGO_ESP_INPUT_NULL_MD5: /* MD5 */
case ALGO_ESP_OUTPUT_NULL_MD5:
hashLen = DRV_IPSEC_MD5_DIG_LEN;
dpdpadOpId = DPD_MD5_LDCTX_HMAC_PAD_ULCTX;
break;
case ALGO_ESP_INPUT_NULL_SHA: /* SHA */
case ALGO_ESP_OUTPUT_NULL_SHA:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -