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

📄 sec2_algo.c

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