From 544c5e57ce194c40f9f37b094cc1de6c8a846f2e Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Tue, 22 Dec 2020 19:03:24 +1100 Subject: [PATCH] esp32c3: Add tests for esp_sha, stack checker From internal commit 6d894813 --- components/esp32c3/test/CMakeLists.txt | 9 +++ components/esp32c3/test/component.mk | 4 + components/esp32c3/test/test_sha.c | 80 +++++++++++++++++++ components/esp32c3/test/test_stack_check.c | 25 ++++++ .../esp32c3/test/test_stack_check_cxx.cpp | 25 ++++++ 5 files changed, 143 insertions(+) create mode 100644 components/esp32c3/test/CMakeLists.txt create mode 100644 components/esp32c3/test/component.mk create mode 100644 components/esp32c3/test/test_sha.c create mode 100644 components/esp32c3/test/test_stack_check.c create mode 100644 components/esp32c3/test/test_stack_check_cxx.cpp diff --git a/components/esp32c3/test/CMakeLists.txt b/components/esp32c3/test/CMakeLists.txt new file mode 100644 index 0000000000..ddee73fdb1 --- /dev/null +++ b/components/esp32c3/test/CMakeLists.txt @@ -0,0 +1,9 @@ +if(IDF_TARGET STREQUAL "esp32c3") + idf_component_register(SRC_DIRS . + INCLUDE_DIRS . ${CMAKE_CURRENT_BINARY_DIR} + REQUIRES unity test_utils esp_common + ) + + idf_build_set_property(COMPILE_DEFINITIONS "-DESP_TIMER_DYNAMIC_OVERFLOW_VAL" APPEND) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u ld_include_test_dport_xt_highint5") +endif() diff --git a/components/esp32c3/test/component.mk b/components/esp32c3/test/component.mk new file mode 100644 index 0000000000..d2183390cc --- /dev/null +++ b/components/esp32c3/test/component.mk @@ -0,0 +1,4 @@ +# +# Component Makefile (not used for tests, but CI checks test parity between GNU Make & CMake) +# +COMPONENT_CONFIG_ONLY := 1 diff --git a/components/esp32c3/test/test_sha.c b/components/esp32c3/test/test_sha.c new file mode 100644 index 0000000000..052433d6ac --- /dev/null +++ b/components/esp32c3/test/test_sha.c @@ -0,0 +1,80 @@ +#include +#include +#include +#include "esp_types.h" +#include "esp32c3/clk.h" +#include "esp_log.h" +#include "esp_timer.h" +#include "esp_heap_caps.h" +#include "idf_performance.h" + +#include "unity.h" +#include "test_utils.h" +#include "mbedtls/sha1.h" +#include "mbedtls/sha256.h" +#include "sha/sha_dma.h" + +/* Note: Most of the SHA functions are called as part of mbedTLS, so +are tested as part of mbedTLS tests. Only esp_sha() is different. +*/ + +#define TAG "sha_test" + +TEST_CASE("Test esp_sha()", "[hw_crypto]") +{ + const size_t BUFFER_SZ = 32 * 1024 + 6; // NB: not an exact multiple of SHA block size + + int64_t begin, end; + uint32_t us_sha1; + uint8_t sha1_result[20] = { 0 }; + void *buffer = heap_caps_malloc(BUFFER_SZ, MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL); + TEST_ASSERT_NOT_NULL(buffer); + memset(buffer, 0xEE, BUFFER_SZ); + + const uint8_t sha1_expected[20] = { 0xc7, 0xbb, 0xd3, 0x74, 0xf2, 0xf6, 0x20, 0x86, + 0x61, 0xf4, 0x50, 0xd5, 0xf5, 0x18, 0x44, 0xcc, + 0x7a, 0xb7, 0xa5, 0x4a }; + + begin = esp_timer_get_time(); + esp_sha(SHA1, buffer, BUFFER_SZ, sha1_result); + end = esp_timer_get_time(); + TEST_ASSERT_EQUAL_HEX8_ARRAY(sha1_expected, sha1_result, sizeof(sha1_expected)); + us_sha1 = end - begin; + ESP_LOGI(TAG, "esp_sha() 32KB SHA1 in %u us", us_sha1); + + free(buffer); + + TEST_PERFORMANCE_CCOMP_LESS_THAN(TIME_SHA1_32KB, "%dus", us_sha1); +} + +TEST_CASE("Test esp_sha() function with long input", "[hw_crypto]") +{ + const void* ptr; + spi_flash_mmap_handle_t handle; + uint8_t sha1_espsha[20] = { 0 }; + uint8_t sha1_mbedtls[20] = { 0 }; + uint8_t sha256_espsha[32] = { 0 }; + uint8_t sha256_mbedtls[32] = { 0 }; + + const size_t LEN = 1024 * 1024; + + /* mmap() 1MB of flash, we don't care what it is really */ + esp_err_t err = spi_flash_mmap(0x0, LEN, SPI_FLASH_MMAP_DATA, &ptr, &handle); + + TEST_ASSERT_EQUAL_HEX32(ESP_OK, err); + TEST_ASSERT_NOT_NULL(ptr); + + /* Compare esp_sha() result to the mbedTLS result, should always be the same */ + + esp_sha(SHA1, ptr, LEN, sha1_espsha); + int r = mbedtls_sha1_ret(ptr, LEN, sha1_mbedtls); + TEST_ASSERT_EQUAL(0, r); + + esp_sha(SHA2_256, ptr, LEN, sha256_espsha); + r = mbedtls_sha256_ret(ptr, LEN, sha256_mbedtls, 0); + TEST_ASSERT_EQUAL(0, r); + + TEST_ASSERT_EQUAL_MEMORY_MESSAGE(sha1_espsha, sha1_mbedtls, sizeof(sha1_espsha), "SHA1 results should match"); + + TEST_ASSERT_EQUAL_MEMORY_MESSAGE(sha256_espsha, sha256_mbedtls, sizeof(sha256_espsha), "SHA256 results should match"); +} diff --git a/components/esp32c3/test/test_stack_check.c b/components/esp32c3/test/test_stack_check.c new file mode 100644 index 0000000000..abc36047b9 --- /dev/null +++ b/components/esp32c3/test/test_stack_check.c @@ -0,0 +1,25 @@ +#include "unity.h" + +#if CONFIG_COMPILER_STACK_CHECK + +static void recur_and_smash(void) +{ + static int cnt; + volatile uint8_t buf[50]; + volatile int num = sizeof(buf)+10; + + if (cnt++ < 1) { + recur_and_smash(); + } + for (int i = 0; i < num; i++) { + buf[i] = 0; + } +} + + +TEST_CASE("stack smashing protection", "[stack_check] [ignore]") +{ + recur_and_smash(); +} + +#endif diff --git a/components/esp32c3/test/test_stack_check_cxx.cpp b/components/esp32c3/test/test_stack_check_cxx.cpp new file mode 100644 index 0000000000..83ca007d05 --- /dev/null +++ b/components/esp32c3/test/test_stack_check_cxx.cpp @@ -0,0 +1,25 @@ +#include "unity.h" + +#if CONFIG_COMPILER_STACK_CHECK + +static void recur_and_smash_cxx(void) +{ + static int cnt; + volatile uint8_t buf[50]; + volatile int num = sizeof(buf)+10; + + if (cnt++ < 1) { + recur_and_smash_cxx(); + } + for (int i = 0; i < num; i++) { + buf[i] = 0; + } +} + + +TEST_CASE("stack smashing protection CXX", "[stack_check] [ignore]") +{ + recur_and_smash_cxx(); +} + +#endif