12 #include "sw/device/lib/testing/hmac_testutils.h"
13 #include "sw/device/lib/testing/test_framework/check.h"
18 OTTF_DEFINE_TEST_CONFIG();
20 #include "hmac_regs.h"
22 typedef enum hmac_err {
33 kErrorSwHashStartWhenShaDisabled = 0x02,
39 kErrorSwUpdateSecretKeyInProcess = 0x03,
44 kErrorSwHashStartWhenActive = 0x04,
49 kErrorSwPushMsgWhenDisallowed = 0x05,
54 kErrorSwInvalidConfig = 0x06,
63 static const char kData[142] =
64 "Every one suspects himself of at least one of "
65 "the cardinal virtues, and this is mine: I am "
66 "one of the few honest people that I have ever "
69 static uint32_t kHmacKey[8] = {
70 0xec4e6c89, 0x082efa98, 0x299f31d0, 0xa4093822,
71 0x03707344, 0x13198a2e, 0x85a308d3, 0x243f6a88,
106 CHECK_DIF_OK(dif_hmac_init(base_addr, hmac));
114 static void test_start(
const dif_hmac_t *hmac,
const uint8_t *key) {
126 static void run_hmac(
const dif_hmac_t *hmac) {
130 static void run_hmac_enable_interrupt(
void) {
140 static void run_hmac_clear_interrupt(
void) {
151 status_t run_test_pushmsg_when_shadisabled(
152 const dif_hmac_t *hmac,
const char *data,
size_t len,
const uint8_t *key,
154 run_hmac_enable_interrupt();
162 CHECK_STATUS_OK(hmac_testutils_push_message(hmac, data, len));
163 uint32_t hmac_err_reg =
164 mmio_region_read32(hmac->base_addr, HMAC_ERR_CODE_REG_OFFSET);
165 TRY_CHECK(hmac_err_reg == kErrorSwPushMsgWhenDisallowed,
166 "Error code doesn't match expected code ");
167 run_hmac_clear_interrupt();
173 status_t run_test_pushmsg_when_disallowed(
174 const dif_hmac_t *hmac,
const char *data,
size_t len,
const uint8_t *key,
176 run_hmac_enable_interrupt();
177 test_start(hmac, key);
178 CHECK_STATUS_OK(hmac_testutils_push_message(hmac, data, len));
179 CHECK_STATUS_OK(hmac_testutils_fifo_empty_polled(hmac));
181 CHECK_STATUS_OK(hmac_testutils_push_message(hmac, data, len));
182 uint32_t hmac_err_reg =
183 mmio_region_read32(hmac->base_addr, HMAC_ERR_CODE_REG_OFFSET);
184 TRY_CHECK(hmac_err_reg == kErrorSwPushMsgWhenDisallowed,
185 "Error code doesn't match expected code");
186 CHECK_STATUS_OK(hmac_testutils_fifo_empty_polled(hmac));
187 run_hmac_clear_interrupt();
193 status_t run_test_invalidconfig_keylength(
194 const dif_hmac_t *hmac,
const char *data,
size_t len,
const uint8_t *key,
196 run_hmac_enable_interrupt();
200 HMAC_CFG_KEY_LENGTH_VALUE_KEY_NONE);
202 HMAC_CFG_DIGEST_SIZE_VALUE_SHA2_256);
206 uint32_t hmac_cmd_reg =
207 mmio_region_read32(hmac->base_addr, HMAC_CMD_REG_OFFSET);
212 uint32_t hmacerr_reg =
213 mmio_region_read32(hmac->base_addr, HMAC_ERR_CODE_REG_OFFSET);
214 TRY_CHECK(hmacerr_reg == kErrorSwInvalidConfig,
215 "Error code doesn't match expected code");
216 CHECK_STATUS_OK(hmac_testutils_push_message(hmac, data, len));
217 CHECK_STATUS_OK(hmac_testutils_fifo_empty_polled(hmac));
219 hmac_cmd_reg = mmio_region_read32(hmac->base_addr, HMAC_CMD_REG_OFFSET);
225 uint32_t cfg_reg_default = HMAC_CFG_REG_RESVAL;
228 run_hmac_clear_interrupt();
235 status_t run_test_invalidconfig_digest(
236 const dif_hmac_t *hmac,
const char *data,
size_t len,
const uint8_t *key,
238 run_hmac_enable_interrupt();
242 HMAC_CFG_KEY_LENGTH_VALUE_KEY_256);
244 HMAC_CFG_DIGEST_SIZE_VALUE_SHA2_NONE);
248 uint32_t hmac_cmd_reg =
249 mmio_region_read32(hmac->base_addr, HMAC_CMD_REG_OFFSET);
254 uint32_t hmacerr_reg =
255 mmio_region_read32(hmac->base_addr, HMAC_ERR_CODE_REG_OFFSET);
256 TRY_CHECK(hmacerr_reg == kErrorSwInvalidConfig,
257 "Error code doesn't match expected code");
258 CHECK_STATUS_OK(hmac_testutils_push_message(hmac, data, len));
259 CHECK_STATUS_OK(hmac_testutils_fifo_empty_polled(hmac));
261 hmac_cmd_reg = mmio_region_read32(hmac->base_addr, HMAC_CMD_REG_OFFSET);
267 uint32_t cfg_reg_default = HMAC_CFG_REG_RESVAL;
270 run_hmac_clear_interrupt();
277 status_t run_test_updatekey(
const dif_hmac_t *hmac,
const char *data,
278 size_t len,
const uint8_t *key,
280 run_hmac_enable_interrupt();
281 test_start(hmac, key);
282 CHECK_STATUS_OK(hmac_testutils_push_message(hmac, data, len));
283 CHECK_STATUS_OK(hmac_testutils_fifo_empty_polled(hmac));
286 uint32_t hmacerr_reg =
287 mmio_region_read32(hmac->base_addr, HMAC_ERR_CODE_REG_OFFSET);
288 TRY_CHECK(hmacerr_reg == kErrorSwUpdateSecretKeyInProcess,
289 "Error code doesn't match expected code");
291 run_hmac_clear_interrupt();
296 status_t run_test_hashstartwhendisabled(
297 const dif_hmac_t *hmac,
const char *data,
size_t len,
const uint8_t *key,
299 run_hmac_enable_interrupt();
306 uint32_t hmac_cmd_reg =
307 mmio_region_read32(hmac->base_addr, HMAC_CMD_REG_OFFSET);
312 uint32_t hmacerr_reg =
313 mmio_region_read32(hmac->base_addr, HMAC_ERR_CODE_REG_OFFSET);
314 TRY_CHECK(hmacerr_reg == kErrorSwHashStartWhenShaDisabled,
315 "Error code doesn't match expected code");
316 run_hmac_clear_interrupt();
321 status_t run_test_hashstartwhenactive(
322 const dif_hmac_t *hmac,
const char *data,
size_t len,
const uint8_t *key,
324 run_hmac_enable_interrupt();
325 test_start(hmac, key);
326 uint32_t hmac_cmd_reg =
327 mmio_region_read32(hmac->base_addr, HMAC_CMD_REG_OFFSET);
332 uint32_t hmac_err_reg =
333 mmio_region_read32(hmac->base_addr, HMAC_ERR_CODE_REG_OFFSET);
334 TRY_CHECK(hmac_err_reg == kErrorSwHashStartWhenActive,
335 "Error code doesn't match expected code");
337 run_hmac_clear_interrupt();
342 LOG_INFO(
"Running HMAC Error Condition test...");
346 LOG_INFO(
"Running test push message when sha disabled...");
347 run_test_pushmsg_when_shadisabled(&hmac, kData,
sizeof(kData), NULL,
348 &kExpectedHmacDigest);
350 LOG_INFO(
"Running Hash start test when sha is disabled...");
351 run_test_hashstartwhendisabled(&hmac, kData,
sizeof(kData), NULL,
352 &kExpectedShaDigest);
354 LOG_INFO(
"Running test with key when disallowed..,");
355 run_test_updatekey(&hmac, kData,
sizeof(kData), (uint8_t *)(&kHmacKey[0]),
356 &kExpectedHmacDigest);
358 LOG_INFO(
"Running test HMAC hash start when active...");
359 run_test_hashstartwhenactive(&hmac, kData,
sizeof(kData),
360 (uint8_t *)(&kHmacKey[0]), &kExpectedHmacDigest);
362 LOG_INFO(
"Running test push message when disallowed...");
363 run_test_pushmsg_when_disallowed(&hmac, kData,
sizeof(kData),
364 (uint8_t *)(&kHmacKey[0]),
365 &kExpectedHmacDigest);
367 LOG_INFO(
"Running test HMAC invalid config keylength...");
368 run_test_invalidconfig_keylength(&hmac, kData,
sizeof(kData),
369 (uint8_t *)(&kHmacKey[0]),
370 &kExpectedHmacDigest);
372 LOG_INFO(
"Running test HMAC hash start when active...");
373 run_test_hashstartwhenactive(&hmac, kData,
sizeof(kData),
374 (uint8_t *)(&kHmacKey[0]), &kExpectedHmacDigest);
376 LOG_INFO(
"Running test HMAC invalid config digest size...");
377 run_test_invalidconfig_digest(&hmac, kData,
sizeof(kData),
378 (uint8_t *)(&kHmacKey[0]),
379 &kExpectedHmacDigest);