1 /* 2 * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #include <sys/lock.h> 8 9 #include "esp_crypto_lock.h" 10 11 /* Lock overview: 12 SHA: peripheral independent, but DMA is shared with AES 13 AES: peripheral independent, but DMA is shared with SHA 14 MPI/RSA: independent 15 ECC: independent 16 HMAC: needs SHA 17 DS: needs HMAC (which needs SHA), AES and MPI 18 ECDSA: needs ECC and MPI 19 */ 20 21 /* Lock for DS peripheral */ 22 static _lock_t s_crypto_ds_lock; 23 24 /* Lock for HMAC peripheral */ 25 static _lock_t s_crypto_hmac_lock; 26 27 /* Lock for the MPI/RSA peripheral, also used by the DS peripheral */ 28 static _lock_t s_crypto_mpi_lock; 29 30 /* Single lock for SHA and AES, sharing a reserved GDMA channel */ 31 static _lock_t s_crypto_sha_aes_lock; 32 33 /* Lock for ECC peripheral */ 34 static _lock_t s_crypto_ecc_lock; 35 36 /* Lock for ECDSA peripheral */ 37 static _lock_t s_crypto_ecdsa_lock; 38 esp_crypto_hmac_lock_acquire(void)39void esp_crypto_hmac_lock_acquire(void) 40 { 41 _lock_acquire(&s_crypto_hmac_lock); 42 esp_crypto_sha_aes_lock_acquire(); 43 } 44 esp_crypto_hmac_lock_release(void)45void esp_crypto_hmac_lock_release(void) 46 { 47 esp_crypto_sha_aes_lock_release(); 48 _lock_release(&s_crypto_hmac_lock); 49 } 50 esp_crypto_ds_lock_acquire(void)51void esp_crypto_ds_lock_acquire(void) 52 { 53 _lock_acquire(&s_crypto_ds_lock); 54 esp_crypto_hmac_lock_acquire(); 55 esp_crypto_mpi_lock_acquire(); 56 } 57 esp_crypto_ds_lock_release(void)58void esp_crypto_ds_lock_release(void) 59 { 60 esp_crypto_mpi_lock_release(); 61 esp_crypto_hmac_lock_release(); 62 _lock_release(&s_crypto_ds_lock); 63 } 64 esp_crypto_sha_aes_lock_acquire(void)65void esp_crypto_sha_aes_lock_acquire(void) 66 { 67 _lock_acquire(&s_crypto_sha_aes_lock); 68 } 69 esp_crypto_sha_aes_lock_release(void)70void esp_crypto_sha_aes_lock_release(void) 71 { 72 _lock_release(&s_crypto_sha_aes_lock); 73 } 74 esp_crypto_mpi_lock_acquire(void)75void esp_crypto_mpi_lock_acquire(void) 76 { 77 _lock_acquire(&s_crypto_mpi_lock); 78 } 79 esp_crypto_mpi_lock_release(void)80void esp_crypto_mpi_lock_release(void) 81 { 82 _lock_release(&s_crypto_mpi_lock); 83 } 84 esp_crypto_ecc_lock_acquire(void)85void esp_crypto_ecc_lock_acquire(void) 86 { 87 _lock_acquire(&s_crypto_ecc_lock); 88 } 89 esp_crypto_ecc_lock_release(void)90void esp_crypto_ecc_lock_release(void) 91 { 92 _lock_release(&s_crypto_ecc_lock); 93 } 94 esp_crypto_ecdsa_lock_acquire(void)95void esp_crypto_ecdsa_lock_acquire(void) 96 { 97 _lock_acquire(&s_crypto_ecdsa_lock); 98 esp_crypto_ecc_lock_acquire(); 99 esp_crypto_mpi_lock_acquire(); 100 } 101 esp_crypto_ecdsa_lock_release(void)102void esp_crypto_ecdsa_lock_release(void) 103 { 104 esp_crypto_mpi_lock_release(); 105 esp_crypto_ecc_lock_release(); 106 _lock_release(&s_crypto_ecdsa_lock); 107 } 108