新增软件加密校验部分,协议添加读ID写密文,加密是否有效待验证
This commit is contained in:
parent
8dd40691af
commit
b3d26b0969
|
@ -0,0 +1,9 @@
|
|||
#ifndef _ENCRYPT_H_
|
||||
#define _ENCRYPT_H_
|
||||
#include "comm_types.h"
|
||||
#include "stm32l4xx_hal.h"
|
||||
#include "inflash.h"
|
||||
|
||||
uint8_t JudgeEncrypt();
|
||||
|
||||
#endif //_ENCRYPT_H_
|
|
@ -75,6 +75,14 @@ typedef enum
|
|||
FRT_REGISTER_MAX_WAVE_2 = 52, /* 换能器最大波形 */
|
||||
FRT_REGISTER_MAX_WAVE_3 = 53, /* 换能器最大波形 */
|
||||
FRT_REGISTER_MAX_WAVE_4 = 54, /* 换能器最大波形 */
|
||||
FRT_REGISTER_ID_1 = 55, /* ID16 */
|
||||
FRT_REGISTER_ID_2 = 56, /* ID32 */
|
||||
FRT_REGISTER_ID_3 = 57, /* ID48 */
|
||||
FRT_REGISTER_ID_4 = 58, /* ID64 */
|
||||
FRT_REGISTER_ENCRYPT_1 = 59, /* ÃÜÎÄ16 */
|
||||
FRT_REGISTER_ENCRYPT_2 = 60, /* ÃÜÎÄ32 */
|
||||
FRT_REGISTER_ENCRYPT_3 = 61, /* ÃÜÎÄ48 */
|
||||
FRT_REGISTER_ENCRYPT_4 = 62, /* ÃÜÎÄ64 */
|
||||
}FRT_MsgRegister;
|
||||
|
||||
#pragma pack(push,1)
|
||||
|
|
|
@ -37,6 +37,7 @@ typedef struct _usr_config_info{
|
|||
//出厂配置参数
|
||||
typedef struct _factory_config_info{
|
||||
u_int8_t flag_head;
|
||||
u_int32_t encrypt_0; /* 前32位密文 */
|
||||
u_int16_t transducer_cfg_1R5; /* 换能器参数 */
|
||||
u_int16_t transducer_cfg_4R5; /* 换能器参数 */
|
||||
u_int16_t transducer_cfg_8R0; /* 换能器参数 */
|
||||
|
@ -55,6 +56,7 @@ typedef struct _factory_config_info{
|
|||
u_int16_t linear_point_5_x; /* 线性插值点5X */
|
||||
u_int16_t linear_point_5_y; /* 线性插值点5Y */
|
||||
u_int16_t linear_enable; /* 线性插值使能 */
|
||||
u_int32_t encrypt_1; /* 后32位密文 */
|
||||
u_int8_t flag_end;
|
||||
}factory_config_info;
|
||||
#pragma pack(pop)
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
#include "encrypt.h"
|
||||
|
||||
/* TEA加密算法的加密过程 */
|
||||
void tea_encrypt(uint32_t *en, uint32_t *k)
|
||||
{
|
||||
uint32_t v[2];
|
||||
v[0] = *(uint32_t*)(0x1FFF7590);
|
||||
v[1] = *(uint32_t*)(0x1FFF7590 + 4);
|
||||
uint32_t v0 = v[0], v1 = v[1], sum = 0, i; // 初始化v0, v1, sum
|
||||
uint32_t delta = 0x9e3779b9; // 初始化delta
|
||||
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; // 初始化密钥k
|
||||
for (i = 0; i < 32; i++) { // 执行32轮加密
|
||||
sum += delta;
|
||||
v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
|
||||
v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
|
||||
}
|
||||
en[0] = v0; // 返回加密结果
|
||||
en[1] = v1;
|
||||
|
||||
// term_printf("%x %x", v[0], v[1]);
|
||||
}
|
||||
|
||||
/* TEA加密算法的解密过程 */
|
||||
void tea_decrypt(uint32_t *v, uint32_t *k)
|
||||
{
|
||||
uint32_t delta = 0x9e3779b9; // 初始化delta
|
||||
// uint32_t v0 = 0x93ae5ba8, v1 = 0xc5ba4e82, sum = delta << 5, i; // 初始化v0, v1, sum
|
||||
uint32_t v0 = g_stConfigInfo.encrypt_0, v1 = g_stConfigInfo.encrypt_1, sum = delta << 5, i; // 初始化v0, v1, sum
|
||||
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; // 初始化密钥k
|
||||
for(i = 0; i < 32; i++) { // 执行32轮解密
|
||||
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
|
||||
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
|
||||
sum -= delta;
|
||||
}
|
||||
v[0] = v0; // 返回解密结果
|
||||
v[1] = v1;
|
||||
|
||||
// term_printf("%x %x", v[0], v[1]);
|
||||
}
|
||||
|
||||
/*
|
||||
* 判断密文是否正确
|
||||
*
|
||||
*/
|
||||
uint8_t JudgeEncrypt()
|
||||
{
|
||||
uint32_t encryptCode[2] = {0};
|
||||
uint32_t key[] = {0x509770ff, 0x29c6b369, 0x4da2c125, 0x7d729015}; //密钥可能要打散位置,不在这里定死
|
||||
tea_decrypt(encryptCode, key);
|
||||
return ((*(uint32_t*)(0x1FFF7590)) == encryptCode[0] && (*(uint32_t*)(0x1FFF7590 + 4)) == encryptCode[1]);
|
||||
}
|
|
@ -71,6 +71,11 @@ static u_int16_t FRT_ReadReg_MaxWave_1(void *pMsg);
|
|||
static u_int16_t FRT_ReadReg_MaxWave_2(void *pMsg);
|
||||
static u_int16_t FRT_ReadReg_MaxWave_3(void *pMsg);
|
||||
static u_int16_t FRT_ReadReg_MaxWave_4(void *pMsg);
|
||||
/* 读ID */
|
||||
static u_int16_t FRT_ReadReg_ID_1(void *pMsg);
|
||||
static u_int16_t FRT_ReadReg_ID_2(void *pMsg);
|
||||
static u_int16_t FRT_ReadReg_ID_3(void *pMsg);
|
||||
static u_int16_t FRT_ReadReg_ID_4(void *pMsg);
|
||||
/* 写配置 */
|
||||
static u_int16_t FRT_WriteRegTransducerCFG1R5(void *pMsg);
|
||||
static u_int16_t FRT_WriteRegTransducerCFG4R5(void *pMsg);
|
||||
|
@ -86,6 +91,12 @@ static u_int16_t FRT_WriteRegPoint_4Y(void *pMsg);
|
|||
static u_int16_t FRT_WriteRegPoint_5Y(void *pMsg);
|
||||
static u_int16_t FRT_WriteRegLinearEnable(void *pMsg);
|
||||
|
||||
/* 写密文 */
|
||||
static u_int16_t FRT_WriteRegEncrypt1(void *pMsg);
|
||||
static u_int16_t FRT_WriteRegEncrypt2(void *pMsg);
|
||||
static u_int16_t FRT_WriteRegEncrypt3(void *pMsg);
|
||||
static u_int16_t FRT_WriteRegEncrypt4(void *pMsg);
|
||||
|
||||
static void pdebug_mcs_info();
|
||||
|
||||
/* 功能码处理表 */
|
||||
|
@ -145,6 +156,10 @@ FRT_RegProcTable_s g_RegTbl[] =
|
|||
{ FRT_REGISTER_MAX_WAVE_2, FRT_ReadReg_MaxWave_2 }, /* 波形最大幅值 */
|
||||
{ FRT_REGISTER_MAX_WAVE_3, FRT_ReadReg_MaxWave_3 }, /* 波形最大幅值 */
|
||||
{ FRT_REGISTER_MAX_WAVE_4, FRT_ReadReg_MaxWave_4 }, /* 波形最大幅值 */
|
||||
{ FRT_REGISTER_ID_1, FRT_ReadReg_ID_1 }, /* ID */
|
||||
{ FRT_REGISTER_ID_2, FRT_ReadReg_ID_2 }, /* ID */
|
||||
{ FRT_REGISTER_ID_3, FRT_ReadReg_ID_3 }, /* ID */
|
||||
{ FRT_REGISTER_ID_4, FRT_ReadReg_ID_4 }, /* ID */
|
||||
};
|
||||
|
||||
/* 写寄存器处理表 */
|
||||
|
@ -169,6 +184,10 @@ FRT_RegProcTable_s g_Write_RegTbl[] =
|
|||
{ FRT_REGISTER_LINEAR_POINT_Y_4, FRT_WriteRegPoint_4Y }, /* 线性插值校准点4 */
|
||||
{ FRT_REGISTER_LINEAR_POINT_Y_5, FRT_WriteRegPoint_5Y }, /* 线性插值校准点5 */
|
||||
{ FRT_REGISTER_LINEAR_ENABLE, FRT_WriteRegLinearEnable }, /* 线性插值使能 */
|
||||
{ FRT_REGISTER_ENCRYPT_1, FRT_WriteRegEncrypt1 }, /* 密文1 */
|
||||
{ FRT_REGISTER_ENCRYPT_2, FRT_WriteRegEncrypt2 }, /* 密文2 */
|
||||
{ FRT_REGISTER_ENCRYPT_3, FRT_WriteRegEncrypt3 }, /* 密文3 */
|
||||
{ FRT_REGISTER_ENCRYPT_4, FRT_WriteRegEncrypt4 }, /* 密文4 */
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -864,6 +883,50 @@ static u_int16_t FRT_ReadReg_MaxWave_4(void *pMsg)
|
|||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ID16
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
static u_int16_t FRT_ReadReg_ID_1(void *pMsg)
|
||||
{
|
||||
u_int16_t value = ((*(uint32_t*)(0x1FFF7590)) >> 16) & 0x0000FFFF;
|
||||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ID32
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
static u_int16_t FRT_ReadReg_ID_2(void *pMsg)
|
||||
{
|
||||
u_int16_t value = (*(uint32_t*)(0x1FFF7590)) & 0x0000FFFF;
|
||||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ID48
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
static u_int16_t FRT_ReadReg_ID_3(void *pMsg)
|
||||
{
|
||||
u_int16_t value = ((*(uint32_t*)(0x1FFF7590 + 4)) >> 16) & 0x0000FFFF;
|
||||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ID64
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
static u_int16_t FRT_ReadReg_ID_4(void *pMsg)
|
||||
{
|
||||
u_int16_t value = (*(uint32_t*)(0x1FFF7590 + 4)) & 0x0000FFFF;
|
||||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 写换能器参数寄存器值1R5
|
||||
* @param
|
||||
|
@ -1092,6 +1155,70 @@ static u_int16_t FRT_WriteRegLinearEnable(void *pMsg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 写左1-16位
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
static u_int16_t FRT_WriteRegEncrypt1(void *pMsg)
|
||||
{
|
||||
uint16_t *pMsgData = (uint16_t *)pMsg;
|
||||
uint16_t data = *pMsgData;
|
||||
|
||||
g_stConfigInfo.encrypt_0 = (g_stConfigInfo.encrypt_0 & 0x0000FFFF) | ((data << 16) & 0xFFFF0000);
|
||||
save_factory_config_info(g_stConfigInfo);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 写左17-32位
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
static u_int16_t FRT_WriteRegEncrypt2(void *pMsg)
|
||||
{
|
||||
uint16_t *pMsgData = (uint16_t *)pMsg;
|
||||
uint16_t data = *pMsgData;
|
||||
|
||||
g_stConfigInfo.encrypt_0 = (g_stConfigInfo.encrypt_0 & 0xFFFF0000) | (data & 0x0000FFFF);
|
||||
save_factory_config_info(g_stConfigInfo);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 写左33-47位
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
static u_int16_t FRT_WriteRegEncrypt3(void *pMsg)
|
||||
{
|
||||
uint16_t *pMsgData = (uint16_t *)pMsg;
|
||||
uint16_t data = *pMsgData;
|
||||
|
||||
g_stConfigInfo.encrypt_1 = (g_stConfigInfo.encrypt_1 & 0x0000FFFF) | ((data << 16) & 0xFFFF0000);
|
||||
save_factory_config_info(g_stConfigInfo);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 写左48-64位
|
||||
* @param
|
||||
* @retval
|
||||
*/
|
||||
static u_int16_t FRT_WriteRegEncrypt4(void *pMsg)
|
||||
{
|
||||
uint16_t *pMsgData = (uint16_t *)pMsg;
|
||||
uint16_t data = *pMsgData;
|
||||
|
||||
g_stConfigInfo.encrypt_1 = (g_stConfigInfo.encrypt_1 & 0xFFFF0000) | (data & 0x0000FFFF);
|
||||
save_factory_config_info(g_stConfigInfo);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 封装协议发送
|
||||
|
||||
|
@ -1173,7 +1300,7 @@ void FRT_MsgProc_ReadRegister(device_handle device, void *pMsg)
|
|||
start_reg_addr < 0x00 ||\
|
||||
(start_reg_addr > FRT_REGISTER_PRESSURE && start_reg_addr < FRT_REGISTER_DEVICE_ADDR) ||\
|
||||
(start_reg_addr > FRT_REGISTER_TEMPHUM_UPDATE_TIME && start_reg_addr < FRT_REGISTER_TRANSDUCER_CFG_1R5) ||\
|
||||
start_reg_addr > FRT_REGISTER_MAX_WAVE_4 \
|
||||
start_reg_addr > FRT_REGISTER_ID_4 \
|
||||
)
|
||||
|
||||
{
|
||||
|
@ -1185,7 +1312,7 @@ void FRT_MsgProc_ReadRegister(device_handle device, void *pMsg)
|
|||
reg_num < 0x01 ||\
|
||||
(((reg_num + start_reg_addr - 1) > FRT_REGISTER_PRESSURE) && ((reg_num + start_reg_addr - 1) < FRT_REGISTER_DEVICE_ADDR)) ||\
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_TEMPHUM_UPDATE_TIME) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_TRANSDUCER_CFG_1R5)) ||\
|
||||
((reg_num + start_reg_addr -1) > FRT_REGISTER_MAX_WAVE_4) \
|
||||
((reg_num + start_reg_addr -1) > FRT_REGISTER_ID_4) \
|
||||
)
|
||||
|
||||
{
|
||||
|
@ -1237,8 +1364,9 @@ void FRT_MsgProc_WriteRegister(device_handle device, void *pMsg)
|
|||
if (start_reg_addr < FRT_REGISTER_DEVICE_ADDR ||\
|
||||
(start_reg_addr > FRT_REGISTER_REST_DEFAULT_SETTING && start_reg_addr < FRT_REGISTER_TRANSDUCER_CFG_1R5) ||\
|
||||
(start_reg_addr > FRT_REGISTER_DISTANCE_WE && start_reg_addr < FRT_REGISTER_LINEAR_POINT_Y_1) ||\
|
||||
(start_reg_addr > FRT_REGISTER_LINEAR_POINT_Y_5) \
|
||||
)
|
||||
(start_reg_addr > FRT_REGISTER_LINEAR_POINT_Y_5) && (start_reg_addr < FRT_REGISTER_ENCRYPT_1) ||\
|
||||
(start_reg_addr > FRT_REGISTER_ENCRYPT_4)
|
||||
)
|
||||
{
|
||||
term_printf("start_reg_addr error:%d", start_reg_addr);
|
||||
return;
|
||||
|
@ -1246,8 +1374,9 @@ void FRT_MsgProc_WriteRegister(device_handle device, void *pMsg)
|
|||
if (reg_num < 0x01 ||\
|
||||
((reg_num + start_reg_addr - 1) < FRT_REGISTER_DEVICE_ADDR) ||\
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_REST_DEFAULT_SETTING) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_TRANSDUCER_CFG_1R5)) ||\
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_DISTANCE_WE) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_LINEAR_POINT_Y_1)) ||\
|
||||
((reg_num + start_reg_addr -1) > FRT_REGISTER_LINEAR_POINT_Y_5) \
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_DISTANCE_WE) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_LINEAR_POINT_Y_1)) ||\
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_LINEAR_POINT_Y_5) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_ENCRYPT_1)) ||\
|
||||
((reg_num + start_reg_addr -1) > FRT_REGISTER_ENCRYPT_4)
|
||||
)
|
||||
{
|
||||
term_printf("reg_num error:%d", reg_num);
|
||||
|
|
|
@ -41,6 +41,8 @@ factory_config_info g_stConfigInfo={
|
|||
.linear_point_5_x = 0, /* 线性插值点5 */
|
||||
.linear_point_5_y = 0, /* 线性插值点5 */
|
||||
.linear_enable = 0, /* 线性插值使能 */
|
||||
.encrypt_0 = 0, /* 密文 */
|
||||
.encrypt_1 = 0, /* 密文 */
|
||||
.flag_end = FLAG_SAVE_INFLASH_END,
|
||||
};
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ void task_shell_term_main_loop(void const * argument);
|
|||
#include "frt_protocol.h"
|
||||
#include "inflash.h"
|
||||
#include "hp203b.h"
|
||||
#include "encrypt.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
|
|
|
@ -125,10 +125,8 @@ void Flash_EnableReadProtection(void)
|
|||
{
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
//远程升级时读保护
|
||||
#ifdef REMOTE_UPDATE
|
||||
Flash_EnableReadProtection();//读保护
|
||||
#endif
|
||||
///远程升级时读保护
|
||||
///Flash_EnableReadProtection();//读保护
|
||||
/* USER CODE END 1 */
|
||||
|
||||
/* MCU Configuration--------------------------------------------------------*/
|
||||
|
@ -174,7 +172,6 @@ void Flash_EnableReadProtection(void)
|
|||
term_printf("Version 1.0.0 Build: %s %s\r\n",__DATE__,__TIME__);
|
||||
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
|
||||
sht30_init();
|
||||
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Call init function for freertos objects (in cmsis_os2.c) */
|
||||
|
|
|
@ -701,7 +701,7 @@
|
|||
<data>
|
||||
<extensions></extensions>
|
||||
<cmdline></cmdline>
|
||||
<hasPrio>88</hasPrio>
|
||||
<hasPrio>1</hasPrio>
|
||||
<buildSequence>inputOutputBased</buildSequence>
|
||||
</data>
|
||||
</settings>
|
||||
|
@ -2245,6 +2245,9 @@
|
|||
<file>
|
||||
<name>$PROJ_DIR$\..\App\Inc\comm_types.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\App\Inc\encrypt.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\App\Inc\frt_protocol.h</name>
|
||||
</file>
|
||||
|
@ -2266,6 +2269,9 @@
|
|||
<file>
|
||||
<name>$PROJ_DIR$\..\App\Src\anemometer_dev.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\App\Src\encrypt.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\App\Src\frt_protocol.c</name>
|
||||
</file>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue