⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sec2_algo.c

📁 freescale ppc sec2加解密单元驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
/************************************************************************
* 版权所有 (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 + -