38#ifndef PROTOCORE_ESP_CRYPTO_HAL_H
39#define PROTOCORE_ESP_CRYPTO_HAL_H
51#if defined(ARDUINO) && ((defined(CONFIG_IDF_TARGET_ESP32S3) && CONFIG_IDF_TARGET_ESP32S3) || \
52 (defined(CONFIG_IDF_TARGET_ESP32S2) && CONFIG_IDF_TARGET_ESP32S2) || \
53 (defined(CONFIG_IDF_TARGET_ESP32C3) && CONFIG_IDF_TARGET_ESP32C3) || \
54 (defined(CONFIG_IDF_TARGET_ESP32C5) && CONFIG_IDF_TARGET_ESP32C5) || \
55 (defined(CONFIG_IDF_TARGET_ESP32C6) && CONFIG_IDF_TARGET_ESP32C6) || \
56 (defined(CONFIG_IDF_TARGET_ESP32H2) && CONFIG_IDF_TARGET_ESP32H2) || \
57 (defined(CONFIG_IDF_TARGET_ESP32P4) && CONFIG_IDF_TARGET_ESP32P4))
58#define PC_RSA_MODMUL_HW 1
61#ifdef PC_RSA_MODMUL_HW
64#define PC_HW_REG(a) (*(volatile uint32_t *)(uintptr_t)(a))
71#if defined(CONFIG_IDF_TARGET_ESP32S3) && CONFIG_IDF_TARGET_ESP32S3
72#define PC_RSA_BASE 0x6003C000u
73#define PC_RSA_CLK_REG 0x600C001Cu
74#define PC_RSA_CLK_BIT (1u << 3)
75#define PC_RSA_RST_REG 0x600C0024u
76#define PC_RSA_RST_BIT (1u << 3)
77#define PC_RSA_HOLD_REG 0x600C0024u
78#define PC_RSA_HOLD_CLEAR (1u << 4)
79#define PC_RSA_HAS_PD 1
80#define PC_RSA_PD_REG 0x600C0040u
81#define PC_RSA_PD_UP_CLEAR (1u << 0)
82#define PC_RSA_PD_DOWN_BIT (1u << 0)
83#elif defined(CONFIG_IDF_TARGET_ESP32S2) && CONFIG_IDF_TARGET_ESP32S2
84#define PC_RSA_BASE 0x6003C000u
85#define PC_RSA_CLK_REG 0x3F4C0044u
86#define PC_RSA_CLK_BIT (1u << 3)
87#define PC_RSA_RST_REG 0x3F4C004Cu
88#define PC_RSA_RST_BIT (1u << 3)
89#define PC_RSA_HOLD_REG 0x3F4C004Cu
90#define PC_RSA_HOLD_CLEAR (1u << 4)
91#define PC_RSA_HAS_PD 1
92#define PC_RSA_PD_REG 0x3F4C0068u
93#define PC_RSA_PD_UP_CLEAR (1u << 0)
94#define PC_RSA_PD_DOWN_BIT (1u << 0)
95#elif defined(CONFIG_IDF_TARGET_ESP32C3) && CONFIG_IDF_TARGET_ESP32C3
96#define PC_RSA_BASE 0x6003C000u
97#define PC_RSA_CLK_REG 0x600C0014u
98#define PC_RSA_CLK_BIT (1u << 3)
99#define PC_RSA_RST_REG 0x600C001Cu
100#define PC_RSA_RST_BIT (1u << 3)
101#define PC_RSA_HOLD_REG 0x600C001Cu
102#define PC_RSA_HOLD_CLEAR (1u << 4)
103#define PC_RSA_HAS_PD 1
104#define PC_RSA_PD_REG 0x600C0038u
105#define PC_RSA_PD_UP_CLEAR (1u << 0)
106#define PC_RSA_PD_DOWN_BIT (1u << 0)
107#elif defined(CONFIG_IDF_TARGET_ESP32P4) && CONFIG_IDF_TARGET_ESP32P4
108#define PC_RSA_BASE 0x50092000u
109#define PC_RSA_CLK_REG 0x500E60A8u
110#define PC_RSA_CLK_BIT (1u << 18)
111#define PC_RSA_RST_REG 0x500E60C8u
112#define PC_RSA_RST_BIT (1u << 21)
113#define PC_RSA_HOLD_REG 0x500E60C8u
114#define PC_RSA_HOLD_CLEAR ((1u << 14) | (1u << 17) | (1u << 20))
115#define PC_RSA_HAS_PD 0
116#elif defined(CONFIG_IDF_TARGET_ESP32C6) && CONFIG_IDF_TARGET_ESP32C6
117#define PC_RSA_BASE 0x6008A000u
118#define PC_RSA_CLK_REG 0x600960D0u
119#define PC_RSA_CLK_BIT (1u << 0)
120#define PC_RSA_RST_REG 0x600960D0u
121#define PC_RSA_RST_BIT (1u << 1)
122#define PC_RSA_HOLD_REG 0x600960E0u
123#define PC_RSA_HOLD_CLEAR (1u << 1)
124#define PC_RSA_HAS_PD 1
125#define PC_RSA_PD_REG 0x600960D4u
126#define PC_RSA_PD_UP_CLEAR ((1u << 0) | (1u << 2))
127#define PC_RSA_PD_DOWN_BIT (1u << 0)
128#elif defined(CONFIG_IDF_TARGET_ESP32C5) && CONFIG_IDF_TARGET_ESP32C5
129#define PC_RSA_BASE 0x6008A000u
130#define PC_RSA_CLK_REG 0x600960D4u
131#define PC_RSA_CLK_BIT (1u << 0)
132#define PC_RSA_RST_REG 0x600960D4u
133#define PC_RSA_RST_BIT (1u << 1)
134#define PC_RSA_HOLD_REG 0x600960E4u
135#define PC_RSA_HOLD_CLEAR (1u << 1)
136#define PC_RSA_HOLD2_REG 0x600960ECu
137#define PC_RSA_HOLD2_CLEAR (1u << 1)
138#define PC_RSA_HAS_PD 1
139#define PC_RSA_PD_REG 0x600960D8u
140#define PC_RSA_PD_UP_CLEAR ((1u << 0) | (1u << 2))
141#define PC_RSA_PD_DOWN_BIT (1u << 0)
142#elif defined(CONFIG_IDF_TARGET_ESP32H2) && CONFIG_IDF_TARGET_ESP32H2
143#define PC_RSA_BASE 0x6008A000u
144#define PC_RSA_CLK_REG 0x600960CCu
145#define PC_RSA_CLK_BIT (1u << 0)
146#define PC_RSA_RST_REG 0x600960CCu
147#define PC_RSA_RST_BIT (1u << 1)
148#define PC_RSA_HOLD_REG 0x600960DCu
149#define PC_RSA_HOLD_CLEAR (1u << 1)
150#define PC_RSA_HOLD2_REG 0x600960E4u
151#define PC_RSA_HOLD2_CLEAR (1u << 1)
152#define PC_RSA_HAS_PD 1
153#define PC_RSA_PD_REG 0x600960D0u
154#define PC_RSA_PD_UP_CLEAR ((1u << 0) | (1u << 2))
155#define PC_RSA_PD_DOWN_BIT (1u << 0)
157#error "esp_crypto_hal: PC_RSA_MODMUL_HW is on but no RSA register map for this die - add its bases/bits"
161#define PC_RSA_MEM_M (PC_RSA_BASE + 0x000u)
162#define PC_RSA_MEM_Z (PC_RSA_BASE + 0x200u)
163#define PC_RSA_MEM_Y (PC_RSA_BASE + 0x400u)
164#define PC_RSA_MEM_X (PC_RSA_BASE + 0x600u)
165#define PC_RSA_MPRIME (PC_RSA_BASE + 0x800u)
166#define PC_RSA_MODE (PC_RSA_BASE + 0x804u)
167#define PC_RSA_CLEAN (PC_RSA_BASE + 0x808u)
168#define PC_RSA_START (PC_RSA_BASE + 0x810u)
169#define PC_RSA_DONE (PC_RSA_BASE + 0x818u)
170#define PC_RSA_INTCLR (PC_RSA_BASE + 0x81Cu)
171#define PC_RSA_INTENA (PC_RSA_BASE + 0x82Cu)
178void pc_rsa_hw_acquire(
void);
181void pc_rsa_hw_release(
void);
192static inline void pc_rsa_modmul(uint32_t *z,
const uint32_t *x,
const uint32_t *y,
const uint32_t *m, uint32_t mprime,
193 const uint32_t *rinv,
unsigned words)
195 volatile uint32_t *M = (
volatile uint32_t *)(uintptr_t)PC_RSA_MEM_M;
196 volatile uint32_t *X = (
volatile uint32_t *)(uintptr_t)PC_RSA_MEM_X;
197 volatile uint32_t *Y = (
volatile uint32_t *)(uintptr_t)PC_RSA_MEM_Y;
198 volatile uint32_t *Z = (
volatile uint32_t *)(uintptr_t)PC_RSA_MEM_Z;
199 PC_HW_REG(PC_RSA_MODE) = words - 1u;
200 PC_HW_REG(PC_RSA_MPRIME) = mprime;
201 for (
unsigned i = 0; i < words; i++)
208 PC_HW_REG(PC_RSA_INTCLR) = 1u;
209 PC_HW_REG(PC_RSA_START) = 1u;
210 while (PC_HW_REG(PC_RSA_DONE) == 0u)
213 PC_HW_REG(PC_RSA_INTCLR) = 1u;
214 for (
unsigned i = 0; i < words; i++)