From 91ab4b55137510b7267d8f442c7165754edc472f Mon Sep 17 00:00:00 2001 From: Chip Weinberger Date: Mon, 30 Jan 2023 01:37:00 -0800 Subject: [PATCH 1/2] [AES] Timeout: return error dont abort --- components/mbedtls/port/aes/dma/esp_aes.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/components/mbedtls/port/aes/dma/esp_aes.c b/components/mbedtls/port/aes/dma/esp_aes.c index 4b952dbff3..58fb12d1eb 100644 --- a/components/mbedtls/port/aes/dma/esp_aes.c +++ b/components/mbedtls/port/aes/dma/esp_aes.c @@ -209,14 +209,14 @@ static esp_err_t esp_aes_isr_initialise( void ) #endif // CONFIG_MBEDTLS_AES_USE_INTERRUPT /* Wait for AES hardware block operation to complete */ -static void esp_aes_dma_wait_complete(bool use_intr, lldesc_t *output_desc) +static int esp_aes_dma_wait_complete(bool use_intr, lldesc_t *output_desc) { #if defined (CONFIG_MBEDTLS_AES_USE_INTERRUPT) if (use_intr) { - if (!xSemaphoreTake(op_complete_sem, 2000 / portTICK_PERIOD_MS)) { + if (!xSemaphoreTake(op_complete_sem, 5000 / portTICK_PERIOD_MS)) { /* indicates a fundamental problem with driver */ ESP_LOGE("AES", "Timed out waiting for completion of AES Interrupt"); - abort(); + return -1; } #ifdef CONFIG_PM_ENABLE esp_pm_lock_release(s_pm_cpu_lock); @@ -230,6 +230,7 @@ static void esp_aes_dma_wait_complete(bool use_intr, lldesc_t *output_desc) aes_hal_wait_done(); esp_aes_wait_dma_done(output_desc); + return 0; } @@ -436,7 +437,12 @@ static int esp_aes_process_dma(esp_aes_context *ctx, const unsigned char *input, } aes_hal_transform_dma_start(blocks); - esp_aes_dma_wait_complete(use_intr, out_desc_tail); + + if (esp_aes_dma_wait_complete(use_intr, out_desc_tail) < 0) { + ESP_LOGE(TAG, "esp_aes_dma_wait_complete failed"); + ret = -1; + goto cleanup; + } #if (CONFIG_SPIRAM && SOC_PSRAM_DMA_CAPABLE) if (block_bytes > 0) { @@ -561,7 +567,11 @@ int esp_aes_process_dma_gcm(esp_aes_context *ctx, const unsigned char *input, un aes_hal_transform_dma_gcm_start(blocks); - esp_aes_dma_wait_complete(use_intr, out_desc_head); + if(esp_aes_dma_wait_complete(use_intr, out_desc_head) < 0){ + ESP_LOGE(TAG, "esp_aes_dma_wait_complete failed"); + ret = -1; + goto cleanup; + } aes_hal_transform_dma_finish(); From ca0f98242062f172f82075d452b8139f2663cd4d Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Fri, 10 Feb 2023 13:29:51 +0800 Subject: [PATCH 2/2] aes: fix minor formatting issues --- components/mbedtls/port/aes/dma/esp_aes.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/components/mbedtls/port/aes/dma/esp_aes.c b/components/mbedtls/port/aes/dma/esp_aes.c index 58fb12d1eb..d5a9e502b1 100644 --- a/components/mbedtls/port/aes/dma/esp_aes.c +++ b/components/mbedtls/port/aes/dma/esp_aes.c @@ -74,6 +74,10 @@ busy-waiting, 30000 bytes is approx 0.5 ms */ #define AES_DMA_INTR_TRIG_LEN 2000 +/* With buffers in PSRAM (worst condition) we still achieve a speed of 4 MB/s + thus a 2 second timeout value should be suffient for even very large buffers. + */ +#define AES_WAIT_INTR_TIMEOUT_MS 2000 #if defined(CONFIG_MBEDTLS_AES_USE_INTERRUPT) static SemaphoreHandle_t op_complete_sem; @@ -213,9 +217,9 @@ static int esp_aes_dma_wait_complete(bool use_intr, lldesc_t *output_desc) { #if defined (CONFIG_MBEDTLS_AES_USE_INTERRUPT) if (use_intr) { - if (!xSemaphoreTake(op_complete_sem, 5000 / portTICK_PERIOD_MS)) { + if (!xSemaphoreTake(op_complete_sem, AES_WAIT_INTR_TIMEOUT_MS / portTICK_PERIOD_MS)) { /* indicates a fundamental problem with driver */ - ESP_LOGE("AES", "Timed out waiting for completion of AES Interrupt"); + ESP_LOGE(TAG, "Timed out waiting for completion of AES Interrupt"); return -1; } #ifdef CONFIG_PM_ENABLE @@ -567,7 +571,7 @@ int esp_aes_process_dma_gcm(esp_aes_context *ctx, const unsigned char *input, un aes_hal_transform_dma_gcm_start(blocks); - if(esp_aes_dma_wait_complete(use_intr, out_desc_head) < 0){ + if (esp_aes_dma_wait_complete(use_intr, out_desc_head) < 0) { ESP_LOGE(TAG, "esp_aes_dma_wait_complete failed"); ret = -1; goto cleanup;