6 #include "sw/device/lib/base/status.h"
7 #include "sw/device/lib/crypto/impl/integrity.h"
8 #include "sw/device/lib/crypto/impl/keyblob.h"
12 #include "sw/device/lib/testing/test_framework/ujson_ottf.h"
13 #include "sw/device/lib/ujson/ujson.h"
14 #include "sw/device/tests/crypto/cryptotest/json/hmac_commands.h"
16 const unsigned int kOtcryptoHmacTagBytesSha256 = 32;
17 const unsigned int kOtcryptoHmacTagBytesSha384 = 48;
18 const unsigned int kOtcryptoHmacTagBytesSha512 = 64;
20 const int MaxTagBytes = kOtcryptoHmacTagBytesSha512;
21 const int MaxTagWords = MaxTagBytes /
sizeof(uint32_t);
25 static const uint32_t kTestMask[48] = {
26 0xBA81767F, 0xA913C751, 0x34209992, 0x5F66021B, 0x775F4577, 0x7C02E1CE,
27 0xB4A8B698, 0x1986B902, 0x7251045B, 0x3C827C6F, 0x00909D12, 0x81ABC8F9,
28 0x62F2FCB6, 0x15B63124, 0x66F60052, 0xAD637669, 0x522779CF, 0x07E9FBA8,
29 0x1258E541, 0x860719EF, 0x1D4F5386, 0xA9B04F7C, 0x6E98A861, 0xEFADEBA6,
30 0x900E1EC8, 0xB290DBCE, 0x05946814, 0xB83A01CE, 0x4EEC86BD, 0xAE836C6C,
31 0x20182AAE, 0x4476F6F4, 0x7C4A0A31, 0x7D2809BA, 0x367B29B9, 0x42444BEA,
32 0xDFD6025C, 0x1E665207, 0x18E0895B, 0x20D435DB, 0xC509A6D6, 0x8CC19AB1,
33 0xA5D39BD2, 0xAB479AD5, 0x5786D029, 0x2E4B7CD7, 0xB77A3D76, 0xE2A09962,
38 cryptotest_hmac_hash_alg_t uj_hash_alg;
39 cryptotest_hmac_key_t uj_key;
40 cryptotest_hmac_message_t uj_message;
42 TRY(ujson_deserialize_cryptotest_hmac_hash_alg_t(uj, &uj_hash_alg));
43 TRY(ujson_deserialize_cryptotest_hmac_key_t(uj, &uj_key));
44 TRY(ujson_deserialize_cryptotest_hmac_message_t(uj, &uj_message));
47 unsigned int tag_bytes;
48 switch (uj_hash_alg) {
49 case kCryptotestHmacHashAlgSha256:
50 key_mode = kOtcryptoKeyModeHmacSha256;
51 tag_bytes = kOtcryptoHmacTagBytesSha256;
53 case kCryptotestHmacHashAlgSha384:
54 key_mode = kOtcryptoKeyModeHmacSha384;
55 tag_bytes = kOtcryptoHmacTagBytesSha384;
57 case kCryptotestHmacHashAlgSha512:
58 key_mode = kOtcryptoKeyModeHmacSha512;
59 tag_bytes = kOtcryptoHmacTagBytesSha512;
62 LOG_ERROR(
"Unsupported HMAC key mode: %d", uj_hash_alg);
63 return INVALID_ARGUMENT();
67 .version = kOtcryptoLibVersion1,
69 .key_length = uj_key.key_len,
71 .security_level = kOtcryptoKeySecurityLevelLow,
74 uint32_t key_buf[uj_key.key_len];
75 memcpy(key_buf, uj_key.key, uj_key.key_len);
77 uint32_t keyblob[keyblob_num_words(config)];
79 TRY(keyblob_from_key_and_mask(key_buf, kTestMask, config, keyblob));
82 .keyblob_length =
sizeof(keyblob),
87 uint8_t msg_buf[uj_message.message_len];
88 memcpy(msg_buf, uj_message.message, uj_message.message_len);
90 .len = uj_message.message_len,
95 uint32_t tag_buf[MaxTagWords];
97 .len = tag_bytes /
sizeof(uint32_t),
101 if (
status.value != kOtcryptoStatusValueOk) {
102 return INTERNAL(
status.value);
105 cryptotest_hmac_tag_t uj_tag;
106 memcpy(uj_tag.tag, tag_buf, tag_bytes);
107 uj_tag.tag_len = tag_bytes;
110 RESP_OK(ujson_serialize_cryptotest_hmac_tag_t, uj, &uj_tag);