Skip to content

Commit ef655cb

Browse files
committed
Merge branch 'enable_flash_elf_sha_tests' into 'master'
Enable SHA256 coredump flash integrity verification for all targets Closes IDF-1820 See merge request espressif/esp-idf!28387
2 parents 9443361 + f1d5f97 commit ef655cb

12 files changed

+261
-205
lines changed

components/espcoredump/CMakeLists.txt

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ if(${target} STREQUAL "linux")
55
endif()
66

77
set(srcs "src/core_dump_common.c"
8-
"src/core_dump_checksum.c"
98
"src/core_dump_flash.c"
109
"src/core_dump_uart.c"
1110
"src/core_dump_elf.c"
12-
"src/core_dump_binary.c")
11+
"src/core_dump_binary.c"
12+
"src/core_dump_sha.c"
13+
"src/core_dump_crc.c")
1314

1415
set(includes "include")
1516
set(priv_includes "include_core_dump")

components/espcoredump/Kconfig

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ menu "Core dump"
4444
bool "Use CRC32 for integrity verification"
4545
config ESP_COREDUMP_CHECKSUM_SHA256
4646
bool "Use SHA256 for integrity verification"
47-
depends on ESP_COREDUMP_DATA_FORMAT_ELF && IDF_TARGET_ESP32
47+
depends on ESP_COREDUMP_DATA_FORMAT_ELF
4848
endchoice
4949

5050
config ESP_COREDUMP_CHECK_BOOT

components/espcoredump/include_core_dump/core_dump_checksum.h

