319 lines
7.7 KiB
C
319 lines
7.7 KiB
C
|
#include "Uwater_Aes_128.h"
|
|||
|
#include "UWater_DataTools_App.h"
|
|||
|
#include "type.h"
|
|||
|
|
|||
|
|
|||
|
u16 HexToBcd16(u16 value)
|
|||
|
{
|
|||
|
u16 rtval, temp;
|
|||
|
u8 i;
|
|||
|
rtval = 0;
|
|||
|
i = 0;
|
|||
|
while (value)
|
|||
|
{
|
|||
|
temp = value % 10;
|
|||
|
rtval |= (temp << i);
|
|||
|
i += 4;
|
|||
|
value /= 10;
|
|||
|
}
|
|||
|
return rtval;
|
|||
|
}
|
|||
|
|
|||
|
u8 BCD2HEX(u8 bcd_data) //BCDתΪHEX<45>ӳ<EFBFBD><D3B3><EFBFBD>
|
|||
|
{
|
|||
|
unsigned char temp;
|
|||
|
temp = ((bcd_data>>4) * 10 + (bcd_data & 0x0F));//2020-10-31
|
|||
|
return temp;
|
|||
|
}
|
|||
|
|
|||
|
u8 HEX2BCD(u8 hex_data) //HEXתΪBCD<43>ӳ<EFBFBD><D3B3><EFBFBD>
|
|||
|
{
|
|||
|
unsigned char temp;
|
|||
|
temp = (hex_data / 10 * 16 + (hex_data % 10));//2020-10-31
|
|||
|
return temp;
|
|||
|
}
|
|||
|
|
|||
|
u32 HexToBcd32(u32 value)
|
|||
|
{
|
|||
|
u32 rtval, temp;
|
|||
|
u8 i;
|
|||
|
rtval = 0;
|
|||
|
i = 0;
|
|||
|
while (value)
|
|||
|
{
|
|||
|
temp = value % 10;
|
|||
|
rtval |= (temp << i);
|
|||
|
i += 4;
|
|||
|
value /= 10;
|
|||
|
}
|
|||
|
return rtval;
|
|||
|
}
|
|||
|
|
|||
|
u32 Gp30DataToBcd(u32 data, u32 times)
|
|||
|
{
|
|||
|
float tempf;
|
|||
|
u32 temp32;
|
|||
|
tempf = ((float) data / 65536);
|
|||
|
temp32 = (u32) (tempf * times);
|
|||
|
return (HexToBcd32(temp32));
|
|||
|
}
|
|||
|
|
|||
|
u16 FramHexToBcd16(u16 value)
|
|||
|
{
|
|||
|
u16 rtval, temp;
|
|||
|
u8 i;
|
|||
|
rtval = 0;
|
|||
|
i = 0;
|
|||
|
while (value)
|
|||
|
{
|
|||
|
temp = value % 10;
|
|||
|
rtval |= (temp << i);
|
|||
|
i += 4;
|
|||
|
value /= 10;
|
|||
|
}
|
|||
|
return rtval;
|
|||
|
}
|
|||
|
|
|||
|
void fram_tools_writeU32ByBuf(u8 *pU32Buf, u8 *pSrc, u8 dir)
|
|||
|
{
|
|||
|
int temp_i=0;
|
|||
|
if(dir == 0)//data0-1-2-3
|
|||
|
{
|
|||
|
for(temp_i=0;temp_i<4;temp_i++)
|
|||
|
{
|
|||
|
pU32Buf[temp_i] = *pSrc++;
|
|||
|
}
|
|||
|
}
|
|||
|
else//data3-2-1-0
|
|||
|
{
|
|||
|
for(temp_i=0;temp_i<4;temp_i++)
|
|||
|
{
|
|||
|
pU32Buf[3-temp_i] = *pSrc++;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
/*******************************************************************************
|
|||
|
* @fun_name: check_apply_addr
|
|||
|
* @brief : ͨѶ<EFBFBD><EFBFBD>ַ<EFBFBD>ж<EFBFBD>
|
|||
|
* @param[in] : None
|
|||
|
* @param[out]: None
|
|||
|
* @retval : None
|
|||
|
* @other :
|
|||
|
******************************************************************************/
|
|||
|
u8 check_apply_addr(u8 *p_buf,u8 *des_buf)
|
|||
|
{
|
|||
|
u8 tmp_i = 0;
|
|||
|
for (tmp_i = 0; tmp_i < 7; tmp_i++)
|
|||
|
{
|
|||
|
if (*(p_buf + tmp_i) != *(des_buf + tmp_i))//s_met_info.met_addr[tmp_i])
|
|||
|
{
|
|||
|
return ERROR;
|
|||
|
}
|
|||
|
}
|
|||
|
return SUCCESS;
|
|||
|
}
|
|||
|
/*******************************************************************************
|
|||
|
* @fun_name: check_cs
|
|||
|
* @brief : csУ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param[in] : *p;len
|
|||
|
* @param[out]: None
|
|||
|
* @retval : None
|
|||
|
* @other :
|
|||
|
******************************************************************************/
|
|||
|
u8 check_cs(u8* start_sddr, u8 datas_len)
|
|||
|
{
|
|||
|
u8 tmp_i = 0;
|
|||
|
u8 tmp_cs = 0;
|
|||
|
for (tmp_i = 0; tmp_i < datas_len; tmp_i++)
|
|||
|
{
|
|||
|
tmp_cs += *(start_sddr + tmp_i);
|
|||
|
}
|
|||
|
return tmp_cs;
|
|||
|
}
|
|||
|
/*******************************************************************************
|
|||
|
* @fun_name: AES_decrypt
|
|||
|
* @brief :
|
|||
|
* @param[in] :
|
|||
|
* @param[out]: None
|
|||
|
* @retval : None
|
|||
|
* @other :
|
|||
|
******************************************************************************/
|
|||
|
void AES_decrypt(u8 *buf, u8 len, u8 *key)
|
|||
|
{
|
|||
|
u8 p;
|
|||
|
u8 key1[16];
|
|||
|
u8 k,l;
|
|||
|
u8 start_data_length; //<2F>֮ǰԭ<C7B0><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD>
|
|||
|
u8 recdata_length; //<2F>֮<EEB2B9><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5>ֽڳ<D6BD><DAB3><EFBFBD>
|
|||
|
start_data_length=len;
|
|||
|
//recdata_length=(start_data_length/16+1)*16;
|
|||
|
|
|||
|
recdata_length=start_data_length/16;
|
|||
|
for(k=0;k<recdata_length;k++)
|
|||
|
{
|
|||
|
u8 state[16];
|
|||
|
for(l=0;l<16;l++)
|
|||
|
state[l]=buf[k*16 + l];
|
|||
|
for(p=0;p<16;p++)
|
|||
|
{
|
|||
|
key1[p] = key[p];
|
|||
|
}
|
|||
|
aes_enc_dec(state,key1,1); //<2F><><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
|
|||
|
for(l=0;l<16;l++)
|
|||
|
{
|
|||
|
buf[k*16 + l] =state[l];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void SYNB_AES_decrypt(u8 *buf, u16 len, u8 *key)
|
|||
|
{
|
|||
|
u8 p;
|
|||
|
u8 key1[16];
|
|||
|
u16 k,l;
|
|||
|
u16 start_data_length; //<2F>֮ǰԭ<C7B0><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD>
|
|||
|
u16 recdata_length; //<2F>֮<EEB2B9><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5>ֽڳ<D6BD><DAB3><EFBFBD>
|
|||
|
start_data_length=len;//s_frame_rcv_arr[s_frame_struct.head_site +11];
|
|||
|
recdata_length=(start_data_length/16+1)*16;
|
|||
|
for(k=0;k<(recdata_length/16);k++)
|
|||
|
{
|
|||
|
u8 state[16];
|
|||
|
for(l=0;l<16;l++)
|
|||
|
state[l]=buf[k*16 + l];//s_frame_rcv_arr[k*16+s_frame_struct.head_site +12 + l];
|
|||
|
for(p=0;p<16;p++)
|
|||
|
{
|
|||
|
key1[p] = key[p];
|
|||
|
}
|
|||
|
aes_enc_dec(state,key1,1); //<2F><><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
|
|||
|
for(l=0;l<16;l++)
|
|||
|
{
|
|||
|
buf[k*16 + l] =state[l];//s_frame_rcv_arr[k*16+s_frame_struct.head_site +12 + l] =state[l];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
/*******************************************************************************
|
|||
|
* @fun_name: AES_encrypt
|
|||
|
* @brief :
|
|||
|
* @param[in] : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param[out]: None
|
|||
|
* @retval : None
|
|||
|
* @other :
|
|||
|
******************************************************************************/
|
|||
|
void AES_encrypt(u8 num,u8 *buf, u16 len, u8 *key)
|
|||
|
{
|
|||
|
u8 key2[16];
|
|||
|
u16 start_data_length; //<2F>֮ǰԭ<C7B0><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD>
|
|||
|
u8 adddata_length; //<2F><EFBFBD><EEB2B9><EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD>
|
|||
|
u16 sentdata_length; //<2F>֮<EEB2B9><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5>ֽڳ<D6BD><DAB3><EFBFBD>
|
|||
|
u8 add_data; //<2F><EFBFBD><EEB2B9><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ȡ16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
switch(num)
|
|||
|
{
|
|||
|
case 0:
|
|||
|
{
|
|||
|
start_data_length=len;
|
|||
|
sentdata_length=(start_data_length/16+1)*16;
|
|||
|
adddata_length=sentdata_length-start_data_length;
|
|||
|
add_data=adddata_length;
|
|||
|
u8 j;
|
|||
|
for(j=start_data_length;j<sentdata_length;j++) //<2F><><EFBFBD>䷢<EFBFBD><E4B7A2><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
buf[j]=add_data; //s_frame_send_buf[j+14]=add_data;
|
|||
|
}
|
|||
|
|
|||
|
u8 k,p;
|
|||
|
|
|||
|
for(k=0;k<(sentdata_length/16);k++)
|
|||
|
{
|
|||
|
u8 state[16];
|
|||
|
for(p=0;p<16;p++)
|
|||
|
state[p]=buf[k*16+p];
|
|||
|
for(p=0;p<16;p++)
|
|||
|
{
|
|||
|
key2[p] = key[p];
|
|||
|
}
|
|||
|
aes_enc_dec(state,key2,0);
|
|||
|
for(p=0;p<16;p++)
|
|||
|
buf[k*16+p]=state[p];//s_frame_send_buf[k*16+14+p]=state[p];
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
case 1:
|
|||
|
{
|
|||
|
start_data_length=len;
|
|||
|
sentdata_length=(start_data_length/16+1)*16;
|
|||
|
adddata_length=sentdata_length-start_data_length;
|
|||
|
|
|||
|
add_data=adddata_length;
|
|||
|
u16 j;
|
|||
|
for(j=start_data_length;j<sentdata_length;j++) //<2F><><EFBFBD>䷢<EFBFBD><E4B7A2><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
buf[j]=add_data;//s_frame_send_buf[j+15]=add_data;
|
|||
|
}
|
|||
|
u8 k,p;
|
|||
|
for(k=0;k<(sentdata_length/16);k++)
|
|||
|
{
|
|||
|
u8 state[16];
|
|||
|
for(p=0;p<16;p++)
|
|||
|
{
|
|||
|
state[p]=buf[k*16+p];//s_frame_send_buf[k*16+15+p];
|
|||
|
}
|
|||
|
for(p=0;p<16;p++)
|
|||
|
{
|
|||
|
key2[p] = key[p];
|
|||
|
}
|
|||
|
aes_enc_dec(state,key2,0);
|
|||
|
for(p=0;p<16;p++)
|
|||
|
{
|
|||
|
buf[k*16+p]=state[p];//s_frame_send_buf[k*16+15+p]=state[p];
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//CRC16<31><36><EFBFBD>㷽<EFBFBD><E3B7BD>1:ʹ<><CAB9>2<EFBFBD><32>256<35><36><EFBFBD>ȵ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
|
|||
|
static u16 wCRCTalbeAbs[] = {0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000,
|
|||
|
0x9C01, 0x8801, 0x4400};
|
|||
|
|
|||
|
u16 CRC16(u8* pchMsg, u16 wDataLen)
|
|||
|
{
|
|||
|
u16 wCRC = 0xFFFF;
|
|||
|
u16 i;
|
|||
|
u8 chChar;
|
|||
|
for(i = 0; i < wDataLen; i++)
|
|||
|
{
|
|||
|
chChar = *pchMsg++;
|
|||
|
wCRC = wCRCTalbeAbs[(chChar ^ wCRC) & 15] ^ (wCRC >> 4);
|
|||
|
wCRC = wCRCTalbeAbs[((chChar >> 4) ^ wCRC) & 15] ^ (wCRC >> 4);
|
|||
|
}
|
|||
|
return wCRC;
|
|||
|
}
|
|||
|
//ASCILתHEX
|
|||
|
//ASCII<49><49>תHEX<45><58>
|
|||
|
//ASCII<49><49>:0-9 --> HEX:0x0-0x9 --> Dec:0-9
|
|||
|
//ASCII<49><49>:a/A-f/F --> HEX:0xA-0xF --> Dec:10-15
|
|||
|
uint8_t AsciiToHex(uint8_t Ascii_Byte)
|
|||
|
{
|
|||
|
if(Ascii_Byte & 0x80)
|
|||
|
{
|
|||
|
return Ascii_Byte;
|
|||
|
}
|
|||
|
if((Ascii_Byte >= '0')&&(Ascii_Byte <= '9'))
|
|||
|
{
|
|||
|
return Ascii_Byte - '0'; //0-9
|
|||
|
}
|
|||
|
else if( (Ascii_Byte >= 'a')&&(Ascii_Byte <= 'f') )
|
|||
|
{
|
|||
|
return Ascii_Byte - 'a' + 10; //10-15
|
|||
|
}
|
|||
|
else if( (Ascii_Byte >= 'A')&&(Ascii_Byte <= 'F') )
|
|||
|
{
|
|||
|
return Ascii_Byte - 'A' + 10; //10-15
|
|||
|
}
|
|||
|
return Ascii_Byte;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|