Software APIs
hmac_endianness_test.c
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
12 #include "sw/device/lib/testing/hmac_testutils.h"
13 #include "sw/device/lib/testing/test_framework/check.h"
15 
16 #include "hmac_regs.h"
18 #include "sw/device/lib/dif/autogen/dif_hmac_autogen.h"
19 
20 OTTF_DEFINE_TEST_CONFIG();
21 
22 static const dif_hmac_transaction_t kHmacconfig_littled_littlem = {
24  .message_endianness = kDifHmacEndiannessLittle,
25 };
26 
27 static const dif_hmac_transaction_t kHmacconfig_littled_bigm = {
29  .message_endianness = kDifHmacEndiannessBig,
30 };
31 
32 static const dif_hmac_transaction_t kHmacconfig_bigd_littlem = {
34  .message_endianness = kDifHmacEndiannessLittle,
35 };
36 
37 static const dif_hmac_transaction_t kHmacconfig_bigd_bigm = {
39  .message_endianness = kDifHmacEndiannessBig,
40 };
41 
42 static const char kData[142] =
43  "Every one suspects himself of at least one of "
44  "the cardinal virtues, and this is mine: I am "
45  "one of the few honest people that I have ever "
46  "known";
47 
48 static const char kData2[8] = "Help Us ";
49 static const char kData2_endian[8] = "pleH sU ";
50 
51 static const dif_hmac_digest_t kExpectedShaDigest = {
52  .digest =
53  {
54  0xd6c6c94e,
55  0xf7cff519,
56  0x45c76d42,
57  0x9d37a8b8,
58  0xe2762fe9,
59  0x71ff68cb,
60  0x68e236af,
61  0x3dc296dc,
62  },
63 };
64 
65 static const dif_hmac_digest_t kExpectedShaDigest_bigendian = {
66  .digest =
67  {
68  0x4ec9c6d6,
69  0x19f5cff7,
70  0x426dc745,
71  0xb8a8379d,
72  0xe92f76e2,
73  0xcb68ff71,
74  0xaf36e268,
75  0xdc96c23d,
76  },
77 };
78 
79 static const dif_hmac_digest_t kExpectedShaDigest_shortmessage = {
80  .digest =
81  {
82  0x8ce72131,
83  0xd5ac567a,
84  0x234045e8,
85  0x04f2ac21,
86  0x29e62b92,
87  0x99255af0,
88  0x392a3664,
89  0x31066f19,
90  },
91 };
92 
93 static const dif_hmac_digest_t kExpectedShaDigest_shortmessage_bigendian = {
94  .digest =
95  {
96  0x3121e78c,
97  0x7a56acd5,
98  0xe8454023,
99  0x21acf204,
100  0x922be629,
101  0xf05a2599,
102  0x64362a39,
103  0x196f0631,
104  },
105 };
106 
107 /**
108  * Initialize the HMAC engine. Return `true` if the configuration is valid.
109  */
110 static void test_setup(mmio_region_t base_addr, dif_hmac_t *hmac) {
111  CHECK_DIF_OK(dif_hmac_init(base_addr, hmac));
112 }
113 
114 static void run_test_endianness(const dif_hmac_t *hmac, const char *data,
115  size_t len, const dif_hmac_transaction_t config,
116  const dif_hmac_digest_t *expected_digest) {
117  CHECK_DIF_OK(dif_hmac_mode_sha256_start(hmac, config));
118  CHECK_STATUS_OK(hmac_testutils_push_message(hmac, data, len));
119  CHECK_STATUS_OK(hmac_testutils_fifo_empty_polled(hmac));
120  CHECK_STATUS_OK(hmac_testutils_check_message_length(hmac, len * 8));
121  CHECK_DIF_OK(dif_hmac_process(hmac));
122  CHECK_STATUS_OK(
123  hmac_testutils_finish_and_check_polled(hmac, expected_digest));
124 }
125 
126 bool test_main(void) {
127  LOG_INFO("Running HMAC DIF test...");
128  dif_hmac_t hmac;
130 
131  LOG_INFO(
132  "Running test SHA256 pass little-endian digest and little-endian "
133  "message...");
134  run_test_endianness(&hmac, kData, sizeof(kData), kHmacconfig_littled_littlem,
135  &kExpectedShaDigest);
136 
137  LOG_INFO(
138  "Running test SHA256 with big-endian digest,little-endian message "
139  "config...");
140  run_test_endianness(&hmac, kData, sizeof(kData), kHmacconfig_bigd_littlem,
141  &kExpectedShaDigest_bigendian);
142 
143  LOG_INFO(
144  "Running test SHA256 pass with big-endian digest,big endian message "
145  "config... ");
146  run_test_endianness(&hmac, kData2, sizeof(kData2), kHmacconfig_bigd_bigm,
147  &kExpectedShaDigest_shortmessage_bigendian);
148 
149  LOG_INFO(
150  "Running test SHA256 pass little-endian digest, big endian message "
151  "config... ");
152  run_test_endianness(&hmac, kData2, sizeof(kData2), kHmacconfig_littled_bigm,
153  &kExpectedShaDigest_shortmessage);
154 
155  LOG_INFO(
156  "Running test SHA256 pass big-endian digest, little endian message "
157  "config \n"
158  " with input message byte-swapped to verify the in-built byteswap "
159  "function..");
160  run_test_endianness(&hmac, kData2_endian, sizeof(kData2_endian),
161  kHmacconfig_bigd_littlem,
162  &kExpectedShaDigest_shortmessage_bigendian);
163 
164  return true;
165 }