diff --git a/app/drivers/sertrf/sertrf.c b/app/drivers/sertrf/sertrf.c index 165ccd1..71897a6 100644 --- a/app/drivers/sertrf/sertrf.c +++ b/app/drivers/sertrf/sertrf.c @@ -34,6 +34,11 @@ void sertrf_init(void) //获取飞控代码地址 sertrf.fc_address = parse_hex_or_dec(FC_ADDRESS); + //获取加密后的efuse MAC 地址 + if(!esp_efuse_mac_get_default_id(sertrf.efuse_mac)) + { + sertrf_aes_ctr_encrypt(sertrf.efuse_mac, 6, sertrf.efuse_mac_encrypt); + } //初始化环形buff rb_init(&sertrf.data_handle_buffer, DATA_HANDLE_BUFFER_SIZE, sizeof(uint8_t)); @@ -146,7 +151,7 @@ void app_thread(void* arg) strcpy(sertrf_stauct.wifi_ap_password, g_cfg_app->app_config_wifi_para.wifi_ap_password); strcpy(sertrf_stauct.wifi_sta_ssid, g_cfg_app->app_config_wifi_para.wifi_sta_ssid); strcpy(sertrf_stauct.wifi_sta_password, g_cfg_app->app_config_wifi_para.wifi_sta_password); - + memcpy(sertrf_stauct.efuse_mac_encrypt, sertrf.efuse_mac_encrypt, 6); resend_send_data(&sertrf.resend_device, RESEND_CMD_GET_PARAM, &sertrf_stauct, sizeof(sertrf_stauct_t), 1000); sertrf.resend_device.handle_flag = 0;//标志位清零 diff --git a/app/drivers/sertrf/sertrf.h b/app/drivers/sertrf/sertrf.h index 25eb3a3..7a61d38 100644 --- a/app/drivers/sertrf/sertrf.h +++ b/app/drivers/sertrf/sertrf.h @@ -48,15 +48,21 @@ typedef struct // 环形buff RingBuffer data_handle_buffer; uint32_t fc_address; + + // efuse MAC 地址 + uint8_t efuse_mac[6]; + uint8_t efuse_mac_encrypt[6]; + }sertrf_t; -typedef struct +typedef struct __attribute__((packed)) { char ble_name[32]; char wifi_ap_ssid[32]; char wifi_ap_password[32]; char wifi_sta_ssid[32]; char wifi_sta_password[32]; + uint8_t efuse_mac_encrypt[6]; }sertrf_stauct_t; /** * @brief 模块初始化 diff --git a/app/drivers/sertrf/tool.c b/app/drivers/sertrf/tool.c index 113c0c7..8359a50 100644 --- a/app/drivers/sertrf/tool.c +++ b/app/drivers/sertrf/tool.c @@ -1,5 +1,6 @@ #include "tool.h" +uint8_t efuse_mac[6]; int time_out(uint32_t* time_start, uint32_t timeout_ms) { uint32_t time_new = os_get_sys_time(); @@ -38,4 +39,102 @@ uint32_t parse_hex_or_dec(const char *s) { if (!s) return 0; if (s[0] == '0' && (s[1]=='x' || s[1]=='X')) return (uint32_t)strtoul(s+2, NULL, 16); return (uint32_t)strtoul(s, NULL, 0); +} + +void aes_test(void) +{ + // if(!esp_efuse_mac_get_default_id(efuse_mac)) + // printf("mac: %02X:%02X:%02X:%02X:%02X:%02X\n", efuse_mac[0], efuse_mac[1], efuse_mac[2], efuse_mac[3], efuse_mac[4], efuse_mac[5]); + + // const unsigned char key[16] = "1234567890abcdef"; // 128-bit key + // unsigned char nonce_counter[16] = {0}; // 初始计数器块 (可用随机数 + 计数) + // unsigned char stream_block[16] = {0}; // 内部缓冲 + // size_t nc_off = 0; + + // const unsigned char input[] = "Hello AES-CTR on ESP32!"; + // unsigned char output[64] = {0}; + + // mbedtls_aes_context aes; + // mbedtls_aes_init(&aes); + // mbedtls_aes_setkey_enc(&aes, key, 128); + + // // 加密 + // mbedtls_aes_crypt_ctr(&aes, sizeof(efuse_mac), &nc_off, + // nonce_counter, stream_block, efuse_mac, output); + + // printf("Ciphertext (hex): "); + // for (int i = 0; i < sizeof(efuse_mac); i++) + // printf("%02X", output[i]); + // printf("\n"); + + // // 解密(同一函数) + // unsigned char decrypted[64] = {0}; + // nc_off = 0; + // memset(nonce_counter, 0, 16); + // memset(stream_block, 0, 16); + + // mbedtls_aes_crypt_ctr(&aes, sizeof(efuse_mac), &nc_off, + // nonce_counter, stream_block, output, decrypted); + + // printf("Decrypted: %s\n", decrypted); + + // mbedtls_aes_free(&aes); + + + if(!esp_efuse_mac_get_default_id(efuse_mac)) + printf("mac: %02X:%02X:%02X:%02X:%02X:%02X\n", efuse_mac[0], efuse_mac[1], efuse_mac[2], efuse_mac[3], efuse_mac[4], efuse_mac[5]); + + uint8_t efuse_mac_encrypt[6] = {0}; + sertrf_aes_ctr_encrypt(efuse_mac, 6, efuse_mac_encrypt); + printf("mac: %02X:%02X:%02X:%02X:%02X:%02X\n", efuse_mac_encrypt[0], efuse_mac_encrypt[1], efuse_mac_encrypt[2], efuse_mac_encrypt[3], efuse_mac_encrypt[4], efuse_mac_encrypt[5]); + + uint8_t efuse_mac_decrypt[6] = {0}; + sertrf_aes_ctr_decrypt(efuse_mac_encrypt, 6, efuse_mac_decrypt); + printf("mac: %02X:%02X:%02X:%02X:%02X:%02X\n", efuse_mac_decrypt[0], efuse_mac_decrypt[1], efuse_mac_decrypt[2], efuse_mac_decrypt[3], efuse_mac_decrypt[4], efuse_mac_decrypt[5]); +} + +void sertrf_aes_ctr_encrypt(uint8_t *data, uint32_t len,uint8_t* output) +{ + size_t nc_off = 0; + unsigned char nonce_counter[16] = {0}; // 初始计数器块 (可用随机数 + 计数) + unsigned char stream_block[16] = {0}; // 内部缓冲 + + const unsigned char key[16] = PRIVATE_KEY; // 128-bit key + + mbedtls_aes_context aes; + mbedtls_aes_init(&aes); + mbedtls_aes_setkey_enc(&aes, key, 128); + + // 加密 + mbedtls_aes_crypt_ctr(&aes, len, &nc_off, + nonce_counter, stream_block, data, output); + mbedtls_aes_free(&aes); +} +void sertrf_aes_ctr_decrypt(uint8_t *data, uint32_t len,uint8_t* output) +{ + size_t nc_off = 0; + unsigned char nonce_counter[16] = {0}; // 初始计数器块 (可用随机数 + 计数) + unsigned char stream_block[16] = {0}; // 内部缓冲 + + const unsigned char key[16] = PRIVATE_KEY; // 128-bit key + + mbedtls_aes_context aes; + mbedtls_aes_init(&aes); + mbedtls_aes_setkey_enc(&aes, key, 128); + + mbedtls_aes_crypt_ctr(&aes, len, &nc_off, + nonce_counter, stream_block, data, output); + mbedtls_aes_free(&aes); +} +esp_err_t esp_efuse_mac_get_default_id(uint8_t *mac) +{ + esp_err_t err = esp_efuse_mac_get_default(mac); + if (err != ESP_OK) { + return err; + } +#if CONFIG_SOC_IEEE802154_SUPPORTED + return insert_mac_ext_into_mac(mac); +#else + return ESP_OK; +#endif } \ No newline at end of file diff --git a/app/drivers/sertrf/tool.h b/app/drivers/sertrf/tool.h index bf0a1b8..2858cb1 100644 --- a/app/drivers/sertrf/tool.h +++ b/app/drivers/sertrf/tool.h @@ -8,6 +8,13 @@ #include #include "os/os.h" #include "sys_log.h" +#include "mbedtls/aes.h" +#include +#include "esp_system.h" +#include "esp_mac.h" +#include "../data_port/ble_spp/ble_spp_server.h" + +#define PRIVATE_KEY "1234567890abcdef" /** * @brief 超时判断 @@ -21,4 +28,28 @@ void printf_chill_time(uint8_t chill_time, uint16_t type); /** * @brief 字符串转十进制 */ -uint32_t parse_hex_or_dec(const char *s); \ No newline at end of file +uint32_t parse_hex_or_dec(const char *s); + +/** + * @brief AEStest + */ +void aes_test(void); + +/** + * @brief AES加密 + */ +void sertrf_aes_ctr_encrypt(uint8_t *data, uint32_t len,uint8_t* output); +/** + * @brief AES解密 + */ +void sertrf_aes_ctr_decrypt(uint8_t *data, uint32_t len,uint8_t* output); + +/** + * @breif 获取ESP MAC地址 + */ +esp_err_t esp_efuse_mac_get_default_id(uint8_t *mac); + +/** + * @brief 获取BLE MAC地址 + */ +esp_err_t esp_efuse_ble_mac_get_default(uint8_t *mac); \ No newline at end of file