+6-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -34,15 +34,14 @@ extern "C" {
3434
* @brief Type describing a checksum context. It is an abstract type as it is
3535
* implementation independent, it is defined in the C source counterpart.
3636
*/
37-
typedef struct core_dump_checksum_ctx core_dump_checksum_ctx;
37+
typedef void* core_dump_checksum_ctx;
3838

3939
/**
4040
* @brief Type returned by `esp_core_dump_checksum_finish()`. It describes a
4141
* checksum as an array of bytes. It can also be provided to `esp_core_dump_print_checksum()`.
4242
*/
4343
typedef uint8_t* core_dump_checksum_bytes;
4444

45-
4645
/**
4746
* @brief Get ELF core dump version.
4847
*
@@ -58,7 +57,7 @@ uint32_t esp_core_dump_elf_version(void);
5857
*
5958
* @param wr_data Core dump checksum context to fill.
6059
*/
61-
void esp_core_dump_checksum_init(core_dump_checksum_ctx** wr_data);
60+
void esp_core_dump_checksum_init(void ** wr_data);
6261

6362
/**
6463
* @brief Update checksum calculation by integrating the given data in the context.
@@ -68,20 +67,19 @@ void esp_core_dump_checksum_init(core_dump_checksum_ctx** wr_data);
6867
* This is usually the new data to write (or already written) on
6968
* the flash.
7069
*/
71-
void esp_core_dump_checksum_update(core_dump_checksum_ctx* wr_data, void* data, size_t data_len);
70+
void esp_core_dump_checksum_update(void* wr_data, void* data, size_t data_len);
7271

7372
/**
7473
* @brief Terminate and return checksum calculated for the given context.
7574
*
76-
* @param wr_data Core dump checksum context. It can be NULL only if chs_ptr is
77-
* also NULL.
75+
* @param wr_data Core dump checksum context.
7876
* @param chs_ptr Pointer used to return the checksum calculated. It can be
7977
* NULL, in this case, it will be ignored but the correct size
8078
* of the checksum will be returned.
8179
*
8280
* @return The size, in bytes, of the checksum.
8381
*/
84-
uint32_t esp_core_dump_checksum_finish(core_dump_checksum_ctx* wr_data, core_dump_checksum_bytes* chs_ptr);
82+
uint32_t esp_core_dump_checksum_finish(void* wr_data, core_dump_checksum_bytes* chs_ptr);
8583

8684
/**
8785
* @brief Return the size of the checksums.

components/espcoredump/include_core_dump/esp_core_dump_types.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -96,16 +96,14 @@ extern "C" {
9696
*/
9797
#define COREDUMP_VERSION_CHIP CONFIG_IDF_FIRMWARE_CHIP_ID
9898

99-
10099
typedef struct _core_dump_write_data_t
101100
{
102101
uint32_t off; /*!< Current offset of data being written */
103102
uint8_t cached_data[COREDUMP_CACHE_SIZE]; /*!< Cache used to write to flash */
104103
uint8_t cached_bytes; /*!< Number of bytes filled in the cached */
105-
core_dump_checksum_ctx* checksum_ctx; /*!< Checksum context */
104+
void *checksum_ctx; /*!< Checksum context */
106105
} core_dump_write_data_t;
107106

108-
109107
/**
110108
* @brief Types below define the signatures of the callbacks that are used
111109
* to output a core dump. The destination of the dump is implementation

components/espcoredump/linker.lf

+4-1
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,11 @@ entries:
4242
core_dump_common (noflash)
4343
core_dump_port (noflash)
4444
core_dump_elf (noflash)
45-
core_dump_checksum (noflash)
4645
core_dump_binary (noflash)
46+
core_dump_crc (noflash)
47+
# ESP32 uses mbedtls for the sha and mbedtls is in the flash
48+
if IDF_TARGET_ESP32 = n:
49+
core_dump_sha (noflash)
4750
else:
4851
* (default)
4952

components/espcoredump/src/core_dump_checksum.c

-183
This file was deleted.
+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include "sdkconfig.h"
8+
9+
#if CONFIG_ESP_COREDUMP_CHECKSUM_CRC32
10+
11+
#include "esp_rom_crc.h"
12+
#include "esp_core_dump_types.h"
13+
14+
const static char TAG[] __attribute__((unused)) = "esp_core_dump_crc";
15+
16+
typedef uint32_t core_dump_crc_t;
17+
18+
typedef struct {
19+
core_dump_crc_t crc;
20+
uint32_t total_bytes_checksum; /* Number of bytes used to calculate the checksum */
21+
} core_dump_crc_ctx_t;
22+
23+
static core_dump_crc_ctx_t s_core_dump_crc_ctx = { 0 };
24+
25+
void esp_core_dump_checksum_init(core_dump_checksum_ctx *out_ctx) __attribute__((alias("core_dump_crc_init")));
26+
void esp_core_dump_checksum_update(core_dump_checksum_ctx cks_ctx, void* data, size_t data_len) __attribute__((alias("core_dump_crc_update")));
27+
uint32_t esp_core_dump_checksum_finish(core_dump_checksum_ctx cks_ctx, core_dump_checksum_bytes* chs_ptr) __attribute__((alias("core_dump_crc_finish")));
28+
void esp_core_dump_print_checksum(const char* msg, core_dump_checksum_bytes checksum) __attribute__((alias("core_dump_crc_print")));
29+
uint32_t esp_core_dump_checksum_size(void) __attribute__((alias("core_dump_crc_size")));
30+
uint32_t esp_core_dump_elf_version(void) __attribute__((alias("core_dump_crc_version")));
31+
32+
static void core_dump_crc_print(const char *msg, const uint8_t *checksum)
33+
{
34+
ESP_COREDUMP_DEBUG_ASSERT(checksum != NULL);
35+
36+
if (msg != NULL) {
37+
ESP_COREDUMP_PRINT("%s=", msg);
38+
}
39+
ESP_COREDUMP_PRINT("'%08x'\r\n", *((const uint32_t*)checksum));
40+
}
41+
42+
static uint32_t core_dump_crc_size(void)
43+
{
44+
return sizeof(core_dump_crc_t);
45+
}
46+
47+
static uint32_t core_dump_crc_version(void)
48+
{
49+
return COREDUMP_VERSION_ELF_CRC32;
50+
}
51+
52+
static void core_dump_crc_init(core_dump_checksum_ctx *out_ctx)
53+
{
54+
if (out_ctx) {
55+
s_core_dump_crc_ctx.crc = 0;
56+
s_core_dump_crc_ctx.total_bytes_checksum = 0;
57+
*out_ctx = &s_core_dump_crc_ctx;
58+
}
59+
}
60+
61+
static void core_dump_crc_update(core_dump_checksum_ctx cks_ctx, void* data, size_t data_len)
62+
{
63+
if (data) {
64+
core_dump_crc_ctx_t *crc_ctx = cks_ctx;
65+
crc_ctx->crc = esp_rom_crc32_le(crc_ctx->crc, data, data_len);
66+
// keep counter of cashed bytes
67+
crc_ctx->total_bytes_checksum += data_len;
68+
} else {
69+
ESP_COREDUMP_LOGE("Empty data to add to checksum calculation!");
70+
}
71+
}
72+
73+
static uint32_t core_dump_crc_finish(core_dump_checksum_ctx cks_ctx, core_dump_checksum_bytes* chs_ptr)
74+
{
75+
if (cks_ctx) {
76+
core_dump_crc_ctx_t *crc_ctx = cks_ctx;
77+
78+
if (chs_ptr) {
79+
*chs_ptr = (core_dump_checksum_bytes)&crc_ctx->crc;
80+
}
81+
82+
ESP_COREDUMP_LOG_PROCESS("Total length of hashed data: %d", crc_ctx->total_bytes_checksum);
83+
}
84+
85+
return core_dump_crc_size();
86+
}
87+
88+
#endif /* CONFIG_ESP_COREDUMP_CHECKSUM_CRC32 */

components/espcoredump/src/core_dump_flash.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/

0 commit comments

Comments
 (0)