5 #include "sw/device/silicon_creator/lib/drivers/hmac.h"
7 #include "dt/dt_hmac.h"
12 #include "sw/device/silicon_creator/lib/error.h"
14 #include "hmac_regs.h"
16 static const dt_hmac_t kHmacDt = kDtHmac;
18 static inline uint32_t hmac_base(
void) {
19 return dt_hmac_primary_reg_block(kHmacDt);
22 void hmac_sha256_configure(
bool big_endian_digest) {
24 abs_mmio_write32(hmac_base() + HMAC_CFG_REG_OFFSET, 0u);
27 abs_mmio_write32(hmac_base() + HMAC_INTR_ENABLE_REG_OFFSET, 0u);
28 abs_mmio_write32(hmac_base() + HMAC_INTR_STATE_REG_OFFSET, UINT32_MAX);
37 HMAC_CFG_DIGEST_SIZE_VALUE_SHA2_256);
39 HMAC_CFG_KEY_LENGTH_VALUE_KEY_256);
40 abs_mmio_write32(hmac_base() + HMAC_CFG_REG_OFFSET, reg);
43 inline void hmac_sha256_start(
void) {
45 abs_mmio_write32(hmac_base() + HMAC_CMD_REG_OFFSET, cmd);
48 void hmac_sha256_update(
const void *data,
size_t len) {
49 const uint8_t *data_sent = (
const uint8_t *)data;
52 for (; len != 0 && (uintptr_t)data_sent & 3; --len) {
53 abs_mmio_write8(hmac_base() + HMAC_MSG_FIFO_REG_OFFSET, *data_sent++);
56 for (; len >=
sizeof(uint32_t); len -=
sizeof(uint32_t)) {
57 uint32_t data_aligned =
read_32(data_sent);
58 abs_mmio_write32(hmac_base() + HMAC_MSG_FIFO_REG_OFFSET, data_aligned);
59 data_sent +=
sizeof(uint32_t);
63 for (; len != 0; --len) {
64 abs_mmio_write8(hmac_base() + HMAC_MSG_FIFO_REG_OFFSET, *data_sent++);
68 void hmac_sha256_update_words(
const uint32_t *data,
size_t len) {
69 for (
size_t i = 0; i < len; i++) {
70 abs_mmio_write32(hmac_base() + HMAC_MSG_FIFO_REG_OFFSET, data[i]);
74 inline void hmac_sha256_process(
void) {
76 abs_mmio_write32(hmac_base() + HMAC_CMD_REG_OFFSET, cmd);
84 static void wait_for_done(
void) {
87 reg = abs_mmio_read32(hmac_base() + HMAC_INTR_STATE_REG_OFFSET);
89 abs_mmio_write32(hmac_base() + HMAC_INTR_STATE_REG_OFFSET, reg);
92 void hmac_sha256_final_truncated(uint32_t *digest,
size_t len) {
95 uint32_t result, incr;
96 uint32_t reg = abs_mmio_read32(hmac_base() + HMAC_CFG_REG_OFFSET);
99 result = HMAC_DIGEST_0_REG_OFFSET;
100 incr =
sizeof(uint32_t);
105 result = HMAC_DIGEST_7_REG_OFFSET;
106 incr = (uint32_t) -
sizeof(uint32_t);
112 len = len <= kHmacDigestNumWords ? len : kHmacDigestNumWords;
113 for (uint32_t i = 0; i < len; ++i, result += incr) {
114 digest[i] = abs_mmio_read32(hmac_base() + result);
118 void hmac_sha256(
const void *data,
size_t len,
hmac_digest_t *digest) {
120 hmac_sha256_update(data, len);
121 hmac_sha256_process();
122 hmac_sha256_final(digest);
129 abs_mmio_write32(hmac_base() + HMAC_CMD_REG_OFFSET, cmd);
135 for (uint32_t i = 0; i < kHmacDigestNumWords; i++) {
136 ctx->digest[i] = abs_mmio_read32(hmac_base() + HMAC_DIGEST_0_REG_OFFSET +
137 i *
sizeof(uint32_t));
142 abs_mmio_read32(hmac_base() + HMAC_MSG_LENGTH_LOWER_REG_OFFSET);
144 abs_mmio_read32(hmac_base() + HMAC_MSG_LENGTH_UPPER_REG_OFFSET);
147 uint32_t cfg = abs_mmio_read32(hmac_base() + HMAC_CFG_REG_OFFSET);
148 abs_mmio_write32(hmac_base() + HMAC_CFG_REG_OFFSET,
152 abs_mmio_write32(hmac_base() + HMAC_CFG_REG_OFFSET, cfg);
158 uint32_t cfg = abs_mmio_read32(hmac_base() + HMAC_CFG_REG_OFFSET);
160 abs_mmio_write32(hmac_base() + HMAC_CFG_REG_OFFSET, cfg);
165 for (uint32_t i = 0; i < kHmacDigestNumWords; i++) {
167 hmac_base() + HMAC_DIGEST_0_REG_OFFSET + i *
sizeof(uint32_t),
172 abs_mmio_write32(hmac_base() + HMAC_MSG_LENGTH_LOWER_REG_OFFSET,
174 abs_mmio_write32(hmac_base() + HMAC_MSG_LENGTH_UPPER_REG_OFFSET,
179 abs_mmio_write32(hmac_base() + HMAC_CFG_REG_OFFSET, cfg);
183 abs_mmio_write32(hmac_base() + HMAC_CMD_REG_OFFSET, cmd);
186 extern void hmac_sha256_init(
void);