9 #include "sw/device/lib/base/status.h"
10 #include "sw/device/lib/crypto/drivers/kmac.h"
11 #include "sw/device/lib/crypto/impl/integrity.h"
12 #include "sw/device/lib/crypto/impl/keyblob.h"
15 #include "sw/device/lib/testing/test_framework/ujson_ottf.h"
16 #include "sw/device/lib/ujson/ujson.h"
17 #include "sw/device/tests/crypto/cryptotest/json/hash_commands.h"
21 cryptotest_hash_algorithm_t uj_algorithm;
22 cryptotest_hash_shake_digest_length_t uj_shake_digest_length;
23 cryptotest_hash_message_t uj_message;
25 TRY(ujson_deserialize_cryptotest_hash_algorithm_t(uj, &uj_algorithm));
26 TRY(ujson_deserialize_cryptotest_hash_shake_digest_length_t(
27 uj, &uj_shake_digest_length));
28 TRY(ujson_deserialize_cryptotest_hash_message_t(uj, &uj_message));
31 uint8_t msg_buf[uj_message.message_len];
32 memcpy(msg_buf, uj_message.message, uj_message.message_len);
34 .len = uj_message.message_len,
37 uint8_t customization_string_buf[uj_message.customization_string_len];
38 memcpy(customization_string_buf, uj_message.customization_string,
39 uj_message.customization_string_len);
41 .len = uj_message.customization_string_len,
42 .data = customization_string_buf,
56 uint8_t test_stepwise =
false;
58 switch (uj_algorithm) {
59 case kCryptotestHashAlgorithmSha256:
60 mode = kOtcryptoHashModeSha256;
61 digest_len = kSha256DigestWords;
65 case kCryptotestHashAlgorithmSha384:
66 mode = kOtcryptoHashModeSha384;
67 digest_len = kSha384DigestWords;
71 case kCryptotestHashAlgorithmSha512:
72 mode = kOtcryptoHashModeSha512;
73 digest_len = kSha512DigestWords;
77 case kCryptotestHashAlgorithmSha3_224:
78 mode = kOtcryptoHashModeSha3_224;
79 digest_len = kSha3_224DigestWords;
82 case kCryptotestHashAlgorithmSha3_256:
83 mode = kOtcryptoHashModeSha3_256;
84 digest_len = kSha3_256DigestWords;
87 case kCryptotestHashAlgorithmSha3_384:
88 mode = kOtcryptoHashModeSha3_384;
89 digest_len = kSha3_384DigestWords;
92 case kCryptotestHashAlgorithmSha3_512:
93 mode = kOtcryptoHashModeSha3_512;
94 digest_len = kSha3_512DigestWords;
97 case kCryptotestHashAlgorithmShake128:
98 mode = kOtcryptoHashXofModeShake128;
99 digest_len =
ceil_div(uj_shake_digest_length.length,
sizeof(uint32_t));
102 case kCryptotestHashAlgorithmShake256:
103 mode = kOtcryptoHashXofModeShake256;
104 digest_len =
ceil_div(uj_shake_digest_length.length,
sizeof(uint32_t));
107 case kCryptotestHashAlgorithmCshake128:
108 mode = kOtcryptoHashXofModeCshake128;
109 digest_len =
ceil_div(uj_shake_digest_length.length,
sizeof(uint32_t));
111 case kCryptotestHashAlgorithmCshake256:
112 mode = kOtcryptoHashXofModeCshake256;
113 digest_len =
ceil_div(uj_shake_digest_length.length,
sizeof(uint32_t));
116 LOG_ERROR(
"Unsupported hash algorithm: %d", uj_algorithm);
117 return INVALID_ARGUMENT();
121 uint32_t digest_buf[digest_len];
122 memset(digest_buf, 0, digest_len *
sizeof(uint32_t));
130 switch (uj_algorithm) {
131 case kCryptotestHashAlgorithmCshake128:
133 case kCryptotestHashAlgorithmCshake256:
135 customization_string, digest);
138 status = hash_oneshot(input_message, digest);
140 if (
status.value != kOtcryptoStatusValueOk) {
142 return INTERNAL(
status.value);
144 cryptotest_hash_output_t uj_output;
145 uj_output.digest_len = digest_len *
sizeof(uint32_t);
147 memcpy(uj_output.oneshot_digest, digest_buf, digest_len *
sizeof(uint32_t));
150 memset(digest_buf, 0, digest_len *
sizeof(uint32_t));
155 if (
status.value != kOtcryptoStatusValueOk) {
156 return INTERNAL(
status.value);
161 .len = uj_message.message_len / 2,
165 .len =
ceil_div(uj_message.message_len, 2),
166 .data = &msg_buf[uj_message.message_len / 2],
169 if (
status.value != kOtcryptoStatusValueOk) {
170 return INTERNAL(
status.value);
173 if (
status.value != kOtcryptoStatusValueOk) {
174 return INTERNAL(
status.value);
177 if (
status.value != kOtcryptoStatusValueOk) {
178 return INTERNAL(
status.value);
181 memcpy(uj_output.stepwise_digest, digest_buf,
182 digest_len *
sizeof(uint32_t));
185 RESP_OK(ujson_serialize_cryptotest_hash_output_t, uj, &uj_output);