2026-05-31 03:20:26 +08:00
|
|
|
|
/*
|
|
|
|
|
|
* protocol.cpp - 协议层实现
|
2026-04-27 00:42:26 +08:00
|
|
|
|
* T2.1, T2.2, T1.3
|
2026-04-27 03:00:48 +08:00
|
|
|
|
* ESP-IDF 6.0 适配版本 - 使用硬件 AES-128-CBC + 硬件 RNG
|
|
|
|
|
|
*
|
|
|
|
|
|
* 加密实现使用 ESP32-C3 硬件 AES 加速器(通过 mbedtls port)
|
2026-05-31 03:20:26 +08:00
|
|
|
|
*
|
2026-06-15 00:24:29 +08:00
|
|
|
|
* 当前保留的接口:init、scrambleGenerate(nonce 生成)、
|
|
|
|
|
|
* sessionKeyInit / sessionKeyClear(会话密钥生命周期管理)。
|
|
|
|
|
|
* 帧构建、AES-CBC 加解密、CRC16 等中间件代码已移除。
|
2026-04-27 00:42:26 +08:00
|
|
|
|
*/
|
|
|
|
|
|
#include <string.h>
|
2026-04-27 03:00:48 +08:00
|
|
|
|
#include <stdio.h>
|
2026-04-27 00:42:26 +08:00
|
|
|
|
#include "esp_random.h"
|
2026-04-27 03:00:48 +08:00
|
|
|
|
#include "aes/esp_aes.h"
|
2026-04-27 00:42:26 +08:00
|
|
|
|
#include "app_config.h"
|
|
|
|
|
|
#include "protocol.h"
|
2026-04-27 02:34:47 +08:00
|
|
|
|
#include "monitor/debug_log.h"
|
2026-04-27 00:42:26 +08:00
|
|
|
|
|
2026-05-31 03:20:26 +08:00
|
|
|
|
// ============================================================
|
|
|
|
|
|
// Protocol 单例
|
|
|
|
|
|
// ============================================================
|
2026-06-15 01:14:29 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 获取 Protocol 单例实例。
|
|
|
|
|
|
* @return Protocol 单例引用。
|
|
|
|
|
|
*/
|
2026-05-31 03:20:26 +08:00
|
|
|
|
Protocol& Protocol::instance()
|
2026-04-27 00:42:26 +08:00
|
|
|
|
{
|
2026-05-31 03:20:26 +08:00
|
|
|
|
static Protocol inst;
|
|
|
|
|
|
return inst;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-15 01:14:29 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 初始化协议层,打印初始化信息并设置初始化标志。
|
|
|
|
|
|
*/
|
2026-05-31 03:20:26 +08:00
|
|
|
|
void Protocol::init()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_initialized) return;
|
2026-04-27 00:42:26 +08:00
|
|
|
|
|
2026-04-28 01:06:17 +08:00
|
|
|
|
DEBUG_INFO("PROT", "=== 初始化协议层 ===");
|
2026-06-15 00:24:29 +08:00
|
|
|
|
DEBUG_INFO("PROT", "协议层功能: nonce 扰码 + 会话密钥管理");
|
2026-04-27 00:42:26 +08:00
|
|
|
|
|
2026-05-31 03:20:26 +08:00
|
|
|
|
m_initialized = true;
|
2026-04-27 00:42:26 +08:00
|
|
|
|
DEBUG_INFO("PROT", "协议层就绪");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-05-26 02:44:57 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 根据时间戳、地址和随机种子生成 16 字节 nonce。
|
|
|
|
|
|
*/
|
2026-05-31 03:20:26 +08:00
|
|
|
|
void Protocol::scrambleGenerate(uint32_t timestamp, uint32_t mem_addr,
|
|
|
|
|
|
uint32_t rand_seed, uint8_t *nonce_out)
|
2026-04-27 00:42:26 +08:00
|
|
|
|
{
|
|
|
|
|
|
uint8_t state[16];
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(&state[0], ×tamp, 4);
|
|
|
|
|
|
memcpy(&state[4], &mem_addr, 4);
|
|
|
|
|
|
memcpy(&state[8], &rand_seed, 4);
|
|
|
|
|
|
memcpy(&state[12], SCRAMBLE_CONST, 4);
|
|
|
|
|
|
|
|
|
|
|
|
for (int round = 0; round < 3; round++) {
|
|
|
|
|
|
for (int i = 0; i < 16; i++) {
|
|
|
|
|
|
state[i] ^= SCRAMBLE_CONST[i];
|
|
|
|
|
|
state[i] = (state[i] << 1) | (state[i] >> 7);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int round = 0; round < 2; round++) {
|
|
|
|
|
|
uint32_t *words = (uint32_t *)state;
|
|
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
|
|
|
|
words[i] ^= SCRAMBLE_CONST[i * 4 % 16] | ((uint32_t)SCRAMBLE_CONST[i * 4 + 1] << 8);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(nonce_out, state, 16);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-05-05 04:48:31 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 会话密钥初始化
|
|
|
|
|
|
*/
|
2026-05-31 03:20:26 +08:00
|
|
|
|
int Protocol::sessionKeyInit(session_ctx_t *sess, const uint8_t *k_session)
|
2026-04-27 00:42:26 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (!sess || !k_session) return -1;
|
|
|
|
|
|
|
|
|
|
|
|
memset(sess, 0, sizeof(session_ctx_t));
|
|
|
|
|
|
memcpy(sess->key, k_session, 16);
|
|
|
|
|
|
memset(sess->iv, 0, 16);
|
|
|
|
|
|
sess->used = 0;
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-05-05 04:48:31 +08:00
|
|
|
|
/**
|
2026-05-31 03:20:26 +08:00
|
|
|
|
* @brief 清除会话上下文中的密钥和状态。
|
2026-05-05 04:48:31 +08:00
|
|
|
|
*/
|
2026-05-31 03:20:26 +08:00
|
|
|
|
void Protocol::sessionKeyClear(session_ctx_t *sess)
|
2026-04-27 00:42:26 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (sess) {
|
|
|
|
|
|
memset(sess->key, 0, 16);
|
|
|
|
|
|
memset(sess->iv, 0, 16);
|
|
|
|
|
|
sess->used = 0;
|
|
|
|
|
|
}
|
2026-05-31 03:20:26 +08:00
|
|
|
|
}
|