📄 sec2_algo.c
字号:
/************************************************************************
* 版权所有 (C)2005, 深圳市中兴通讯股份有限公司。
*
* 文件名称: mpc190_security.c
* 文件标识: 见配置管理计划书
* 内容摘要: MPC190 适配层算法函数实现
* 其它说明:
* 当前版本: V1.0
* 作 者: 陈晓
* 完成日期: 2005年09月11日
*
* 修改记录1:
* 修改日期:
* 版 本 号:
* 修 改 人:陈 晓
* 修改内容:创 建
* 修改记录2:…
************************************************************************/
#include <stdio.h>
#include <memlib.h>
#include <cachelib.h>
#include "mux_ex.h"
#include "ros_ex.h"
#include "zxr10ver.h"
#include "install.h"
#include "protocol/security/common/include/algo_msg.h"
#include "protocol/security/crypto/common/include/crypto_algoid.h"
#include "sec2.h"
#include "ipsec_request.h"
#include "sec2_algo.h"
#include "sec2Driver.h"
/*为了方便比较,申请一块内存提供给输出*/
#if DRIVER_IPSEC_DBG
unsigned char drv_ipsec_out_lndec[512] = {0};
unsigned char drv_ipsec_out_lndec_hmac[32] = {0};
unsigned char drv_ipsec_out_internalSec2[512] = {0};
unsigned char drv_ipsec_out_internalSec2_hmac[32] = {0};
unsigned char ipsec_onlytest[512] = {0};
unsigned char ipsec_onlytest_hmac[512] = {0};
#endif
unsigned char drv_ipsec_iv_out[24] = {0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0};
/**************** 本文件定义的宏 ****************/
/**************** 本文件静态 函数 ****************/
void drv_sec2_free_context(DRV_SEC2_CONTEXT *ctx);
VOID drv_sec2_callback(DRV_SEC2_CONTEXT *ctx);
VOID drv_sec2_error_callback(DRV_SEC2_CONTEXT *ctx);
/**************** 引用的 系统函数 ****************/
extern void crypto_free_algo_reqmsg(void *msg_data);
extern void issc_drv_send_algo_ok(void *msg_data);
extern BOOLEAN ChkAesKeyLen(unsigned long len);
extern BOOLEAN ChkAesIvLen(unsigned long len);
extern BOOLEAN ChkCcmpKeyLen(unsigned long len);
/**************************************************************************
* 函数名称: drv_sec2_free_context
* 功能描述: 释放算法申请的内存
* 输入参数: ctx -- 算法上下文结构
* 输出参数: 无
* 返 回 值 : VOID
* 其它说明: 安全芯片sec2
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2005-09-11 V1.0 chentao135499 xxxx
**************************************************************************/
void drv_sec2_free_context(DRV_SEC2_CONTEXT *ctx)
{
if (NULL == ctx)
{
DRV_IPSEC_DBG("drv_sec2_free_context: ctx msg NULL! \n");
return;
}
if (NULL != ctx->dpdReqMem)
{
SEC2_FREEBUF(ctx->dpdReqMem);
}
#if 0
if (NULL != ctx->inParaMem)
{
free(ctx->inParaMem);
}
#endif
DRV_IPSEC_DBG("freecontext!");
SEC2_FREEBUF(ctx);
return;
}
/**************************************************************************
* 函数名称: drv_sec2_callback
* 功能描述: 算法正常执行的回调函数
* 输入参数: ctx -- 算法上下文结构
* 输出参数: 无
* 返 回 值 : VOID
* 其它说明: 安全芯片MPC190
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2005-09-11 V1.0 chentao135499 xxxx
**************************************************************************/
VOID drv_sec2_callback(DRV_SEC2_CONTEXT *ctx)
{
VOID *msg = NULL;
if (NULL == ctx)
{
DRV_IPSEC_DBG("drv_sec2_callback: ctx msg NULL!");
return;
}
/* 复制输出结果 */
msg = ctx->msg;
/* 释放算法申请的内存 */
drv_sec2_free_context(ctx);
/* 调用协议的回调*/
issc_drv_send_algo_ok(msg);
return;
}
/**************************************************************************
* 函数名称: drv_sec2_error_callback
* 功能描述: 算法异常执行的回调函数
* 输入参数: ctx -- 算法上下文结构
* 输出参数: 无
* 返 回 值 : VOID
* 其它说明: 安全芯片MPC190
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2005-09-11 V1.0 chentao135499 xxxx
**************************************************************************/
VOID drv_sec2_error_callback(DRV_SEC2_CONTEXT *ctx)
{
VOID *msg = NULL;
if (NULL == ctx)
{
DRV_IPSEC_DBG("drv_sec2_error_callback:ctx msg NULL!");
return;
}
/* 复制输出结果 */
msg = ctx->msg;
/* 释放算法申请的内存 */
drv_sec2_free_context(ctx);
/* 向平台发送算法异常消息 */
crypto_free_algo_reqmsg(msg);
return;
}
/**************************************************************************
* 函数名称:drv_sec2_rng_num
* 功能描述:随机数生成 算法RNG 的实现
* 输入参数:algoid --算法标识
* arg_in --mux传入参数
* withQflag --是否需要sec2引入队列
* 输出 :SEC2_ioctl,下发硬件模块
* 返 回 值:成功返回SEC2_SUCCESS,错误返回SEC2_ERROR或者下层返回的错误码
* 其它说明:8349或8541内置加密核适配模块
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006-7-12 V1.0 陈晓 创建
**************************************************************************/
int drv_sec2_rng_num(DRV_IPSEC_ALGO_TYPE algoType, VOID* arg_in)
{
UINT32 dpdReqLen; /* 描述符字节长度 */
UINT32 ipsec_status = (UINT32)SEC2_ERROR;
RNG_REQ *rngReq = (RNG_REQ *)NULL; /* 随机数请求结构 */
DRV_SEC2_CONTEXT * ctx = (DRV_SEC2_CONTEXT *)NULL; /* 上下文结构 */
algo_msg_rng_t * algo = (algo_msg_rng_t *)NULL;
void
* msg = NULL;
UINT32 algoid = 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;
if(NULL != (algo_msg_rng_t*)in_param->crypt)
{
algo = (algo_msg_rng_t*)in_param->crypt;
}
else
{
DRV_IPSEC_DBG("drv_sec2_rng_num: in param crypt null !\n");
return SEC2_ERROR;
}
if (NULL != in_param->data)
{
msg = in_param->data;
}
else
{
DRV_IPSEC_DBG("drv_sec2_rng_num: in param msg null! \n");
return SEC2_ERROR;
}
if (NULL == algo)
{
DRV_IPSEC_DBG("drv_sec2_rng_num: in param algo null! \n");
return SEC2_ERROR;
}
if(algo->dataLen == 0)
{
DRV_IPSEC_DBG("drv_sec2_rng_num: in param dataLen error! \n");
return SEC2_ERROR;
}
if(algo->outData == NULL)
{
DRV_IPSEC_DBG("drv_sec2_rng_num: in param outdata null! \n");
return SEC2_ERROR;
}
/**************** 分配CTX内存 ****************/
ctx = (DRV_SEC2_CONTEXT*)SEC2_GETBUF(sizeof(DRV_SEC2_CONTEXT));
if (NULL == ctx)
{
DRV_IPSEC_DBG("drv_sec2_rng_num: malloc DRV_SEC2_CONTEXT failed!\n");
return SEC2_ERROR;
}
memset(ctx, 0, sizeof(DRV_SEC2_CONTEXT));
ctx->msg = msg; /* 平台传入的算法消息,将地址给上下文,平台回调信息 */
/**************** 分配描述符内存 ****************/
dpdReqLen = sizeof(RNG_REQ);
ctx->dpdReqMem = (UINT8*)SEC2_GETBUF(dpdReqLen); /*分配内存申请地址*/
if (NULL == ctx->dpdReqMem)
{
DRV_IPSEC_DBG("drv_sec2_rng_num: malloc ctx->dpdReqMem failed!\n");
drv_sec2_free_context(ctx);
return SEC2_ERROR;
}
memset(ctx->dpdReqMem, 0, dpdReqLen);
rngReq = (RNG_REQ*) (ctx->dpdReqMem); /*把申请的内存地址给算法申请结构*/
/**************** 描述符填充 ****************/
rngReq->opId = DPD_RNG_GETRN; /*操作数ID */
rngReq->channel = 0; /*通道动态申请*//*静态*/
rngReq->notify = (PSEC_NOTIFY_ROUTINE)drv_sec2_callback;
rngReq->pNotifyCtx = ctx;
rngReq->notify_on_error = (PSEC_NOTIFY_ON_ERROR_ROUTINE)drv_sec2_error_callback;
rngReq->ctxNotifyOnErr.request = ctx;
rngReq->status = 0;
rngReq->nextReq = NULL; /*不产生链*/
rngReq->rngBytes = algo->dataLen; /*生成随机数长度*/
#if DRIVER_IPSEC_DBG
rngReq->rngData = drv_ipsec_out_internalSec2;
#else
rngReq->rngData = algo->outData;
#endif
ipsec_status = (UINT32)SEC2_ioctl(IOCTL_PROC_REQ, rngReq);
if (SEC2_SUCCESS != ipsec_status)
{
DRV_IPSEC_DBG("drv_sec2_rng_num: Ioctl failed!\n");
drv_sec2_free_context(ctx);
}
return ipsec_status;
}
/**************************************************************************
* 函数名称:drv_sec2_des_crypt
* 功能描述:对称加解密DES算法的实现
* 输入参数:algoid --算法标识
* arg_in --mux传入参数
* withQflag --是否需要sec2引入队列
* 输出 :SEC2_ioctl,下发硬件模块
* 返 回 值:成功返回SEC2_SUCCESS,错误返回SEC2_ERROR或者下层返回的错误码
* 其它说明:8349或8541内置加密核适配模块
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006-7-12 V1.0 陈晓 创建
**************************************************************************/
int drv_sec2_des_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_des_crypt: in param crypt null!\n");
return SEC2_ERROR;
}
if (NULL != in_param->data)
{
msg = in_param->data;
}
else
{
DRV_IPSEC_DBG("drv_sec2_des_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_des_crypt: algoid or auth error!\n");
return SEC2_ERROR;
}
if (!ChkDesDataLen(crypt->inLen) ||!ChkDesKeyLen(crypt->keyLen) ||!ChkDesIvLen(crypt->ivlen))
{
DRV_IPSEC_DBG("drv_sec2_des_crypt: Parameters length error!\n");
return SEC2_ERROR;
}
#if DRIVER_IPSEC_DBG
/* 算法类型检查和获得相应描述符标识 */
switch(algoType)
{
case DRV_IPSEC_DES_ENCRYPT: /* DES 加密 */
dpdOpId = DPD_SDES_CBC_CTX_ENCRYPT;
break;
case DRV_IPSEC_DES_DECRYPT: /* DES 解密 */
dpdOpId = DPD_SDES_CBC_CTX_DECRYPT;
break;
default:
DRV_IPSEC_DBG("drv_sec2_des_crypt: algoType error! \n");
return SEC2_ERROR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -