📄 des.c
字号:
/* Copyright (c) 2006, All rights reserved.*/#include "ht32a256.h"#include "des.h"#include "deftype.h"#include "pubdef.h"/**********************************************************************///Des模块复位//输入:空//输出:空/**********************************************************************/void Reset_Des(void){ outp_w(HTC_DES_CR,DES_CR_RST);}/**********************************************************************///等待DES处理结束//输入:空//输出:空/**********************************************************************/void Wait_Des_Int(){ while(!(inp_w(HTC_DES_STATE)&DES_STATE_OAF));}/**********************************************************************///DES 配置 //crypt DES_MODE_ED/**********************************************************************/void Des_Config(UINT8 *pbKey, UINT8 *pbIv,UINT8 bType, UINT8 bMode, UINT8 crypt){ switch(bType) //根据加密类型选择KEY { case TRIBLE_KEY: outp_w(HTC_DES_KEY3H ,byte_word(&pbKey[16])); outp_w(HTC_DES_KEY3L ,byte_word(&pbKey[20])); case DOUBLE_KEY: outp_w(HTC_DES_KEY2H ,byte_word(&pbKey[8])); outp_w(HTC_DES_KEY2L ,byte_word(&pbKey[12])); case SINGLE_KEY: outp_w(HTC_DES_KEY1H ,byte_word(&pbKey[0])); outp_w(HTC_DES_KEY1L ,byte_word(&pbKey[4])); break; default: return ; //非法类型 break; } outp_w(HTC_DES_IVH ,byte_word(&pbIv[0])); outp_w(HTC_DES_IVL ,byte_word(&pbIv[4])); if(crypt==DES_ENCRYPT) { outp_w(HTC_DES_MODE ,DES_MODE_ERRM|DES_MODE_UE|DES_MODE_ED|(bType<<2)|bMode); //DES 类型 加密 模式 } else { outp_w(HTC_DES_MODE ,DES_MODE_ERRM|DES_MODE_UE|(bType<<2)|bMode); //DES 类型 解密 模式 } }/**********************************************************************//**********************************************************************/void Des_Crypt(UINT8 *pbBuffer, UINT8 *pbOutput,UINT8 len){ UINT16 i; UINT32 stat; for(i=0;i<len;i=i+8) //8字节加密 { outp_w(HTC_DES_DATAINH ,byte_word(&pbBuffer[i])); outp_w(HTC_DES_DATAINL ,byte_word(&pbBuffer[i+4])); outp_w(HTC_DES_CR,inp_w(HTC_DES_CR)|DES_CR_IAF); //DES 启动 outp_w(HTC_DES_CR,0x03); //DES 启动 while(!(inp_w(HTC_DES_STATE)&DES_STATE_OAF)); stat=inp_w(HTC_DES_STATE); if((stat&DES_STATE_OAF)==DES_STATE_OAF) { word_byte(&pbOutput[i],inp_w(HTC_DES_DATAOUTH)); word_byte(&pbOutput[i+4],inp_w(HTC_DES_DATAOUTL)); } outp_w(HTC_DES_CR,DES_CR_ORF); }}/**********************************************************************///DES加密处理 //输入:pbKey加密KEY的数据,KEY1H,KEY1L,KEY2H,KEY2L,KEY3H,KEY3L// pbIV CBC模式的初始向量。 IVH,IVL // pbBuffer要加密的8字节数据,pbOutput 输出8字节的密文// len 加密数据长度// bType加密类型,SINGLE_KEY,DOUBLE_KEY,TRIBLE_KEY// bMode加密模式,MODE_ECB,MODE_NFRCBC,MODE_FRCBC// len 加密数据长度//输出: 处理状态 /**********************************************************************/UINT32 Des_A_Encrypt(UINT8 *pbKey,UINT8 *pbIv, UINT8 *pbBuffer, UINT8 *pbOutput,UINT8 bType, UINT8 bMode){ UINT32 tmp; UINT16 i; switch(bType) //根据加密类型选择KEY { case TRIBLE_KEY: outp_w(HTC_DES_KEY3H ,byte_word(&pbKey[16])); outp_w(HTC_DES_KEY3L ,byte_word(&pbKey[20])); case DOUBLE_KEY: outp_w(HTC_DES_KEY2H ,byte_word(&pbKey[8])); outp_w(HTC_DES_KEY2L ,byte_word(&pbKey[12])); case SINGLE_KEY: outp_w(HTC_DES_KEY1H ,byte_word(&pbKey[0])); outp_w(HTC_DES_KEY1L ,byte_word(&pbKey[4])); break; default: return ERROR; //非法类型 break; } outp_w(HTC_DES_IVH ,byte_word(&pbIv[0])); outp_w(HTC_DES_IVL ,byte_word(&pbIv[4])); outp_w(HTC_DES_DATAINH ,byte_word(&pbBuffer[0])); outp_w(HTC_DES_DATAINL ,byte_word(&pbBuffer[4])); outp_w(HTC_DES_MODE ,DES_MODE_ERRM|DES_MODE_UE|DES_MODE_ED|(bType<<2)|bMode); //DES 类型 加密 模式 outp_w(HTC_DES_CR,inp_w(HTC_DES_CR)|DES_CR_IAF); //DES 模式 Wait_Des_Int(); //等待//结果 if((inp_w(HTC_DES_STATE)&DES_STATE_OAF)==DES_STATE_OAF) { word_byte(&pbOutput[0],inp_w(HTC_DES_DATAOUTH)); word_byte(&pbOutput[4],inp_w(HTC_DES_DATAOUTL)); } outp_w(HTC_DES_CR,DES_CR_ORF); return OK; }/**********************************************************************///DES解密处理 //输入:pbKey加密KEY的数据,KEY1H,KEY1L,KEY2H,KEY2L,KEY3H,KEY3L// pbBuffer要解密的8字节数据,pbOutput 输出8字节的明文// len 解密数据长度// bType加密类型,SINGLE_KEY,DOUBLE_KEY,TRIBLE_KEY// bMode加密模式,MODE_ECB,MODE_NFRCBC,MODE_FRCBC//输出: 处理状态/**********************************************************************/UINT32 Des_A_Decrypt(UINT8 *pbKey,UINT8 *pbIv, UINT8 *pbBuffer, UINT8 *pbOutput, UINT8 bType, UINT8 bMode){ UINT32 tmp; UINT8 *tpbOutput; switch(bType) //根据加密类型选择KEY { case TRIBLE_KEY: outp_w(HTC_DES_KEY3H ,byte_word(&pbKey[16])); outp_w(HTC_DES_KEY3L ,byte_word(&pbKey[20])); case DOUBLE_KEY: outp_w(HTC_DES_KEY2H ,byte_word(&pbKey[8])); outp_w(HTC_DES_KEY2L ,byte_word(&pbKey[12])); case SINGLE_KEY: outp_w(HTC_DES_KEY1H ,byte_word(&pbKey[0])); outp_w(HTC_DES_KEY1L ,byte_word(&pbKey[4])); break; default: return ERROR; //非法类型 break; } //写输入数据 outp_w(HTC_DES_IVH ,byte_word(&pbIv[0])); outp_w(HTC_DES_IVL ,byte_word(&pbIv[4])); outp_w(HTC_DES_DATAINH ,byte_word(&pbBuffer[0])); outp_w(HTC_DES_DATAINL ,byte_word(&pbBuffer[4])); outp_w(HTC_DES_MODE ,DES_MODE_ERRM|DES_MODE_UE|(bType<<2)|bMode); //DES 类型 解密 模式 outp_w(HTC_DES_CR,inp_w(HTC_DES_CR)|DES_CR_IAF); //DES 模式 Wait_Des_Int(); //等待 //结果 if((inp_w(HTC_DES_STATE)&DES_STATE_OAF)==DES_STATE_OAF) { word_byte(&pbOutput[0],inp_w(HTC_DES_DATAOUTH)); word_byte(&pbOutput[4],inp_w(HTC_DES_DATAOUTL)); } outp_w(HTC_DES_CR,DES_CR_ORF); return OK; }void Des_Encrypt(UINT8 *pbKey,UINT8 *pbIv, UINT8 *pbBuffer, UINT8 *pbOutput,UINT8 len, UINT8 bType, UINT8 bMode){ UINT16 i; UINT8 j; if(bMode==MODE_CBC) //CBC 模式, 开始输入初始向量 { bMode=MODE_FRCBC; //第一次使用 } switch(bType) //根据加密类型选择KEY { case TRIBLE_KEY: outp_w(HTC_DES_KEY3H ,byte_word(&pbKey[16])); outp_w(HTC_DES_KEY3L ,byte_word(&pbKey[20])); case DOUBLE_KEY: outp_w(HTC_DES_KEY2H ,byte_word(&pbKey[8])); outp_w(HTC_DES_KEY2L ,byte_word(&pbKey[12])); case SINGLE_KEY: outp_w(HTC_DES_KEY1H ,byte_word(&pbKey[0])); outp_w(HTC_DES_KEY1L ,byte_word(&pbKey[4])); break; default: return ; //非法类型 break; } //写输入数据 outp_w(HTC_DES_IVH ,byte_word(&pbIv[0])); outp_w(HTC_DES_IVL ,byte_word(&pbIv[4])); for(i=0;i<len;i=i+8) //8字节加密 { outp_w(HTC_DES_DATAINH ,byte_word(&pbBuffer[i+0])); outp_w(HTC_DES_DATAINL ,byte_word(&pbBuffer[i+4])); outp_w(HTC_DES_MODE ,DES_MODE_ERRM|DES_MODE_UE|DES_MODE_ED|(bType<<2)|bMode); //DES 类型 加密 模式 outp_w(HTC_DES_CR,inp_w(HTC_DES_CR)|DES_CR_IAF); //DES 模式 Wait_Des_Int(); //等待 //结果 if((inp_w(HTC_DES_STATE)&DES_STATE_OAF)==DES_STATE_OAF) { word_byte(&pbOutput[i+0],inp_w(HTC_DES_DATAOUTH)); word_byte(&pbOutput[i+4],inp_w(HTC_DES_DATAOUTL)); } outp_w(HTC_DES_CR,DES_CR_ORF); if(bMode==MODE_FRCBC) { bMode=MODE_NFRCBC; } }}void Des_Decrypt(UINT8 *pbKey,UINT8 *pbIv, UINT8 *pbBuffer, UINT8 *pbOutput,UINT8 len, UINT8 bType, UINT8 bMode){ UINT16 i; UINT8 j; if(bMode==MODE_CBC) //CBC 模式, 开始输入初始向量 { bMode=MODE_FRCBC; //第一次使用 } switch(bType) //根据加密类型选择KEY { case TRIBLE_KEY: outp_w(HTC_DES_KEY3H ,byte_word(&pbKey[16])); outp_w(HTC_DES_KEY3L ,byte_word(&pbKey[20])); case DOUBLE_KEY: outp_w(HTC_DES_KEY2H ,byte_word(&pbKey[8])); outp_w(HTC_DES_KEY2L ,byte_word(&pbKey[12])); case SINGLE_KEY: outp_w(HTC_DES_KEY1H ,byte_word(&pbKey[0])); outp_w(HTC_DES_KEY1L ,byte_word(&pbKey[4])); break; default: return ; //非法类型 break; } //写输入数据 outp_w(HTC_DES_IVH ,byte_word(&pbIv[0])); outp_w(HTC_DES_IVL ,byte_word(&pbIv[4])); for(i=0;i<len;i=i+8) //8字节加密 { outp_w(HTC_DES_DATAINH ,byte_word(&pbBuffer[i+0])); outp_w(HTC_DES_DATAINL ,byte_word(&pbBuffer[i+4])); outp_w(HTC_DES_MODE ,DES_MODE_ERRM|DES_MODE_UE|(bType<<2)|bMode); //DES 类型 解密 模式 outp_w(HTC_DES_CR,inp_w(HTC_DES_CR)|DES_CR_IAF); //DES 模式 Wait_Des_Int(); //等待 //结果 if((inp_w(HTC_DES_STATE)&DES_STATE_OAF)==DES_STATE_OAF) { word_byte(&pbOutput[i+0],inp_w(HTC_DES_DATAOUTH)); word_byte(&pbOutput[i+4],inp_w(HTC_DES_DATAOUTL)); } outp_w(HTC_DES_CR,DES_CR_ORF); if(bMode==MODE_FRCBC) { bMode=MODE_NFRCBC; } }}/*//DES 中断消息UINT8 DesIntMsg;#pragma interrupt onvoid ISR_DES(void){ UINT32 stat; stat=inp_w(HTC_DES_STATE);//数据可输出 if(stat&DES_STATE_OAF==DES_STATE_OAF) { DesIntMsg|=DES_OK; }//校验检测错误 if(stat&DES_STATE_OAF==DES_STATE_ERR0) { DesIntMsg|=DES_ERR0; } //KNB 错误 if(stat&DES_STATE_OAF==DES_STATE_ERR1) { DesIntMsg|=DES_ERR1; } }*/#pragma interrupt off
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -