/*********************************************************************************** * @Copyright (c) :(C)2012, Qindao ieslab Co., Ltd * @FileName :wxqb100_encryption.c * @Author :yhy * @Version :V1.0 * @Date :2012-12-24 * @Description :the function of the entity of encryption ************************************************************************************/ //#include "wxqb100_encryption.h" #include "UWater_encryption_driver.h" #ifdef _cplusplus extern "C" { #endif /*------------------------------- Variable Define -----------------------------------*/ const u8 table[10][7] = {{0x18,0x76,0x09,0x51,0x73,0x28,0x17}, {0x65,0x83,0x50,0x71,0x26,0x52,0x10}, {0x12,0x25,0x37,0x33,0x59,0x81,0x60}, {0x39,0x10,0x38,0x95,0x53,0x46,0x71}, {0x10,0x22,0x91,0x87,0x47,0x20,0x84}, {0x5A,0x7B,0xC4,0xE8,0xF0,0x67,0x9A}, {0xF0,0x3E,0x3A,0x61,0x8B,0x9F,0x77}, {0x10,0x1C,0x3E,0x6F,0xA7,0x83,0x29}, {0x91,0xF1,0xB4,0xFF,0x74,0xDD,0x87}, {0xA1,0xE6,0xF2,0x2A,0xB4,0xCC,0xA7}}; // u8 key_data[10]; // u8 CRC_HIGH = 0; // u8 CRC_LOW = 0; /******************************************************************************************************** *function: CRC SA * * * by qyh 2012-3-1 *********************************************************************************************************/ u8 SA_crc(u8 *start_address,u8 plen,u8 JMnum) { u8 crc_rig_low,crc_rig_high; u8 i,j,tmp_crc; u8 tmpp; u8 high,low; // crc_rig.wValue = 0xffff; crc_rig_high = 0xff; crc_rig_low = 0xff; for(i=0;i> 1; high = crc_rig_high; low = crc_rig_low; crc_rig_low = crc_rig_low>>1; crc_rig_high = crc_rig_high>>1; if(high&0x01) crc_rig_low |= 0x80; if(low & 0x01) { crc_rig_high ^= table[JMnum][0]; crc_rig_low ^= table[JMnum][1]; } } } tmp_crc = crc_rig_high; return tmp_crc; } /* //--------------------------------------------------------------------- //CRC校验CrcCalculate(*start_address,lenth) //输入:起始地址:*_buffer,检验字节长度:_bufLen, //--------------------------------------------------------------------- u8 CalCheck(char* _buffer,int _bufLen,int JMnum) { int i; u8 CRC16=0xFF; //初始化CRC CRC_LOW = 0XFF; CRC_HIGH = 0XFF; for(i = 0 ; i < _bufLen; i++) { Check_CRC(_buffer[i],JMnum); } return CRC_HIGH; } //--------------------------------------------------------------------- //CRC校验Check_CRC(input_byte) //输入:输入检验字节 //--------------------------------------------------------------------- void Check_CRC(u8 input_byte,int JMnum) { u8 high,low; int i; int MM[]={11,22,33,44,55,66,77}; CRC_LOW= CRC_LOW^input_byte; //每一个数据与CRC寄存器进行异或 for(i=0;i<8;i++) { high = CRC_HIGH; low = CRC_LOW; CRC_HIGH= CRC_HIGH >> 1; // 高位右移一位 CRC_LOW = CRC_LOW >> 1; // 低位右移一位 if(high&0x01) //如果高位字节最后一位为1 CRC_LOW =CRC_LOW | 0x80; //则低位字节右移后前面补1 //否则自动补0 if(low&0x01) //如果LSB为1,则与多项式码进行异或 { CRC_HIGH = CRC_HIGH ^ table[JMnum][0];//0xA0;//0x84; CRC_LOW = CRC_LOW ^ table[JMnum][1];//0x01;//0x08; } } } */ //--------------------------------------------------------------------- //调用备份密钥地址解密子程序 //输入:输入物理地址、密钥 //--------------------------------------------------------------------- void Bak_Address_Encrypt(u8 *p_buf,u8 key_num) { u8 Addr_Len,Key_Data; u8 *tmp_p_buf; tmp_p_buf = p_buf; for (Addr_Len=0;Addr_Len<7;Addr_Len++) { Key_Data = table[key_num][Addr_Len]; *p_buf ^= Key_Data; p_buf++; } *tmp_p_buf ^= 0xAC; tmp_p_buf++; *tmp_p_buf ^= 0xF1; tmp_p_buf++; *tmp_p_buf ^= 0x99; tmp_p_buf++; *tmp_p_buf ^= 0x68; tmp_p_buf++; *tmp_p_buf ^= 0x57; tmp_p_buf++; *tmp_p_buf ^= 0xEE; tmp_p_buf++; *tmp_p_buf ^= 0xCC; }// //--------------------------------------------------------------------- //调用物理地址解密子程序 //输入:输入物理地址、密钥 //--------------------------------------------------------------------- void Address_Encrypt(u8 *p_buf,u8 key_num) { u8 Addr_Len,Key_Data; for (Addr_Len=0;Addr_Len<7;Addr_Len++) { Key_Data = table[key_num][Addr_Len]; *p_buf ^= Key_Data; *p_buf ^= 0xAA; p_buf++; } } /* //--------------------------------------------------------------------- //调用物理地址解密子程序 //输入:输入物理地址、密钥 //--------------------------------------------------------------------- void Address_Encrypt(u8 *p_buf,u8 key_num) { u8 Addr_Len,Key_Data; u8 *tmp_p_buf; if (key_num < 5) { for (Addr_Len=0;Addr_Len<7;Addr_Len++) { Key_Data = table[key_num][Addr_Len]; *p_buf ^= Key_Data; *p_buf ^= 0xAA; p_buf++; } } else if(key_num < 0x0A) { tmp_p_buf = p_buf; for (Addr_Len=0;Addr_Len<7;Addr_Len++) { Key_Data = table[key_num][Addr_Len]; *p_buf ^= Key_Data; p_buf++; } *tmp_p_buf ^= 0xAC; tmp_p_buf++; *tmp_p_buf ^= 0xF1; tmp_p_buf++; *tmp_p_buf ^= 0x99; tmp_p_buf++; *tmp_p_buf ^= 0x68; tmp_p_buf++; *tmp_p_buf ^= 0x57; tmp_p_buf++; *tmp_p_buf ^= 0xEE; tmp_p_buf++; *tmp_p_buf ^= 0xCC; } } */ //--------------------------------------------------------------------- //密钥值切换算法,确定下次通讯的密钥组NUM值 //输入:输入物理地址、密钥 //--------------------------------------------------------------------- u8 Num_Change(u8 Now_Num,u8 Num_Flag) { //u8 Tmp_Now_Num; if(Num_Flag == 0xBB) //如果标识为BB,则表示使用备份密钥,从5-9组密钥 { if (Now_Num < 5) { Now_Num = 5; } else { Now_Num = Now_Num + 2; if(Now_Num > 9) { Now_Num = Now_Num - 5; } } } else if (Num_Flag == 0xAA) //如果标识为AA,则表示使用备份密钥,从0-4组密钥 { Now_Num = Now_Num + 2; if(Now_Num > 4) { Now_Num = Now_Num - 5; } } else //如果标识为非法,则初始化为AA,初始密钥组为00 { Num_Flag = 0xAA; Now_Num = 0x00; } // Tmp_Now_Num = Now_Num; return(Now_Num); } //--------------------------------------------------------------------- //密钥值切换算法,确定下次通讯的密钥组NUM值 //输入:输入物理地址、密钥 //--------------------------------------------------------------------- BOOL Num_Check(u8 Now_Num,u8 EE_Num) { if (Now_Num == EE_Num) //NUM值正确,应答ok { return(SUCCESS); } else // (Now_Num != EE_Num) //NUM值错误,应答ERROR { return(ERROR); } } /* //--------------------------------------------------------------------- //调用广播地址解密子程序 //输入:输入广播地址、密钥 //--------------------------------------------------------------------- void Broad_Address_Encrypt(u8 *p_buf,u8 key_num) { key_data[0] = MAC_ADDR0 ^ table[key_num][0]; key_data[1] = MAC_ADDR1 ^ table[key_num][1]; key_data[2] = MAC_ADDR2 ^ table[key_num][2]; key_data[3] = MAC_ADDR3 ^ table[key_num][3]; key_data[4] = MAC_ADDR4 ^ table[key_num][4]; key_data[5] = MAC_ADDR5 ^ table[key_num][5]; key_data[6] = MAC_ADDR5 ^ table[key_num][6]; } */ #ifdef _cplusplus } #endif