106 uint32_t reg = mmio_region_read32(hmac->
base_addr, HMAC_CFG_REG_OFFSET);
111 if (key != NULL && !config.
sideload) {
116 for (
size_t i = 0; i < 8; ++i) {
117 const ptrdiff_t word_offset = (ptrdiff_t)(i *
sizeof(uint32_t));
118 mmio_region_write32(hmac->
base_addr, HMAC_KEY_7_REG_OFFSET - word_offset,
119 read_32((
char *)key + word_offset));
124 reg = bitfield_bit32_write(reg, HMAC_CFG_SHA_EN_BIT,
true);
125 reg = bitfield_bit32_write(reg, HMAC_CFG_HMAC_EN_BIT,
true);
128 reg = bitfield_field32_write(reg, HMAC_CFG_DIGEST_SIZE_FIELD,
129 HMAC_CFG_DIGEST_SIZE_VALUE_SHA2_256);
130 reg = bitfield_field32_write(reg, HMAC_CFG_KEY_LENGTH_FIELD,
131 HMAC_CFG_KEY_LENGTH_VALUE_KEY_256);
133 mmio_region_write32(hmac->
base_addr, HMAC_CFG_REG_OFFSET, reg);
136 mmio_region_nonatomic_set_bit32(hmac->
base_addr, HMAC_CMD_REG_OFFSET,
137 HMAC_CMD_HASH_START_BIT);
148 uint32_t reg = mmio_region_read32(hmac->
base_addr, HMAC_CFG_REG_OFFSET);
154 reg = bitfield_bit32_write(reg, HMAC_CFG_SHA_EN_BIT,
true);
155 reg = bitfield_bit32_write(reg, HMAC_CFG_HMAC_EN_BIT,
false);
158 reg = bitfield_field32_write(reg, HMAC_CFG_DIGEST_SIZE_FIELD,
159 HMAC_CFG_DIGEST_SIZE_VALUE_SHA2_256);
160 reg = bitfield_field32_write(reg, HMAC_CFG_KEY_LENGTH_FIELD,
161 HMAC_CFG_KEY_LENGTH_VALUE_KEY_256);
164 mmio_region_write32(hmac->
base_addr, HMAC_CFG_REG_OFFSET, reg);
167 mmio_region_nonatomic_set_bit32(hmac->
base_addr, HMAC_CMD_REG_OFFSET,
168 HMAC_CMD_HASH_START_BIT);
174 size_t len,
size_t *bytes_sent) {
175 if (hmac == NULL || data == NULL) {
179 const uint8_t *data_sent = (
const uint8_t *)data;
180 size_t bytes_remaining = len;
182 while (bytes_remaining > 0 && get_fifo_available_space(hmac) > 0) {
183 bool word_aligned = (uintptr_t)data_sent %
sizeof(uint32_t) == 0;
184 size_t bytes_written = 0;
186 if (bytes_remaining <
sizeof(uint32_t) || !word_aligned) {
189 mmio_region_write8(hmac->
base_addr, HMAC_MSG_FIFO_REG_OFFSET, *data_sent);
193 uint32_t word = read_32(data_sent);
194 mmio_region_write32(hmac->
base_addr, HMAC_MSG_FIFO_REG_OFFSET, word);
195 bytes_written =
sizeof(uint32_t);
198 bytes_remaining -= bytes_written;
199 data_sent += bytes_written;
202 if (bytes_sent != NULL) {
203 *bytes_sent = len - bytes_remaining;
206 if (bytes_remaining > 0) {
226 if (hmac == NULL || msg_len == NULL) {
230 mmio_region_read32(hmac->
base_addr, HMAC_MSG_LENGTH_LOWER_REG_OFFSET);
232 mmio_region_read32(hmac->
base_addr, HMAC_MSG_LENGTH_UPPER_REG_OFFSET);
234 *msg_len = (msg_upper << 32) | msg_lower;
263 if (hmac == NULL || digest == NULL) {
268 bool done = mmio_region_get_bit32(hmac->
base_addr, HMAC_INTR_STATE_REG_OFFSET,
269 HMAC_INTR_STATE_HMAC_DONE_BIT);
272 bool fifo_empty = mmio_region_get_bit32(
273 hmac->
base_addr, HMAC_STATUS_REG_OFFSET, HMAC_STATUS_FIFO_EMPTY_BIT);
276 mmio_region_get_bit32(hmac->
base_addr, HMAC_INTR_STATE_REG_OFFSET,
277 HMAC_INTR_STATE_HMAC_ERR_BIT);
286 mmio_region_nonatomic_set_bit32(hmac->
base_addr, HMAC_INTR_STATE_REG_OFFSET,
287 HMAC_INTR_STATE_HMAC_DONE_BIT);
288 }
else if (!fifo_empty) {
292 read_digest(hmac, digest);
294 if (disable_after_done) {
297 uint32_t device_config =
298 mmio_region_read32(hmac->
base_addr, HMAC_CFG_REG_OFFSET);
300 bitfield_bit32_write(device_config, HMAC_CFG_SHA_EN_BIT,
false);
302 bitfield_bit32_write(device_config, HMAC_CFG_HMAC_EN_BIT,
false);
304 bitfield_field32_write(device_config, HMAC_CFG_DIGEST_SIZE_FIELD,
305 HMAC_CFG_DIGEST_SIZE_VALUE_SHA2_NONE);
307 bitfield_field32_write(device_config, HMAC_CFG_KEY_LENGTH_FIELD,
308 HMAC_CFG_KEY_LENGTH_VALUE_KEY_256);
310 mmio_region_write32(hmac->
base_addr, HMAC_CFG_REG_OFFSET, device_config);