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

📄 hi_des_api.c

📁 嵌入式linux系统下hi3510平台的osd开发源码
💻 C
📖 第 1 页 / 共 3 页
字号:
        printf(" there is something wrong with the module!");        return DES_BUSY_ERR;    }    /*judge the cfb or ofb mode is  1bit or 8bit */    if ((((ctrlbyte & 0x0C) == DES_MODE_CFB) || ((ctrlbyte & 0x0C) == DES_MODE_OFB))  &&           (((ctrlbyte & 0x30) == DES_SHIFT_BIT8) || ((ctrlbyte & 0x30) == DES_SHIFT_BIT1)))    {       WRITE_REGISTER_ULONG(ECS_DES_DIN2,(*(ptmpm +1))&0xFF000000);       #ifdef DEBUG           READ_REGISTER_ULONG(ECS_DES_DIN2,stavalue);            printf("pplaintext2:%x\n",stavalue);       #endif    }    else    {        WRITE_REGISTER_ULONG(ECS_DES_DIN1,*ptmpm ++);        WRITE_REGISTER_ULONG(ECS_DES_DIN2,*ptmpm );        #ifdef DEBUG            READ_REGISTER_ULONG(ECS_DES_DIN2,stavalue);             printf("pplaintext2:%x\n",stavalue);            READ_REGISTER_ULONG(ECS_DES_DIN1,stavalue);             printf("pplaintext1:%x\n",stavalue);        #endif    }    /*set control word*/    WRITE_REGISTER_ULONG(ECS_DES_CTRL,ctrlbyte);    #ifdef DEBUG        READ_REGISTER_ULONG(ECS_DES_CTRL,stavalue);         printf("ECS_DES_CTRL:%x\n",stavalue);        printf("ctrlbyte:%x\n",ctrlbyte);    #endif    return 0;}static  int des_run (void){    unsigned int stavalue,k;    READ_REGISTER_ULONG(ECS_DES_BUSY,stavalue);    for(k=0;(k<100000)&&(stavalue==1);k++)    {       READ_REGISTER_ULONG(ECS_DES_BUSY,stavalue);    }    if (k>=100000)    {        printf(" there is something wrong with the module!");        return DES_BUSY_ERR;    }    WRITE_REGISTER_ULONG(ECS_DES_START,DES_START);    return 0;}static  int des_get_riv (unsigned char *prouttmp, unsigned char *pivouttmp, unsigned int ctrlbyte){    unsigned int   stavalue,k;    unsigned int * prout=(unsigned int *)prouttmp;    unsigned int * pivout=(unsigned int*)pivouttmp;    if(NULL==prout)    {        printf("the pointer in des_get_riv  is null!");        return -1;    }    if(NULL==pivout)    {        printf("the pointer in des_get_riv  is null!");        return -1;    }    READ_REGISTER_ULONG(ECS_DES_BUSY,stavalue);    for(k=0;(k<100000)&&(stavalue==1);k++)    {       READ_REGISTER_ULONG(ECS_DES_BUSY,stavalue);    }    if (k>=100000)    {        printf(" there is something wrong with the module!");        return DES_BUSY_ERR;    }    /*get rout*/    READ_REGISTER_ULONG(ECS_DES_DOUT1,*prout);    prout += 1;    READ_REGISTER_ULONG(ECS_DES_DOUT2,*prout);    /*get iv*/    READ_REGISTER_ULONG(ECS_DES_IVOUT1,*pivout);    #ifdef DEBUG        printf("DOUT2:%x\n",*prout);        printf("DOUT1:%x\n",*(prout-1));    #endif    pivout += 1;    READ_REGISTER_ULONG(ECS_DES_IVOUT2,*pivout);    /*clear interrupt*/    READ_REGISTER_ULONG(ECS_DES_INT,stavalue);    return 0;}static int des_ctrl(unsigned int cmd,unsigned char *argp){        unsigned int step,ctlbyte;                step = cmd&0xFF000000;        ctlbyte = cmd&0x000000FF;        switch(step)        {                case DES_SET_KEY:                {                                                if(des_config_key ((((struct keys *)argp)->keys1), (((struct keys *)argp)->keys2),                                        (((struct keys *)argp)->keys3), ctlbyte) != 0)                        {                            printf("set des key error.\n");                            return -1;                        }                                                return 0;                }                case DES_SET_IV:                {                                               if(des_config_iv(argp, ctlbyte) != 0)                        {                            printf("set des iv error.\n");                            return -1;                        }                        return 0;                }                case DES_SET_M:                {                    #ifdef DEBUG                         printf("control_byte in des_ctrl:%x\n",ctlbyte);                    #endif                    if(des_config_m(argp,ctlbyte) != 0)                    {                        printf("set des plaintext error.\n");                        return -1;                    }                        return 0;               }               case DES_SET_START:               {                        if(des_run() != 0)                        {                            printf("des run error.\n");                            return -1;                        }                        return 0;               }              case DES_GET_DATA:              {                     if(des_get_riv( argp,(argp+8), ctlbyte) != 0)                     {                          return -1;                     }                     return 0;             }            default:            {                   return -EINVAL;            }        }        return 0;}int hi_des_config(struct des_encrypt_ctrl *pctrl){    if(NULL==pctrl)    {        printf("the pointer in hi_des_config is null!");        return -1;    }     control_byte = 0;     if((pctrl->des_endian > 1) || (pctrl->des_type > 3) || (pctrl->des_alg > 1))    {        printf("des or 3des config set error.\n");        return -1;    }    control_byte |= (pctrl->des_endian << 6) | (pctrl->des_type << 2) | pctrl->des_alg;    if((pctrl->des_type == 2)||(pctrl->des_type == 3))    {        if(pctrl->des_shift > 3)        {            printf("des or 3des shift bit error.\n");            return -1;        }        control_byte |= pctrl->des_shift << 4;    }    #ifdef DEBUG         printf("control_byte in config:%d%d%d%d\n",pctrl->des_endian,pctrl->des_type,pctrl->des_alg,pctrl->des_shift);         printf("control_byte :%d:\n",control_byte);    #endif    des_iv =pctrl->iv;    return 0;}int hi_des_crypt(unsigned char  * src,unsigned char  * dest,unsigned int byte_length,struct keys *pcipher){    #ifdef PERFOR_TEST        getbegintime();    #endif    if((byte_length % 8) != 0)    {        printf("des or 3des crypt data length is error.\n");        return -1;    }    //set the flag to crypt but not decrypt    control_byte &= 0xfd;       reverse_array(pcipher->keys1);     if( (control_byte & 0x01)==DES_ALGO_3DES )    {              reverse_array(pcipher->keys2);        reverse_array(pcipher->keys3);    }    reverse_array( des_iv);    if(des_alg_operate(src,dest,byte_length,pcipher) != 0)    {        printf("des or 3des crypt failture.\n");        return -1;    }     reverse_array(pcipher->keys1);    if( (control_byte & 0x01)==DES_ALGO_3DES )    {        reverse_array(pcipher->keys2);        reverse_array(pcipher->keys3);    }    reverse_array(des_iv);    #ifdef PERFOR_TEST         getendtime();         calc_speed(byte_length);    #endif    return 0;}int hi_des_decrypt(unsigned char * src,unsigned char  * dest,unsigned int byte_length,struct keys *pcipher){    #ifdef PERFOR_TEST        getbegintime();    #endif    if(NULL==src)    {        printf("the pointer in hi_des_decrypt is null!");        return -1;    }    if(NULL==dest)    {        printf("the pointer in hi_des_decrypt is null!");        return -1;    }    if(NULL==pcipher)    {        printf("the pointer in hi_des_decrypt is null!");        return -1;    }       if((byte_length % 8) != 0)    {        printf("des or 3des decrypt data length is error.\n");        return -1;    }    control_byte |= 0x02;    reverse_array(pcipher->keys1);    if( (control_byte & 0x01)==DES_ALGO_3DES )    {                reverse_array(pcipher->keys2);        reverse_array(pcipher->keys3);    }    reverse_array( des_iv);    if(des_alg_operate(src,dest,byte_length,pcipher) != 0)    {        printf("des or 3des decrypt failture.\n");        return -1;            }        reverse_array(pcipher->keys1);    if( (control_byte & 0x01)==DES_ALGO_3DES )    {        reverse_array(pcipher->keys2);        reverse_array(pcipher->keys3);    }    reverse_array( des_iv);    #ifdef PERFOR_TEST         getendtime();         calc_speed(byte_length);    #endif    return 0;}static int des_alg_operate(unsigned char * pplaintext,unsigned char * pouttext,unsigned long plaintext_length,struct keys *pcipher){    int cltword,mode,shift;    unsigned char   temp_plain_1[8];    unsigned char   temp_plain_8[8];    unsigned char*  temp_iv;    struct outtrans temp_out;    unsigned char out[8],rout[8];    int i=0,j=0,k=0;    if(NULL==pplaintext)    {        printf("the pointer in des_alg_operate is null!");        return -1;    }    if(NULL==pouttext)    {        printf("the pointer in des_alg_operate  is null!");        return -1;    }    if(NULL==pcipher)    {        printf("the pointer in des_alg_operate is null!");        return -1;    }    cltword = control_byte;   #ifdef DEBUG      printf("control_byte in alg:%x\n",cltword);   #endif    mode = cltword & 0xc;    shift = cltword & 0x30;	    switch(mode)    {		/*0 2 for des; 1 3 for 3des*/	case DES_MODE_ECB: 	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -