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)39 void 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)45 void 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)51 void 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)58 void 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)65 void 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)70 void esp_crypto_sha_aes_lock_release(void)
71 {
72     _lock_release(&s_crypto_sha_aes_lock);
73 }
74 
esp_crypto_mpi_lock_acquire(void)75 void esp_crypto_mpi_lock_acquire(void)
76 {
77     _lock_acquire(&s_crypto_mpi_lock);
78 }
79 
esp_crypto_mpi_lock_release(void)80 void esp_crypto_mpi_lock_release(void)
81 {
82     _lock_release(&s_crypto_mpi_lock);
83 }
84 
esp_crypto_ecc_lock_acquire(void)85 void esp_crypto_ecc_lock_acquire(void)
86 {
87     _lock_acquire(&s_crypto_ecc_lock);
88 }
89 
esp_crypto_ecc_lock_release(void)90 void esp_crypto_ecc_lock_release(void)
91 {
92     _lock_release(&s_crypto_ecc_lock);
93 }
94 
esp_crypto_ecdsa_lock_acquire(void)95 void 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)102 void 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