306 lines
7.8 KiB
C
306 lines
7.8 KiB
C
/***********************************************************************************
|
||
* @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
|