R1UWaterRS485/app/wxqb100_encryption.c

306 lines
7.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/***********************************************************************************
* @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<plen;i++)
{
tmpp= *(start_address+i);
crc_rig_low ^= tmpp;
for(j=0;j<8;j++)
{
// crc_rig.wValue = crc_rig.wValue >> 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У<43><D0A3>CrcCalculate(*start_address,lenth)
//<2F><><EFBFBD><EFBFBD><EBA3BA>ʼ<EFBFBD><CABC>ַ<EFBFBD><D6B7>*_buffer,<2C><><EFBFBD><EFBFBD><EFBFBD>ֽڳ<D6BD><DAB3>ȣ<EFBFBD>_bufLen,
//---------------------------------------------------------------------
u8 CalCheck(char* _buffer,int _bufLen,int JMnum)
{
int i;
u8 CRC16=0xFF; //<2F><>ʼ<EFBFBD><CABC>CRC
CRC_LOW = 0XFF;
CRC_HIGH = 0XFF;
for(i = 0 ; i < _bufLen; i++)
{
Check_CRC(_buffer[i],JMnum);
}
return CRC_HIGH;
}
//---------------------------------------------------------------------
//CRCУ<43><D0A3>Check_CRC(input_byte)
//<2F><><EFBFBD><EFBFBD><EBA3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
//---------------------------------------------------------------------
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; //ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CRC<52>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0;i<8;i++)
{
high = CRC_HIGH;
low = CRC_LOW;
CRC_HIGH= CRC_HIGH >> 1; // <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>һλ
CRC_LOW = CRC_LOW >> 1; // <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>һλ
if(high&0x01) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>һλΪ1
CRC_LOW =CRC_LOW | 0x80; //<2F><><EFBFBD><EFBFBD>λ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ƺ<EFBFBD>ǰ<EFBFBD>油1
//<2F><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>0
if(low&0x01) //<2F><><EFBFBD><EFBFBD>LSBΪ1<CEAA><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
CRC_HIGH = CRC_HIGH ^ table[JMnum][0];//0xA0;//0x84;
CRC_LOW = CRC_LOW ^ table[JMnum][1];//0x01;//0x08;
}
}
}
*/
//---------------------------------------------------------------------
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EBA3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Կ
//---------------------------------------------------------------------
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;
}//
//---------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EBA3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Կ
//---------------------------------------------------------------------
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++;
}
}
/*
//---------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EBA3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Կ
//---------------------------------------------------------------------
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;
}
}
*/
//---------------------------------------------------------------------
//<2F><>Կֵ<D4BF>л<EFBFBD><D0BB><EFBFBD><E3B7A8>ȷ<EFBFBD><C8B7><EFBFBD>´<EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>NUMֵ
//<2F><><EFBFBD><EFBFBD><EBA3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Կ
//---------------------------------------------------------------------
u8 Num_Change(u8 Now_Num,u8 Num_Flag)
{
//u8 Tmp_Now_Num;
if(Num_Flag == 0xBB) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶΪBB<42><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾʹ<CABE>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD>5-9<><39><EFBFBD><EFBFBD>Կ
{
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) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶΪAA<41><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾʹ<CABE>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD>0-4<><34><EFBFBD><EFBFBD>Կ
{
Now_Num = Now_Num + 2;
if(Now_Num > 4)
{
Now_Num = Now_Num - 5;
}
}
else //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶΪ<CAB6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ΪAA<41><41><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Կ<EFBFBD><D4BF>Ϊ00
{
Num_Flag = 0xAA;
Now_Num = 0x00;
}
// Tmp_Now_Num = Now_Num;
return(Now_Num);
}
//---------------------------------------------------------------------
//<2F><>Կֵ<D4BF>л<EFBFBD><D0BB><EFBFBD><E3B7A8>ȷ<EFBFBD><C8B7><EFBFBD>´<EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>NUMֵ
//<2F><><EFBFBD><EFBFBD><EBA3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Կ
//---------------------------------------------------------------------
BOOL Num_Check(u8 Now_Num,u8 EE_Num)
{
if (Now_Num == EE_Num) //NUMֵ<4D><D6B5>ȷ<EFBFBD><C8B7>Ӧ<EFBFBD><D3A6>ok
{
return(SUCCESS);
}
else // (Now_Num != EE_Num) //NUMֵ<4D><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>ERROR
{
return(ERROR);
}
}
/*
//---------------------------------------------------------------------
//<2F><><EFBFBD>ù㲥<C3B9><E3B2A5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EBA3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B2A5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Կ
//---------------------------------------------------------------------
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