fix(mbedtls): move interrupt allocation during initialization phase

pull/13426/head
harshal.patil 2023-11-28 22:30:34 +05:30
rodzic 23e7fa801b
commit bffe5d2864
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 5B5EC97C35B9A2E5
3 zmienionych plików z 37 dodań i 32 usunięć

Wyświetl plik

@ -169,24 +169,28 @@ static IRAM_ATTR void esp_aes_complete_isr(void *arg)
} }
} }
void esp_aes_intr_alloc(void)
{
if (op_complete_sem == NULL) {
esp_err_t ret = esp_intr_alloc(ETS_AES_INTR_SOURCE, 0, esp_aes_complete_isr, NULL, NULL);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Failed to allocate AES interrupt %d", ret);
// This should be treated as fatal error as this API would mostly
// be invoked within mbedTLS interface. There is no way for the system
// to proceed if the AES interrupt allocation fails here.
abort();
}
static StaticSemaphore_t op_sem_buf;
op_complete_sem = xSemaphoreCreateBinaryStatic(&op_sem_buf);
// Static semaphore creation is unlikley to fail but still basic sanity
assert(op_complete_sem != NULL);
}
}
static esp_err_t esp_aes_isr_initialise( void ) static esp_err_t esp_aes_isr_initialise( void )
{ {
aes_hal_interrupt_clear(); aes_hal_interrupt_clear();
aes_hal_interrupt_enable(true); aes_hal_interrupt_enable(true);
if (op_complete_sem == NULL) {
op_complete_sem = xSemaphoreCreateBinary();
if (op_complete_sem == NULL) {
ESP_LOGE(TAG, "Failed to create intr semaphore");
return ESP_FAIL;
}
esp_err_t ret = esp_intr_alloc(ETS_AES_INTR_SOURCE, 0, esp_aes_complete_isr, NULL, NULL);
if (ret != ESP_OK) {
return ret;
}
}
/* AES is clocked proportionally to CPU clock, take power management lock */ /* AES is clocked proportionally to CPU clock, take power management lock */
#ifdef CONFIG_PM_ENABLE #ifdef CONFIG_PM_ENABLE
if (s_pm_cpu_lock == NULL) { if (s_pm_cpu_lock == NULL) {
@ -423,7 +427,7 @@ static int esp_aes_process_dma(esp_aes_context *ctx, const unsigned char *input,
/* Only use interrupt for long AES operations */ /* Only use interrupt for long AES operations */
if (len > AES_DMA_INTR_TRIG_LEN) { if (len > AES_DMA_INTR_TRIG_LEN) {
use_intr = true; use_intr = true;
if (esp_aes_isr_initialise() == ESP_FAIL) { if (esp_aes_isr_initialise() != ESP_OK) {
ESP_LOGE(TAG, "ESP-AES ISR initialisation failed"); ESP_LOGE(TAG, "ESP-AES ISR initialisation failed");
ret = -1; ret = -1;
goto cleanup; goto cleanup;
@ -561,7 +565,7 @@ int esp_aes_process_dma_gcm(esp_aes_context *ctx, const unsigned char *input, un
/* Only use interrupt for long AES operations */ /* Only use interrupt for long AES operations */
if (len > AES_DMA_INTR_TRIG_LEN) { if (len > AES_DMA_INTR_TRIG_LEN) {
use_intr = true; use_intr = true;
if (esp_aes_isr_initialise() == ESP_FAIL) { if (esp_aes_isr_initialise() != ESP_OK) {
ESP_LOGE(TAG, "ESP-AES ISR initialisation failed"); ESP_LOGE(TAG, "ESP-AES ISR initialisation failed");
ret = -1; ret = -1;
goto cleanup; goto cleanup;

Wyświetl plik

@ -1,16 +1,8 @@
// Copyright 2020 Espressif Systems (Shanghai) PTE LTD /*
// * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD
// Licensed under the Apache License, Version 2.0 (the "License"); *
// you may not use this file except in compliance with the License. * SPDX-License-Identifier: Apache-2.0
// You may obtain a copy of the License at */
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once #pragma once
@ -43,6 +35,11 @@ esp_err_t esp_aes_dma_start(const lldesc_t *input, const lldesc_t *output);
*/ */
bool esp_aes_dma_done(const lldesc_t *output); bool esp_aes_dma_done(const lldesc_t *output);
/**
* @brief Allocate AES peripheral interrupt handler
*/
void esp_aes_intr_alloc(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

Wyświetl plik

@ -26,6 +26,7 @@
* http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
*/ */
#include "sdkconfig.h"
#include "aes/esp_aes_internal.h" #include "aes/esp_aes_internal.h"
#include "mbedtls/aes.h" #include "mbedtls/aes.h"
#include "hal/aes_hal.h" #include "hal/aes_hal.h"
@ -35,7 +36,7 @@
#include <string.h> #include <string.h>
#include "mbedtls/platform.h" #include "mbedtls/platform.h"
#if SOC_AES_GDMA #if SOC_AES_SUPPORT_DMA
#include "esp_aes_dma_priv.h" #include "esp_aes_dma_priv.h"
#endif #endif
@ -51,9 +52,12 @@ bool valid_key_length(const esp_aes_context *ctx)
} }
void esp_aes_init( esp_aes_context *ctx ) void esp_aes_init(esp_aes_context *ctx)
{ {
bzero( ctx, sizeof( esp_aes_context ) ); bzero(ctx, sizeof(esp_aes_context));
#if SOC_AES_SUPPORT_DMA && CONFIG_MBEDTLS_AES_USE_INTERRUPT
esp_aes_intr_alloc();
#endif
} }
void esp_aes_free( esp_aes_context *ctx ) void esp_aes_free( esp_aes_context *ctx )