📄 hi_des_api.c
字号:
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 + -