新增软件加密校验部分,协议添加读ID写密文,加密是否有效待验证

This commit is contained in:
95384 2025-01-09 17:37:08 +08:00
parent 8dd40691af
commit b3d26b0969
10 changed files with 1648 additions and 12 deletions

9
App/Inc/encrypt.h Normal file
View File

@ -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_

View File

@ -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)

View File

@ -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)

51
App/Src/encrypt.c Normal file
View File

@ -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]);
}

View File

@ -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);

View File

@ -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,
};

View File

@ -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 -----------------------------------------------------------*/

View File

@ -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) */

View File

@ -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