8 #include "sw/device/lib/crypto/drivers/kmac.h"
9 #include "sw/device/lib/crypto/impl/integrity.h"
10 #include "sw/device/lib/crypto/impl/keyblob.h"
11 #include "sw/device/lib/crypto/impl/status.h"
14 #define MODULE_ID MAKE_MODULE_ID('k', 'm', 'c')
19 size_t required_output_len,
24 if (key == NULL || key->keyblob == NULL || tag.data == NULL) {
25 return OTCRYPTO_BAD_ARGS;
29 if (input_message.data == NULL && input_message.len != 0) {
30 return OTCRYPTO_BAD_ARGS;
34 if (customization_string.data == NULL && customization_string.len != 0) {
35 return OTCRYPTO_BAD_ARGS;
39 if (required_output_len != tag.len *
sizeof(uint32_t) ||
40 required_output_len == 0) {
41 return OTCRYPTO_BAD_ARGS;
44 size_t key_len = keyblob_share_num_words(key->config) *
sizeof(uint32_t);
47 HARDENED_TRY(kmac_key_length_check(key_len));
51 return OTCRYPTO_BAD_ARGS;
57 .hw_backed = key->config.hw_backed,
62 if (key_len != kKmacSideloadKeyLength / 8) {
63 return OTCRYPTO_BAD_ARGS;
70 HARDENED_TRY(keyblob_to_keymgr_diversification(key, &diversification));
71 HARDENED_TRY(keymgr_generate_key_kmac(diversification));
74 if (key->keyblob_length != 2 * key->config.key_length) {
75 return OTCRYPTO_BAD_ARGS;
77 HARDENED_TRY(keyblob_to_shares(key, &kmac_key.share0, &kmac_key.share1));
79 return OTCRYPTO_BAD_ARGS;
82 switch (key->config.key_mode) {
83 case kOtcryptoKeyModeKmac128:
84 HARDENED_TRY(kmac_kmac_128(
86 input_message.len, customization_string.data,
87 customization_string.len, tag.data, tag.len));
89 case kOtcryptoKeyModeKmac256:
90 HARDENED_TRY(kmac_kmac_256(
92 input_message.len, customization_string.data,
93 customization_string.len, tag.data, tag.len));
96 return OTCRYPTO_BAD_ARGS;
100 HARDENED_TRY(keymgr_sideload_clear_kmac());
102 return OTCRYPTO_BAD_ARGS;