5 #include "sw/device/silicon_creator/lib/drivers/hmac.h"
10 #include "gtest/gtest.h"
12 #include "sw/device/lib/base/mock_abs_mmio.h"
13 #include "sw/device/silicon_creator/lib/error.h"
14 #include "sw/device/silicon_creator/testing/rom_test.h"
16 #include "hmac_regs.h"
19 namespace hmac_unittest {
21 using ::testing::ElementsAreArray;
26 EXPECT_ABS_WRITE32(base_ + HMAC_CFG_REG_OFFSET, 0u);
27 EXPECT_ABS_WRITE32(base_ + HMAC_INTR_ENABLE_REG_OFFSET, 0u);
28 EXPECT_ABS_WRITE32(base_ + HMAC_INTR_STATE_REG_OFFSET,
29 std::numeric_limits<uint32_t>::max());
31 uint32_t key_len_256 = HMAC_CFG_KEY_LENGTH_VALUE_KEY_256;
32 uint32_t digest_256 = HMAC_CFG_DIGEST_SIZE_VALUE_SHA2_256;
34 EXPECT_ABS_WRITE32(base_ + HMAC_CFG_REG_OFFSET,
36 {HMAC_CFG_DIGEST_SWAP_BIT,
false},
37 {HMAC_CFG_ENDIAN_SWAP_BIT,
false},
38 {HMAC_CFG_SHA_EN_BIT,
true},
39 {HMAC_CFG_HMAC_EN_BIT,
false},
40 {HMAC_CFG_DIGEST_SIZE_OFFSET, digest_256},
41 {HMAC_CFG_KEY_LENGTH_OFFSET, key_len_256},
43 EXPECT_ABS_WRITE32(base_ + HMAC_CMD_REG_OFFSET,
44 {{HMAC_CMD_HASH_START_BIT,
true}});
47 void ExpectDigest(
const std::array<uint32_t, 8> &digest) {
49 EXPECT_ABS_WRITE32(base_ + HMAC_CMD_REG_OFFSET,
50 {{HMAC_CMD_HASH_PROCESS_BIT,
true}});
53 EXPECT_ABS_READ32(base_ + HMAC_INTR_STATE_REG_OFFSET,
55 {HMAC_INTR_STATE_HMAC_DONE_BIT,
false},
57 EXPECT_ABS_READ32(base_ + HMAC_INTR_STATE_REG_OFFSET,
59 {HMAC_INTR_STATE_HMAC_DONE_BIT,
true},
61 EXPECT_ABS_WRITE32(base_ + HMAC_INTR_STATE_REG_OFFSET,
63 {HMAC_INTR_STATE_HMAC_DONE_BIT,
true},
68 EXPECT_ABS_READ32(base_ + HMAC_CFG_REG_OFFSET, 0u);
72 EXPECT_ABS_READ32(base_ + HMAC_DIGEST_7_REG_OFFSET, digest[0]);
73 EXPECT_ABS_READ32(base_ + HMAC_DIGEST_6_REG_OFFSET, digest[1]);
74 EXPECT_ABS_READ32(base_ + HMAC_DIGEST_5_REG_OFFSET, digest[2]);
75 EXPECT_ABS_READ32(base_ + HMAC_DIGEST_4_REG_OFFSET, digest[3]);
76 EXPECT_ABS_READ32(base_ + HMAC_DIGEST_3_REG_OFFSET, digest[4]);
77 EXPECT_ABS_READ32(base_ + HMAC_DIGEST_2_REG_OFFSET, digest[5]);
78 EXPECT_ABS_READ32(base_ + HMAC_DIGEST_1_REG_OFFSET, digest[6]);
79 EXPECT_ABS_READ32(base_ + HMAC_DIGEST_0_REG_OFFSET, digest[7]);
83 rom_test::MockAbsMmio mmio_;
97 constexpr std::array<uint8_t, 16> kData = {
98 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
99 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
103 EXPECT_ABS_WRITE8(base_ + HMAC_MSG_FIFO_REG_OFFSET, 0x01);
104 EXPECT_ABS_WRITE8(base_ + HMAC_MSG_FIFO_REG_OFFSET, 0x02);
105 hmac_sha256_update(&kData[1], 2);
108 EXPECT_ABS_WRITE32(base_ + HMAC_MSG_FIFO_REG_OFFSET, 0x03020100);
109 hmac_sha256_update(&kData[0], 4);
112 EXPECT_ABS_WRITE8(base_ + HMAC_MSG_FIFO_REG_OFFSET, 0x02);
113 EXPECT_ABS_WRITE8(base_ + HMAC_MSG_FIFO_REG_OFFSET, 0x03);
114 EXPECT_ABS_WRITE32(base_ + HMAC_MSG_FIFO_REG_OFFSET, 0x07060504);
115 EXPECT_ABS_WRITE8(base_ + HMAC_MSG_FIFO_REG_OFFSET, 0x08);
116 EXPECT_ABS_WRITE8(base_ + HMAC_MSG_FIFO_REG_OFFSET, 0x09);
117 hmac_sha256_update(&kData[2], 8);
123 constexpr std::array<uint32_t, 8> kExpectedDigest = {
124 0x00000000, 0x11111111, 0x22222222, 0x33333333,
125 0x44444444, 0x55555555, 0x66666666, 0x77777777,
127 ExpectDigest(kExpectedDigest);
129 hmac_sha256_process();
131 hmac_sha256_final(&got_digest);
132 EXPECT_THAT(got_digest.digest, ElementsAreArray(kExpectedDigest));
138 constexpr std::array<uint32_t, 2> kData = {
142 constexpr std::array<uint32_t, 8> kExpectedDigest = {
143 0x00000000, 0x11111111, 0x22222222, 0x33333333,
144 0x44444444, 0x55555555, 0x66666666, 0x77777777,
147 EXPECT_ABS_WRITE32(base_ + HMAC_MSG_FIFO_REG_OFFSET, 0x0a0b0c0d);
148 EXPECT_ABS_WRITE32(base_ + HMAC_MSG_FIFO_REG_OFFSET, 0x01020304);
149 ExpectDigest(kExpectedDigest);
152 hmac_sha256(&kData,
sizeof(kData), &act_digest);
153 EXPECT_THAT(act_digest.digest, ElementsAreArray(kExpectedDigest));