feat(examples/security): Extend flash_encryption example with fatfs encryption

Updated the flash_encryption example to demonstrate the usage of fatfs encryption.
Updated existing test case to ensure accurate and reliable testing.
Documentation of storage section extended by security relarted summary.

Closes https://github.com/espressif/esp-idf/issues/11551
Closes https://github.com/espressif/esp-idf/issues/13668
This commit is contained in:
radek.tandler
2023-12-06 17:25:58 +01:00
committed by BOT
parent 9e16b45dac
commit 68df525394
12 changed files with 608 additions and 58 deletions

View File

@@ -19,6 +19,8 @@
#include "esp_efuse_table.h"
#include "nvs_flash.h"
#include "flash_encrypt_fatfs.h"
static void example_print_chip_info(void);
static void example_print_flash_encryption_status(void);
static void example_read_write_flash(void);
@@ -35,6 +37,23 @@ static const char* TAG = "example";
#define TARGET_CRYPT_CNT_WIDTH 3
#endif
// return true, if partitions necessary to demonstrate fatfs encryption are present in the flash
static bool can_perform_fatfs_example(void)
{
const esp_partition_t *fatfs_ne = esp_partition_find_first(
ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, CUSTOM_FAT_PART_NAME_NE);
const esp_partition_t *fatfs_e = esp_partition_find_first(
ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, CUSTOM_FAT_PART_NAME_E);
if ((fatfs_ne != NULL) && (fatfs_e != NULL)) {
ESP_LOGI(TAG, "Partitions %s and %s for FATFS example are present", CUSTOM_FAT_PART_NAME_NE, CUSTOM_FAT_PART_NAME_E);
return true;
}
return false;
}
static esp_err_t example_custom_nvs_part_init(const char *name)
{
#if CONFIG_NVS_ENCRYPTION
@@ -71,6 +90,11 @@ void app_main(void)
example_print_chip_info();
example_print_flash_encryption_status();
example_read_write_flash();
if (can_perform_fatfs_example()) {
example_read_write_fatfs();
}
/* Initialize the default NVS partition */
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
@@ -95,15 +119,15 @@ static void example_print_chip_info(void)
uint32_t flash_size;
esp_chip_info(&chip_info);
printf("This is %s chip with %d CPU core(s), WiFi%s%s, ",
CONFIG_IDF_TARGET,
chip_info.cores,
(chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
(chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
CONFIG_IDF_TARGET,
chip_info.cores,
(chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
(chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
unsigned major_rev = chip_info.revision / 100;
unsigned minor_rev = chip_info.revision % 100;
printf("silicon revision v%d.%d, ", major_rev, minor_rev);
if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) {
if (esp_flash_get_size(NULL, &flash_size) != ESP_OK) {
printf("Get flash size failed");
return;
}
@@ -111,7 +135,6 @@ static void example_print_chip_info(void)
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
}
static void example_print_flash_encryption_status(void)
{
uint32_t flash_crypt_cnt = 0;
@@ -123,15 +146,14 @@ static void example_print_flash_encryption_status(void)
printf("Flash encryption feature is disabled\n");
} else {
printf("Flash encryption feature is enabled in %s mode\n",
mode == ESP_FLASH_ENC_MODE_DEVELOPMENT ? "DEVELOPMENT" : "RELEASE");
mode == ESP_FLASH_ENC_MODE_DEVELOPMENT ? "DEVELOPMENT" : "RELEASE");
}
}
static void example_read_write_flash(void)
{
const esp_partition_t* partition = esp_partition_find_first(
ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "storage");
ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "storage");
assert(partition);
printf("Erasing partition \"%s\" (0x%" PRIx32 " bytes)\n", partition->label, partition->size);