5 #include "sw/device/lib/crypto/drivers/aes.h"
12 #include "sw/device/lib/crypto/drivers/entropy.h"
13 #include "sw/device/lib/crypto/impl/status.h"
19 #define MODULE_ID MAKE_MODULE_ID('d', 'a', 'e')
24 kAesKeyWordLen128 = 128 / (
sizeof(uint32_t) * 8),
25 kAesKeyWordLen192 = 192 / (
sizeof(uint32_t) * 8),
26 kAesKeyWordLen256 = 256 / (
sizeof(uint32_t) * 8),
32 static status_t spin_until(uint32_t bit) {
34 uint32_t reg = abs_mmio_read32(kBase + AES_STATUS_REG_OFFSET);
37 return OTCRYPTO_RECOV_ERR;
61 uint32_t share0 = kBase + AES_KEY_SHARE0_0_REG_OFFSET;
62 uint32_t share1 = kBase + AES_KEY_SHARE1_0_REG_OFFSET;
70 abs_mmio_write32(share0 + i *
sizeof(uint32_t), key.
key_shares[0][i]);
73 for (i = 0; i < key.
key_len; ++i) {
74 abs_mmio_write32(share1 + i *
sizeof(uint32_t), key.
key_shares[1][i]);
80 for (
size_t i = key.
key_len; i < 8; ++i) {
81 abs_mmio_write32(share0 + i *
sizeof(uint32_t), 0);
82 abs_mmio_write32(share1 + i *
sizeof(uint32_t), 0);
84 return spin_until(AES_STATUS_IDLE_BIT);
99 HARDENED_TRY(entropy_complex_check());
102 HARDENED_TRY(spin_until(AES_STATUS_IDLE_BIT));
104 uint32_t ctrl_reg = AES_CTRL_SHADOWED_REG_RESVAL;
112 AES_CTRL_SHADOWED_OPERATION_VALUE_AES_ENC);
118 AES_CTRL_SHADOWED_OPERATION_VALUE_AES_DEC);
123 return OTCRYPTO_BAD_ARGS;
142 return OTCRYPTO_BAD_ARGS;
148 aes_cipher_mode_t mode_written;
149 switch (launder32(key.
mode)) {
150 case kAesCipherModeEcb:
152 AES_CTRL_SHADOWED_MODE_VALUE_AES_ECB);
153 mode_written = launder32(kAesCipherModeEcb);
155 case kAesCipherModeCbc:
157 AES_CTRL_SHADOWED_MODE_VALUE_AES_CBC);
158 mode_written = launder32(kAesCipherModeCbc);
160 case kAesCipherModeCfb:
162 AES_CTRL_SHADOWED_MODE_VALUE_AES_CFB);
163 mode_written = launder32(kAesCipherModeCfb);
165 case kAesCipherModeOfb:
167 AES_CTRL_SHADOWED_MODE_VALUE_AES_OFB);
168 mode_written = launder32(kAesCipherModeOfb);
170 case kAesCipherModeCtr:
172 AES_CTRL_SHADOWED_MODE_VALUE_AES_CTR);
173 mode_written = launder32(kAesCipherModeCtr);
177 return OTCRYPTO_BAD_ARGS;
184 case kAesKeyWordLen128:
187 AES_CTRL_SHADOWED_KEY_LEN_VALUE_AES_128);
189 case kAesKeyWordLen192:
192 AES_CTRL_SHADOWED_KEY_LEN_VALUE_AES_192);
194 case kAesKeyWordLen256:
197 AES_CTRL_SHADOWED_KEY_LEN_VALUE_AES_256);
201 return OTCRYPTO_BAD_ARGS;
206 ctrl_reg, AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT,
false);
211 AES_CTRL_SHADOWED_PRNG_RESEED_RATE_VALUE_PER_64);
213 abs_mmio_write32_shadowed(kBase + AES_CTRL_SHADOWED_REG_OFFSET, ctrl_reg);
214 HARDENED_TRY(spin_until(AES_STATUS_IDLE_BIT));
217 HARDENED_TRY(aes_write_key(key));
220 if (key.
mode != launder32(kAesCipherModeEcb)) {
221 HARDENED_CHECK_NE(key.
mode, kAesCipherModeEcb);
222 uint32_t iv_offset = kBase + AES_IV_0_REG_OFFSET;
223 for (
size_t i = 0; i <
ARRAYSIZE(iv->data); ++i) {
224 abs_mmio_write32(iv_offset + i *
sizeof(uint32_t), iv->data[i]);
229 uint32_t
status = abs_mmio_read32(kBase + AES_STATUS_REG_OFFSET);
231 return OTCRYPTO_RECOV_ERR;
235 AES_STATUS_INPUT_READY_BIT),
254 uint32_t reg = abs_mmio_read32(kBase + AES_STATUS_REG_OFFSET);
257 return OTCRYPTO_RECOV_ERR;
260 HARDENED_TRY(spin_until(AES_STATUS_OUTPUT_VALID_BIT));
262 uint32_t offset = kBase + AES_DATA_OUT_0_REG_OFFSET;
263 for (
size_t i = 0; i <
ARRAYSIZE(dest->data); ++i) {
264 dest->data[i] = abs_mmio_read32(offset + i *
sizeof(uint32_t));
269 HARDENED_TRY(spin_until(AES_STATUS_INPUT_READY_BIT));
271 uint32_t offset = kBase + AES_DATA_IN_0_REG_OFFSET;
272 for (
size_t i = 0; i <
ARRAYSIZE(src->data); ++i) {
273 abs_mmio_write32(offset + i *
sizeof(uint32_t), src->data[i]);
281 uint32_t ctrl_reg = AES_CTRL_SHADOWED_REG_RESVAL;
283 AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT,
true);
284 abs_mmio_write32_shadowed(kBase + AES_CTRL_SHADOWED_REG_OFFSET, ctrl_reg);
288 uint32_t iv_offset = kBase + AES_IV_0_REG_OFFSET;
289 for (
size_t i = 0; i <
ARRAYSIZE(iv->data); ++i) {
290 iv->data[i] = abs_mmio_read32(iv_offset + i *
sizeof(uint32_t));
294 uint32_t trigger_reg = 0;
296 trigger_reg, AES_TRIGGER_KEY_IV_DATA_IN_CLEAR_BIT,
true);
299 abs_mmio_write32(kBase + AES_TRIGGER_REG_OFFSET, trigger_reg);
301 return spin_until(AES_STATUS_IDLE_BIT);