This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 2e4eaf69ee0ca3378a93e6c7ed0b721345446172 Author: Eren Terzioglu <eren.terzio...@espressif.com> AuthorDate: Tue May 20 14:45:24 2025 +0200 arch/xtensa: Add arch layer SHA accelerator support for esp32[-s2|-s3] Add arch layer SHA accelerator support for Xtensa based Espressif devices Signed-off-by: Eren Terzioglu <eren.terzio...@espressif.com> --- arch/xtensa/src/common/espressif/Kconfig | 7 + arch/xtensa/src/common/espressif/Make.defs | 7 + arch/xtensa/src/common/espressif/esp_crypto.c | 729 ++++++++++++++++++++++ arch/xtensa/src/common/espressif/esp_sha.c | 866 ++++++++++++++++++++++++++ arch/xtensa/src/common/espressif/esp_sha.h | 360 +++++++++++ arch/xtensa/src/esp32s2/hal.mk | 2 + arch/xtensa/src/esp32s3/hal.mk | 2 + 7 files changed, 1973 insertions(+) diff --git a/arch/xtensa/src/common/espressif/Kconfig b/arch/xtensa/src/common/espressif/Kconfig index d0f9085433d..f1e8906b73b 100644 --- a/arch/xtensa/src/common/espressif/Kconfig +++ b/arch/xtensa/src/common/espressif/Kconfig @@ -61,6 +61,13 @@ config ESPRESSIF_LEDC select PWM select ARCH_HAVE_PWM_MULTICHAN +config ESPRESSIF_SHA_ACCELERATOR + bool "SHA Accelerator" + depends on !ARCH_CHIP_ESP32 + default n + ---help--- + Enable SHA accelerator support. + config ESPRESSIF_I2S bool default n diff --git a/arch/xtensa/src/common/espressif/Make.defs b/arch/xtensa/src/common/espressif/Make.defs index 97165af0731..e18aeb711a1 100644 --- a/arch/xtensa/src/common/espressif/Make.defs +++ b/arch/xtensa/src/common/espressif/Make.defs @@ -84,6 +84,13 @@ ifeq ($(CONFIG_ESPRESSIF_DEDICATED_GPIO),y) CHIP_CSRCS += esp_dedic_gpio.c endif +ifeq ($(CONFIG_ESPRESSIF_SHA_ACCELERATOR),y) +CHIP_CSRCS += esp_sha.c +ifeq ($(CONFIG_CRYPTO_CRYPTODEV_HARDWARE),y) +CHIP_CSRCS += esp_crypto.c +endif +endif + ifeq ($(CONFIG_SYSTEM_NXDIAG_ESPRESSIF_CHIP_WO_TOOL),y) CHIP_CSRCS += esp_nxdiag.c endif diff --git a/arch/xtensa/src/common/espressif/esp_crypto.c b/arch/xtensa/src/common/espressif/esp_crypto.c new file mode 100644 index 00000000000..29624d9f4fc --- /dev/null +++ b/arch/xtensa/src/common/espressif/esp_crypto.c @@ -0,0 +1,729 @@ +/**************************************************************************** + * arch/xtensa/src/common/espressif/esp_crypto.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <errno.h> +#include <stddef.h> +#include <sys/queue.h> + +#include <crypto/cryptodev.h> +#include <crypto/xform.h> +#include <nuttx/kmalloc.h> +#include <nuttx/crypto/crypto.h> + +#include "esp_sha.h" + +/**************************************************************************** + * Private Functions Prototypes + ****************************************************************************/ + +static void sha1_init(void *ctx); +static int sha1_update(void *ctx, const uint8_t *in, size_t len); +static void sha1_final(uint8_t *out, void *ctx); +static void sha256_init(void *ctx); +static int sha256_update(void *ctx, const uint8_t *in, size_t len); +static void sha256_final(uint8_t *out, void *ctx); +static void sha384_init(void *ctx); +static void sha512_init(void *ctx); +static int sha512_update(void *ctx, const uint8_t *in, size_t len); +static void sha512_final(uint8_t *out, void *ctx); +static int esp_freesession(uint64_t tid); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +SLIST_HEAD(esp_crypto_list, esp_crypto_data); +static struct esp_crypto_list *g_esp_sessions = NULL; +static uint32_t g_esp_sesnum = 0; + +const struct auth_hash g_auth_hash_hmac_sha1_esp = +{ + CRYPTO_SHA1_HMAC, "HMAC-SHA1", + 20, 20, 12, sizeof(struct esp_sha1_context_s), + HMAC_SHA1_BLOCK_LEN, + sha1_init, NULL, NULL, + sha1_update, + sha1_final +}; + +const struct auth_hash g_auth_hash_hmac_sha256_esp = +{ + CRYPTO_SHA2_256_HMAC, "HMAC-SHA2-256", + 32, 32, 16, sizeof(struct esp_sha256_context_s), + HMAC_SHA2_256_BLOCK_LEN, + sha256_init, NULL, NULL, + sha256_update, + sha256_final +}; + +const struct auth_hash g_auth_hash_hmac_sha384_esp = +{ + CRYPTO_SHA2_384_HMAC, "HMAC-SHA3-384", + 0, 48, 12, sizeof(struct esp_sha512_context_s), + 0, + sha384_init, NULL, NULL, + sha512_update, + sha512_final +}; + +const struct auth_hash g_auth_hash_hmac_sha512_esp = +{ + CRYPTO_SHA2_512_HMAC, "HMAC-SHA3-512", + 0, 64, 12, sizeof(struct esp_sha512_context_s), + 0, + sha512_init, NULL, NULL, + sha512_update, + sha512_final +}; + +struct esp_crypto_data +{ + int alg; /* Algorithm */ + union + { + struct + { + uint8_t *ictx; + uint8_t *octx; + uint32_t klen; + const struct auth_hash *axf; + } HWCR_AUTH; + } HWCR_UN; + +#define hw_ictx HWCR_UN.HWCR_AUTH.ictx +#define hw_octx HWCR_UN.HWCR_AUTH.octx +#define hw_klen HWCR_UN.HWCR_AUTH.klen +#define hw_axf HWCR_UN.HWCR_AUTH.axf + + SLIST_ENTRY(esp_crypto_data) next; +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: sha1_init + * + * Description: + * Starts a SHA-1 checksum calculation. + * + * Input Parameters: + * ctx - The SHA-1 context to initialize + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void sha1_init(void *ctx) +{ + esp_sha1_starts(ctx); +} + +/**************************************************************************** + * Name: sha1_update + * + * Description: + * Feeds an input buffer into an ongoing SHA-1 checksum calculation. + * + * Input Parameters: + * ctx - The SHA-1 context to use + * in - The buffer holding the input data + * len - The length of the input data in Bytes + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +static int sha1_update(void *ctx, const uint8_t *in, size_t len) +{ + return esp_sha1_update((struct esp_sha1_context_s *)ctx, + (const unsigned char *)in, + (size_t)len); + return OK; +} + +/**************************************************************************** + * Name: sha1_final + * + * Description: + * Finishes the SHA-1 operation, + * and writes the result to the output buffer. + * + * Input Parameters: + * out - The SHA-1 checksum result + * ctx - The SHA-1 context to use + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void sha1_final(uint8_t *out, void *ctx) +{ + esp_sha1_finish((struct esp_sha1_context_s *)ctx, + (unsigned char *)out); +} + +/**************************************************************************** + * Name: sha256_init + * + * Description: + * Initializes a SHA-256 context. + * + * Input Parameters: + * ctx - The SHA-256 context to initialize + * + * Returned Value: + * None. + * + ****************************************************************************/ + +static void sha256_init(void *ctx) +{ + esp_sha256_starts(ctx, false); +} + +/**************************************************************************** + * Name: sha256_update + * + * Description: + * Feeds an input buffer into an ongoing SHA-224 or SHA-256 + * checksum calculation. + * + * Input Parameters: + * ctx - The SHA-256 context to use + * in - The buffer holding the input data + * len - The length of the input data in Bytes + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +static int sha256_update(void *ctx, const uint8_t *in, size_t len) +{ + return esp_sha256_update((struct esp_sha256_context_s *)ctx, + (const unsigned char *)in, + (size_t)len); + return OK; +} + +/**************************************************************************** + * Name: sha256_final + * + * Description: + * Finishes the SHA-224 or SHA-256 operation, and writes the result to + * the output buffer. + * + * Input Parameters: + * out - The SHA-256 checksum result + * ctx - The SHA-256 context to use + * + * Returned Value: + * None. + * + ****************************************************************************/ + +static void sha256_final(uint8_t *out, void *ctx) +{ + esp_sha256_finish((struct esp_sha256_context_s *)ctx, + (unsigned char *)out); +} + +/**************************************************************************** + * Name: sha384_init + * + * Description: + * Initializes a SHA-384 context. + * + * Input Parameters: + * ctx - The SHA-512 context to initialize + * + * Returned Value: + * None. + * + ****************************************************************************/ + +static void sha384_init(void *ctx) +{ + esp_sha512_starts(ctx, true); +} + +/**************************************************************************** + * Name: sha384_init + * + * Description: + * Initializes a SHA-512 context. + * + * Input Parameters: + * ctx - The SHA-512 context to initialize + * + * Returned Value: + * None. + * + ****************************************************************************/ + +static void sha512_init(void *ctx) +{ + esp_sha512_starts(ctx, false); +} + +/**************************************************************************** + * Name: sha512_update + * + * Description: + * Feeds an input buffer into an ongoing SHA-384 or SHA-512 + * checksum calculation. + * + * Input Parameters: + * ctx - The SHA-256 context to use + * in - The buffer holding the input data + * len - The length of the input data in Bytes + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +static int sha512_update(void *ctx, const uint8_t *in, size_t len) +{ + return esp_sha512_update((struct esp_sha512_context_s *)ctx, + (const unsigned char *)in, + (size_t)len); + return OK; +} + +/**************************************************************************** + * Name: sha256_final + * + * Description: + * Finishes the SHA-384 or SHA-512 operation, and writes the result to + * the output buffer. + * + * Input Parameters: + * out - The SHA-256 checksum result + * ctx - The SHA-256 context to use + * + * Returned Value: + * None. + * + ****************************************************************************/ + +static void sha512_final(uint8_t *out, void *ctx) +{ + esp_sha512_finish((struct esp_sha512_context_s *)ctx, + (unsigned char *)out); +} + +/**************************************************************************** + * Name: authcompute + * + * Description: + * Calculate the hash. + * + * Input Parameters: + * crp - Pointer of cryptop struct + * crd - Pointer of description struct + * data - Internal struct for crypt + * buf - Buffer to compute + * + * Returned Value: + * OK on success; Negated errno on failure. + * + ****************************************************************************/ + +static int authcompute(struct cryptop *crp, struct cryptodesc *crd, + struct esp_crypto_data *data, + caddr_t buf) +{ + unsigned char aalg[AALG_MAX_RESULT_LEN]; + const struct auth_hash *axf; + int err = 0; + + if (data->hw_ictx == 0) + { + return -EINVAL; + } + + axf = data->hw_axf; + err = axf->update(data->hw_ictx, (uint8_t *)buf, crd->crd_len); + if (err) + { + return err; + } + + if (crd->crd_flags & CRD_F_ESN) + { + axf->update(data->hw_ictx, crd->crd_esn, 4); + } + + switch (data->alg) + { + case CRYPTO_SHA1_HMAC: + case CRYPTO_SHA2_256_HMAC: + if (data->hw_octx == NULL) + { + return -EINVAL; + } + + axf->final(aalg, data->hw_ictx); + axf->update(data->hw_octx, aalg, axf->hashsize); + axf->final(aalg, data->hw_octx); + + break; + } + + /* Inject the authentication data */ + + bcopy(aalg, crp->crp_mac, axf->hashsize); + return OK; +} + +/**************************************************************************** + * Name: esp_newsession + * + * Description: + * Create new session for crypto. + * + * Input Parameters: + * sid - Session id + * cri - Pointer of cryptop struct + * + * Returned Value: + * OK on success; Negated errno on failure. + * + ****************************************************************************/ + +static int esp_newsession(uint32_t *sid, struct cryptoini *cri) +{ + struct esp_crypto_list *session; + struct esp_crypto_data *prev = NULL; + struct esp_crypto_data *data; + const struct auth_hash *axf; + int i; + int k; + + if (sid == NULL || cri == NULL) + { + return -EINVAL; + } + + for (i = 0; i < g_esp_sesnum; i++) + { + if (SLIST_EMPTY(&g_esp_sessions[i])) + { + break; + } + } + + if (i >= g_esp_sesnum) + { + if (g_esp_sessions == NULL) + { + g_esp_sesnum = 1; + } + else + { + g_esp_sesnum *= 2; + } + + session = kmm_calloc(g_esp_sesnum, + sizeof(struct esp_crypto_list)); + if (session == NULL) + { + g_esp_sesnum /= 2; + return -ENOBUFS; + } + + if (g_esp_sessions != NULL) + { + bcopy(g_esp_sessions, session, (g_esp_sesnum / 2) * + sizeof(struct esp_crypto_list)); + kmm_free(g_esp_sessions); + } + + g_esp_sessions = session; + } + + session = &g_esp_sessions[i]; + *sid = i; + + while (cri) + { + data = kmm_malloc(sizeof(struct esp_crypto_data)); + if (data == NULL) + { + esp_freesession(i); + return -ENOBUFS; + } + + switch (cri->cri_alg) + { + case CRYPTO_SHA1_HMAC: + axf = &g_auth_hash_hmac_sha1_esp; + goto common; + case CRYPTO_SHA2_256_HMAC: + axf = &g_auth_hash_hmac_sha256_esp; + goto common; + case CRYPTO_SHA2_384_HMAC: + axf = &g_auth_hash_hmac_sha384_esp; + goto common; + case CRYPTO_SHA2_512_HMAC: + axf = &g_auth_hash_hmac_sha512_esp; + goto common; + common: + data->hw_ictx = kmm_malloc(axf->ctxsize); + if (data->hw_ictx == NULL) + { + kmm_free(data); + return -ENOBUFS; + } + + data->hw_octx = kmm_malloc(axf->ctxsize); + if (data->hw_octx == NULL) + { + kmm_free(data->hw_ictx); + kmm_free(data); + return -ENOBUFS; + } + + for (k = 0; k < cri->cri_klen / 8; k++) + { + cri->cri_key[k] ^= HMAC_IPAD_VAL; + } + + axf->init(data->hw_ictx); + axf->update(data->hw_ictx, (uint8_t *)cri->cri_key, + cri->cri_klen / 8); + axf->update(data->hw_ictx, hmac_ipad_buffer, + axf->blocksize - (cri->cri_klen / 8)); + + for (k = 0; k < cri->cri_klen / 8; k++) + { + cri->cri_key[k] ^= (HMAC_IPAD_VAL ^ HMAC_OPAD_VAL); + } + + axf->init(data->hw_octx); + axf->update(data->hw_octx, (uint8_t *)cri->cri_key, + cri->cri_klen / 8); + axf->update(data->hw_octx, hmac_opad_buffer, + axf->blocksize - (cri->cri_klen / 8)); + + for (k = 0; k < cri->cri_klen / 8; k++) + { + cri->cri_key[k] ^= HMAC_OPAD_VAL; + } + + data->hw_axf = axf; + break; + default: + + esp_freesession(i); + kmm_free(data); + return -EINVAL; + } + + if (prev == NULL) + { + SLIST_INSERT_HEAD(session, data, next); + } + else + { + SLIST_INSERT_AFTER(prev, data, next); + } + + data->alg = cri->cri_alg; + cri = cri->cri_next; + prev = data; + } + + return OK; +} + +/**************************************************************************** + * Name: esp_freesession + * + * Description: + * Free session. + * + * Input Parameters: + * tid - Session id + * + * Returned Value: + * OK on success; Negated errno on failure. + * + ****************************************************************************/ + +static int esp_freesession(uint64_t tid) +{ + struct esp_crypto_list *session; + struct esp_crypto_data *data; + const struct auth_hash *axf; + + uint32_t sid = ((uint32_t)tid) & 0xffffffff; + + if (sid > g_esp_sesnum || SLIST_EMPTY(&g_esp_sessions[sid])) + { + return -EINVAL; + } + + session = &g_esp_sessions[sid]; + + while (!SLIST_EMPTY(session)) + { + data = SLIST_FIRST(session); + switch (data->alg) + { + case CRYPTO_SHA1_HMAC: + case CRYPTO_SHA2_256_HMAC: + case CRYPTO_SHA2_384_HMAC: + case CRYPTO_SHA2_512_HMAC: + axf = data->hw_axf; + if (data->hw_ictx) + { + explicit_bzero(data->hw_ictx, axf->ctxsize); + kmm_free(data->hw_ictx); + } + + if (data->hw_octx) + { + explicit_bzero(data->hw_octx, axf->ctxsize); + kmm_free(data->hw_octx); + } + + break; + } + + SLIST_REMOVE_HEAD(session, next); + kmm_free(data); + } + + return OK; +} + +/**************************************************************************** + * Name: esp_process + * + * Description: + * Process session to use hardware algorithm. + * + * Input Parameters: + * crp - Pointer of cryptop struct + * + * Returned Value: + * OK on success; Negated errno on failure. + * + ****************************************************************************/ + +static int esp_process(struct cryptop *crp) +{ + struct cryptodesc *crd; + struct esp_crypto_list *session; + struct esp_crypto_data *data; + uint32_t lid; + int err = 0; + + lid = crp->crp_sid & 0xffffffff; + + /* Go through crypto descriptors, processing as we go */ + + session = &g_esp_sessions[lid]; + for (crd = crp->crp_desc; crd; crd = crd->crd_next) + { + SLIST_FOREACH(data, session, next) + { + if (data->alg == crd->crd_alg) + { + break; + } + } + + if (data == NULL) + { + crp->crp_etype = EINVAL; + return -EINVAL; + } + + switch (data->alg) + { + case CRYPTO_SHA1_HMAC: + case CRYPTO_SHA2_256_HMAC: + case CRYPTO_SHA2_384_HMAC: + case CRYPTO_SHA2_512_HMAC: + if ((crp->crp_etype = authcompute(crp, crd, data, + crp->crp_buf)) != 0) + { + return crp->crp_etype; + } + + break; + default: + return -EINVAL; + } + } + + return OK; +} + +/**************************************************************************** + * Name: hwcr_init + * + * Description: + * Register the hardware crypto driver. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void hwcr_init(void) +{ + int hwcr_id; + int algs[CRYPTO_ALGORITHM_MAX + 1]; + + hwcr_id = crypto_get_driverid(0); + DEBUGASSERT(hwcr_id >= 0); + + memset(algs, 0, sizeof(algs)); + + algs[CRYPTO_SHA1_HMAC] = CRYPTO_ALG_FLAG_SUPPORTED; + algs[CRYPTO_SHA2_256_HMAC] = CRYPTO_ALG_FLAG_SUPPORTED; + algs[CRYPTO_SHA2_384_HMAC] = CRYPTO_ALG_FLAG_SUPPORTED; + algs[CRYPTO_SHA2_512_HMAC] = CRYPTO_ALG_FLAG_SUPPORTED; + + esp_sha_init(); + crypto_register(hwcr_id, algs, esp_newsession, + esp_freesession, esp_process); +} diff --git a/arch/xtensa/src/common/espressif/esp_sha.c b/arch/xtensa/src/common/espressif/esp_sha.c new file mode 100644 index 00000000000..d9e1274b906 --- /dev/null +++ b/arch/xtensa/src/common/espressif/esp_sha.c @@ -0,0 +1,866 @@ +/**************************************************************************** + * arch/xtensa/src/common/espressif/esp_sha.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#ifdef CONFIG_ESPRESSIF_SHA_ACCELERATOR + +#include <stdint.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <inttypes.h> +#include <debug.h> +#include <nuttx/mutex.h> + +#include "esp_sha.h" + +#include "esp_private/periph_ctrl.h" +#include "soc/periph_defs.h" +#include "hal/sha_hal.h" +#include "soc/soc_caps.h" +#include "rom/cache.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#if CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG +# error "Parallel engine feature is not supported." +#endif + +#define PUT_UINT32_BE(n,b,i) \ +{ \ + (b)[(i)] = (unsigned char) ((n) >> 24); \ + (b)[(i) + 1] = (unsigned char) ((n) >> 16); \ + (b)[(i) + 2] = (unsigned char) ((n) >> 8); \ + (b)[(i) + 3] = (unsigned char) ((n)); \ +} + +#define PUT_UINT64_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \ + (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 7] = (unsigned char) ( (n) ); \ +} + +#define SHA1_BLK_SIZE (20) +#define SHA2_BLK_SIZE (32) +#define SHA3_BLK_SIZE (64) + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static bool g_sha_inited; +static mutex_t g_sha_lock = NXMUTEX_INITIALIZER; +static const unsigned char esp_sha_padding[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static const unsigned char sha512_padding[128] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: esp_sha_hash_block + * + * Description: + * Performs SHA on multiple blocks at a time. + * + * Input Parameters: + * type - Type of SHA + * first_block - Pointer of the ctx struct about is block first + * state - Pointer of the ctx struct about state + * data - Input message to be hashed on single block + * len - Length of the input message on single block + * buf - Input message to be hashed on multiple blocks + * buf_len - Length of the input message on multiple blocks + * + * Returned Value: + * OK is returned on success. + * + ****************************************************************************/ + +static int esp_sha_hash_block(enum esp_sha_type_e type, + bool *first_block, void *state, + const uint8_t *data, size_t len, + uint8_t *buf, size_t buf_len) +{ + uint32_t *data_words = NULL; + size_t blk_len = 0; + size_t blk_word_len = 0; + int num_block = 0; + int i; + int j; + + if (type < ESP_SHA3_384) + { + blk_len = 64; + } + else + { + blk_len = 128; + } + + blk_word_len = blk_len / 4; + num_block = len / blk_len; + + if (buf_len != 0) + { + sha_hal_hash_block(type, buf, blk_word_len, (*first_block)); + (*first_block) = false; + } + + for (j = 0; j < num_block; j++) + { + data_words = (uint32_t *)(data + blk_len * j); + sha_hal_hash_block(type, data_words, blk_word_len, (*first_block)); + (*first_block) = false; + } + + sha_hal_read_digest(type, state); + + return OK; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: esp_sha1_init + * + * Description: + * Initializes a SHA-1 context. + * + * Input Parameters: + * ctx - The SHA-1 context to initialize + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void esp_sha1_init(struct esp_sha1_context_s *ctx) +{ + memset(ctx, 0, sizeof(struct esp_sha1_context_s)); +} + +/**************************************************************************** + * Name: esp_sha1_starts + * + * Description: + * Starts a SHA-1 checksum calculation. + * + * Input Parameters: + * ctx - The SHA-1 context to initialize + * + * Returned Value: + * OK is returned on success. + * + ****************************************************************************/ + +int esp_sha1_starts(struct esp_sha1_context_s *ctx) +{ + memset(ctx, 0, sizeof(struct esp_sha1_context_s)); + ctx->mode = ESP_SHA1_1; + + return OK; +} + +/**************************************************************************** + * Name: esp_sha1_update + * + * Description: + * Feeds an input buffer into an ongoing SHA-1 checksum calculation. + * + * Input Parameters: + * ctx - The SHA-1 context to use + * input - The buffer holding the input data + * ilen - The length of the input data in Bytes + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha1_update(struct esp_sha1_context_s *ctx, + const unsigned char *input, + size_t ilen) +{ + int ret; + size_t fill; + uint32_t left; + uint32_t len; + uint32_t local_len = 0; + int i; + + if (!ilen || (input == NULL)) + { + return OK; + } + + left = ctx->total[0] & 0x3f; + fill = 64 - left; + + ctx->total[0] += ilen; + ctx->total[0] &= UINT32_MAX; + + if (ctx->total[0] < ilen) + { + ctx->total[1]++; + } + + if (left && ilen >= fill) + { + memcpy((void *) (ctx->buffer + left), input, fill); + + input += fill; + ilen -= fill; + left = 0; + local_len = 64; + } + + len = (ilen / 64) * 64; + if (len || local_len) + { + ret = nxmutex_lock(&g_sha_lock); + if (ret < 0) + { + return ret; + } + + if (ctx->sha_state == ESP_SHA_STATE_INIT) + { + ctx->first_block = true; + + ctx->sha_state = ESP_SHA_STATE_IN_PROCESS; + } + else if (ctx->sha_state == ESP_SHA_STATE_IN_PROCESS) + { + ctx->first_block = false; + sha_hal_write_digest(ctx->mode, ctx->state); + } + + ret = esp_sha_hash_block(ctx->mode, &ctx->first_block, ctx->state, + input, len, ctx->buffer, local_len); + ret |= nxmutex_unlock(&g_sha_lock); + + if (ret != 0) + { + return ret; + } + } + + if (ilen > 0) + { + memcpy((void *) (ctx->buffer + left), input + len, ilen - len); + } + + return OK; +} + +/**************************************************************************** + * Name: esp_sha1_finish + * + * Description: + * Finishes the SHA-1 operation, + * and writes the result to the output buffer. + * + * Input Parameters: + * ctx - The SHA-1 context to use + * output - The SHA-1 checksum result + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha1_finish(struct esp_sha1_context_s *ctx, + unsigned char output[20]) +{ + int ret; + uint32_t last; + uint32_t padn; + uint32_t high; + uint32_t low; + unsigned char msglen[8]; + + high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + + PUT_UINT32_BE(high, msglen, 0); + PUT_UINT32_BE(low, msglen, 4); + + last = ctx->total[0] & 0x3f; + padn = (last < 56) ? (56 - last) : (120 - last); + + ret = esp_sha1_update(ctx, esp_sha_padding, padn); + if (ret != 0) + { + return ret; + } + + ret = esp_sha1_update(ctx, msglen, 8); + if (ret != 0) + { + return ret; + } + + memcpy(output, ctx->state, SHA1_BLK_SIZE); + + return ret; +} + +/**************************************************************************** + * Name: esp_sha1_free + * + * Description: + * Clears a SHA-1 context. + * + * Input Parameters: + * ctx - The SHA-1 context to clear + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void esp_sha1_free(struct esp_sha1_context_s *ctx) +{ + if (ctx == NULL) + { + return; + } + + memset(ctx, 0, sizeof(struct esp_sha1_context_s)); +} + +/**************************************************************************** + * Name: esp_sha256_init + * + * Description: + * Initializes a SHA-256 context. + * + * Input Parameters: + * ctx - The SHA-256 context to initialize + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void esp_sha256_init(struct esp_sha256_context_s *ctx) +{ + memset(ctx, 0, sizeof(struct esp_sha256_context_s)); +} + +/**************************************************************************** + * Name: esp_sha256_starts + * + * Description: + * Starts a SHA-224 or SHA-256 checksum calculation. + * + * Input Parameters: + * ctx - The SHA-256 context to initialize + * is224 - Determines which function to use + * + * Returned Value: + * OK is returned on success. + * + ****************************************************************************/ + +int esp_sha256_starts(struct esp_sha256_context_s *ctx, bool is224) +{ + memset(ctx, 0, sizeof(struct esp_sha256_context_s)); + + if (is224) + { + ctx->mode = ESP_SHA2_224; + } + else + { + ctx->mode = ESP_SHA2_256; + } + + return OK; +} + +/**************************************************************************** + * Name: esp_sha256_update + * + * Description: + * Feeds an input buffer into an ongoing SHA-224 or SHA-256 + * checksum calculation. + * + * Input Parameters: + * ctx - The SHA-256 context to use + * input - The buffer holding the input data + * ilen - The length of the input data in Bytes + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha256_update(struct esp_sha256_context_s *ctx, + const unsigned char *input, + size_t ilen) +{ + int ret = 0; + size_t fill; + uint32_t left; + uint32_t len; + uint32_t local_len = 0; + int i; + + if (ilen == 0) + { + return OK; + } + + left = ctx->total[0] & 0x3f; + fill = 64 - left; + + ctx->total[0] += ilen; + ctx->total[0] &= UINT32_MAX; + + if (ctx->total[0] < ilen) + { + ctx->total[1]++; + } + + /* Check if any data pending from previous call to this API */ + + if (left && ilen >= fill) + { + memcpy((void *) (ctx->buffer + left), input, fill); + + input += fill; + ilen -= fill; + left = 0; + local_len = 64; + } + + len = (ilen / 64) * 64; + + if (len || local_len) + { + ret = nxmutex_lock(&g_sha_lock); + if (ret < 0) + { + return ret; + } + + if (ctx->sha_state == ESP_SHA_STATE_INIT) + { + ctx->first_block = true; + ctx->sha_state = ESP_SHA_STATE_IN_PROCESS; + } + else if (ctx->sha_state == ESP_SHA_STATE_IN_PROCESS) + { + ctx->first_block = false; + sha_hal_write_digest(ctx->mode, ctx->state); + } + + ret = esp_sha_hash_block(ctx->mode, &ctx->first_block, ctx->state, + input, len, ctx->buffer, local_len); + ret |= nxmutex_unlock(&g_sha_lock); + + if (ret != 0) + { + return ret; + } + } + + if (ilen > 0) + { + memcpy((void *) (ctx->buffer + left), input + len, ilen - len); + } + + return OK; +} + +/**************************************************************************** + * Name: esp_sha256_finish + * + * Description: + * Finishes the SHA-224 or SHA-256 operation, and writes the result to + * the output buffer. + * + * Input Parameters: + * ctx - The SHA-256 context to use + * output - The SHA-256 checksum result + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha256_finish(struct esp_sha256_context_s *ctx, + unsigned char output[32]) +{ + int ret; + uint32_t last; + uint32_t padn; + uint32_t high; + uint64_t low; + unsigned char msglen[8]; + + high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + + PUT_UINT32_BE(high, msglen, 0); + PUT_UINT32_BE(low, msglen, 4); + + last = ctx->total[0] & 0x3f; + padn = (last < 56) ? (56 - last) : (120 - last); + + ret = esp_sha256_update(ctx, esp_sha_padding, padn); + if (ret != 0) + { + return ret; + } + + ret = esp_sha256_update(ctx, msglen, 8); + if (ret != 0) + { + return ret; + } + + memcpy(output, ctx->state, SHA2_BLK_SIZE); + + return ret; +} + +/**************************************************************************** + * Name: esp_sha256_free + * + * Description: + * Clears a SHA-256 context. + * + * Input Parameters: + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void esp_sha256_free(struct esp_sha256_context_s *ctx) +{ + if (ctx == NULL) + { + return; + } + + memset(ctx, 0, sizeof(struct esp_sha256_context_s)); +} + +/**************************************************************************** + * Name: esp_sha512_init + * + * Description: + * Initializes a SHA-512 context. + * + * Input Parameters: + * ctx - The SHA-512 context to initialize + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void esp_sha512_init(struct esp_sha512_context_s *ctx) +{ + memset(ctx, 0, sizeof(struct esp_sha512_context_s)); +} + +/**************************************************************************** + * Name: esp_sha512_starts + * + * Description: + * Starts a SHA-384 or SHA-512 checksum calculation. + * + * Input Parameters: + * ctx - The SHA-512 context to initialize + * is384 - Determines which function to use + * + * Returned Value: + * OK is returned on success. + * + ****************************************************************************/ + +int esp_sha512_starts(struct esp_sha512_context_s *ctx, bool is384) +{ + memset(ctx, 0, sizeof(struct esp_sha512_context_s)); + + if (is384) + { + ctx->mode = ESP_SHA3_384; + } + else + { + ctx->mode = ESP_SHA3_512; + } + + return OK; +} + +/**************************************************************************** + * Name: esp_sha512_update + * + * Description: + * Feeds an input buffer into an ongoing SHA-384 or SHA-512 + * checksum calculation. + * + * Input Parameters: + * ctx - The SHA-512 context to use + * input - The buffer holding the input data + * ilen - The length of the input data in Bytes + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha512_update(struct esp_sha512_context_s *ctx, + const unsigned char *input, + size_t ilen) +{ + int ret = 0; + size_t fill; + uint32_t left; + uint32_t len; + uint32_t local_len = 0; + int i; + + if (ilen == 0) + { + return OK; + } + + left = ctx->total[0] & 0x7f; + fill = 128 - left; + + ctx->total[0] += ilen; + + if (ctx->total[0] < ilen) + { + ctx->total[1]++; + } + + /* Check if any data pending from previous call to this API */ + + if (left && ilen >= fill) + { + memcpy((void *) (ctx->buffer + left), input, fill); + + input += fill; + ilen -= fill; + left = 0; + local_len = 128; + } + + len = (ilen / 128) * 128; + + if (len || local_len) + { + ret = nxmutex_lock(&g_sha_lock); + if (ret < 0) + { + return ret; + } + + if (ctx->sha_state == ESP_SHA_STATE_INIT) + { + ctx->first_block = true; + ctx->sha_state = ESP_SHA_STATE_IN_PROCESS; + } + else if (ctx->sha_state == ESP_SHA_STATE_IN_PROCESS) + { + ctx->first_block = false; + sha_hal_write_digest(ctx->mode, ctx->state); + } + + ret = esp_sha_hash_block(ctx->mode, &ctx->first_block, ctx->state, + input, len, ctx->buffer, local_len); + ret |= nxmutex_unlock(&g_sha_lock); + + if (ret != 0) + { + return ret; + } + } + + if (ilen > 0) + { + memcpy((void *) (ctx->buffer + left), input + len, ilen - len); + } + + return OK; +} + +/**************************************************************************** + * Name: esp_sha512_finish + * + * Description: + * Finishes the SHA-384 or SHA-512 operation, and writes the result to + * the output buffer. + * + * Input Parameters: + * ctx - The SHA-512 context to use + * output - The SHA-512 checksum result + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha512_finish(struct esp_sha512_context_s *ctx, + unsigned char output[64]) +{ + int ret; + uint32_t last; + uint32_t padn; + uint64_t high; + uint64_t low; + unsigned char msglen[16]; + + high = (ctx->total[0] >> 61) | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + + PUT_UINT64_BE(high, msglen, 0); + PUT_UINT64_BE(low, msglen, 8); + + last = ctx->total[0] & 0x7f; + padn = (last < 112) ? (112 - last) : (240 - last); + + ret = esp_sha512_update(ctx, sha512_padding, padn); + if (ret != 0) + { + return ret; + } + + ret = esp_sha512_update(ctx, msglen, 16); + if (ret != 0) + { + return ret; + } + + if (ctx->mode == ESP_SHA3_384) + { + memcpy(output, ctx->state, 48); + } + else + { + memcpy(output, ctx->state, 64); + } + + return ret; +} + +/**************************************************************************** + * Name: esp_sha512_free + * + * Description: + * Clears a SHA-512 context. + * + * Input Parameters: + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void esp_sha512_free(struct esp_sha512_context_s *ctx) +{ + if (ctx == NULL) + { + return; + } + + memset(ctx, 0, sizeof(struct esp_sha512_context_s)); +} + +/**************************************************************************** + * Name: esp_sha_init + * + * Description: + * Initialize ESP device SHA hardware. + * + * Input Parameters: + * None + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha_init(void) +{ + if (!g_sha_inited) + { + periph_module_enable(PERIPH_SHA_MODULE); + g_sha_inited = true; + } + else + { + return -EBUSY; + } + + return OK; +} + +#endif diff --git a/arch/xtensa/src/common/espressif/esp_sha.h b/arch/xtensa/src/common/espressif/esp_sha.h new file mode 100644 index 00000000000..f45c6c66ea9 --- /dev/null +++ b/arch/xtensa/src/common/espressif/esp_sha.h @@ -0,0 +1,360 @@ +/**************************************************************************** + * arch/xtensa/src/common/espressif/esp_sha.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#ifndef __ARCH_XTENSA_SRC_COMMON_ESPRESSIF_ESP_SHA_H +#define __ARCH_XTENSA_SRC_COMMON_ESPRESSIF_ESP_SHA_H + +#include <nuttx/config.h> +#include <stdint.h> + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +enum esp_sha_type_e +{ + ESP_SHA1_1 = 0, + ESP_SHA2_224, + ESP_SHA2_256, + ESP_SHA3_384, + ESP_SHA3_512, + ESP_SHA_TYPE_MAX +}; + +enum esp_sha_state_e +{ + ESP_SHA_STATE_INIT, + ESP_SHA_STATE_IN_PROCESS +}; + +/* SHA-1 context structure */ + +struct esp_sha1_context_s +{ + uint32_t total[2]; /* number of bytes processed */ + uint32_t state[5]; /* intermediate digest state */ + unsigned char buffer[64]; /* data block being processed */ + bool first_block; /* if first then true, else false */ + enum esp_sha_type_e mode; + enum esp_sha_state_e sha_state; +}; + +/* SHA-256 context structure */ + +struct esp_sha256_context_s +{ + uint32_t total[2]; /* number of bytes processed */ + uint32_t state[8]; /* intermediate digest state */ + unsigned char buffer[64]; /* data block being processed */ + bool first_block; /* if first then true, else false */ + enum esp_sha_type_e mode; + enum esp_sha_state_e sha_state; +}; + +/* SHA-512 context structure */ + +struct esp_sha512_context_s +{ + uint64_t total[2]; /* number of bytes processed */ + uint64_t state[8]; /* intermediate digest state */ + unsigned char buffer[128]; /* data block being processed */ + bool first_block; /* if first then true, else false */ + enum esp_sha_type_e mode; + enum esp_sha_state_e sha_state; +}; + +/**************************************************************************** + * Name: esp_sha_init + * + * Description: + * Initialize ESP32-C3 SHA hardware. + * + * Input Parameters: + * None + * + * Returned Value: + * OK is returned on success. Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha_init(void); + +/**************************************************************************** + * Name: esp_sha1_init + * + * Description: + * Initializes a SHA-1 context. + * + * Input Parameters: + * ctx - The SHA-1 context to initialize + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void esp_sha1_init(struct esp_sha1_context_s *ctx); + +/**************************************************************************** + * Name: esp_sha1_starts + * + * Description: + * Starts a SHA-1 checksum calculation. + * + * Input Parameters: + * ctx - The SHA-1 context to initialize + * + * Returned Value: + * OK is returned on success. + * + ****************************************************************************/ + +int esp_sha1_starts(struct esp_sha1_context_s *ctx); + +/**************************************************************************** + * Name: esp_sha1_update + * + * Description: + * Feeds an input buffer into an ongoing SHA-1 checksum calculation. + * + * Input Parameters: + * ctx - The SHA-1 context to use + * input - The buffer holding the input data + * ilen - The length of the input data in Bytes + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha1_update(struct esp_sha1_context_s *ctx, + const unsigned char *input, + size_t ilen); + +/**************************************************************************** + * Name: esp_sha1_finish + * + * Description: + * Finishes the SHA-1 operation, + * and writes the result to the output buffer. + * + * Input Parameters: + * ctx - The SHA-1 context to use + * output - The SHA-1 checksum result + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha1_finish(struct esp_sha1_context_s *ctx, + unsigned char output[20]); + +/**************************************************************************** + * Name: esp_sha256_init + * + * Description: + * Initializes a SHA-256 context. + * + * Input Parameters: + * ctx - The SHA-256 context to initialize + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void esp_sha256_init(struct esp_sha256_context_s *ctx); + +/**************************************************************************** + * Name: esp_sha256_starts + * + * Description: + * Starts a SHA-224 or SHA-256 checksum calculation. + * + * Input Parameters: + * ctx - The SHA-256 context to initialize + * is224 - Determines which function to use + * + * Returned Value: + * OK is returned on success. + * + ****************************************************************************/ + +int esp_sha256_starts(struct esp_sha256_context_s *ctx, bool is224); + +/**************************************************************************** + * Name: esp_sha256_update + * + * Description: + * Feeds an input buffer into an ongoing SHA-224 or SHA-256 + * checksum calculation. + * + * Input Parameters: + * ctx - The SHA-256 context to use + * input - The buffer holding the input data + * ilen - The length of the input data in Bytes + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha256_update(struct esp_sha256_context_s *ctx, + const unsigned char *input, + size_t ilen); + +/**************************************************************************** + * Name: esp_sha256_finish + * + * Description: + * Finishes the SHA-224 or SHA-256 operation, and writes the result to + * the output buffer. + * + * Input Parameters: + * ctx - The SHA-256 context to use + * output - The SHA-256 checksum result + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha256_finish(struct esp_sha256_context_s *ctx, + unsigned char output[32]); + +/**************************************************************************** + * Name: esp_sha512_init + * + * Description: + * Initializes a SHA-512 context. + * + * Input Parameters: + * ctx - The SHA-512 context to initialize + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void esp_sha512_init(struct esp_sha512_context_s *ctx); + +/**************************************************************************** + * Name: esp_sha512_starts + * + * Description: + * Starts a SHA-384 or SHA-512 checksum calculation. + * + * Input Parameters: + * ctx - The SHA-512 context to initialize + * is384 - Determines which function to use + * + * Returned Value: + * OK is returned on success. + * + ****************************************************************************/ + +int esp_sha512_starts(struct esp_sha512_context_s *ctx, bool is384); + +/**************************************************************************** + * Name: esp_sha512_update + * + * Description: + * Feeds an input buffer into an ongoing SHA-384 or SHA-512 + * checksum calculation. + * + * Input Parameters: + * ctx - The SHA-512 context to use + * input - The buffer holding the input data + * ilen - The length of the input data in Bytes + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha512_update(struct esp_sha512_context_s *ctx, + const unsigned char *input, + size_t ilen); + +/**************************************************************************** + * Name: esp_sha512_finish + * + * Description: + * Finishes the SHA-384 or SHA-512 operation, and writes the result to + * the output buffer. + * + * Input Parameters: + * ctx - The SHA-512 context to use + * output - The SHA-512 checksum result + * + * Returned Value: + * OK is returned on success. + * Otherwise, a negated errno value is returned. + * + ****************************************************************************/ + +int esp_sha512_finish(struct esp_sha512_context_s *ctx, + unsigned char output[64]); + +/**************************************************************************** + * Name: esp_sha512_free + * + * Description: + * Clears a SHA-512 context. + * + * Input Parameters: + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void esp_sha512_free(struct esp_sha512_context_s *ctx); + +#ifdef __cplusplus +} +#endif +#undef EXTERN + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_XTENSA_SRC_COMMON_ESPRESSIF_ESP_SHA_H */ diff --git a/arch/xtensa/src/esp32s2/hal.mk b/arch/xtensa/src/esp32s2/hal.mk index e8dcc49e65f..695b11e066d 100644 --- a/arch/xtensa/src/esp32s2/hal.mk +++ b/arch/xtensa/src/esp32s2/hal.mk @@ -158,9 +158,11 @@ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)rmt_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)sdm_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)i2s_hal.c +CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)sha_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)timer_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)uart_hal_iram.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)uart_hal.c +CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)soc$(DELIM)dport_access_common.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)soc$(DELIM)$(CHIP_SERIES)$(DELIM)adc_periph.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)soc$(DELIM)$(CHIP_SERIES)$(DELIM)dedic_gpio_periph.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)soc$(DELIM)$(CHIP_SERIES)$(DELIM)gpio_periph.c diff --git a/arch/xtensa/src/esp32s3/hal.mk b/arch/xtensa/src/esp32s3/hal.mk index 2b461e3e9f5..bf5be01d755 100644 --- a/arch/xtensa/src/esp32s3/hal.mk +++ b/arch/xtensa/src/esp32s3/hal.mk @@ -148,6 +148,7 @@ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)rmt_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)sdm_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)i2s_hal.c +CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)sha_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)mcpwm_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)timer_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)cache_hal.c @@ -165,6 +166,7 @@ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)log$ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)log$(DELIM)src$(DELIM)noos$(DELIM)log_timestamp.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)log$(DELIM)src$(DELIM)os$(DELIM)log_write.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)mbedtls$(DELIM)port$(DELIM)sha$(DELIM)core$(DELIM)esp_sha256.c +CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)soc$(DELIM)dport_access_common.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)soc$(DELIM)$(CHIP_SERIES)$(DELIM)dedic_gpio_periph.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)soc$(DELIM)$(CHIP_SERIES)$(DELIM)gdma_periph.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)soc$(DELIM)$(CHIP_SERIES)$(DELIM)adc_periph.c