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

📄 sec2_algo.c

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