5 #include "sw/device/lib/crypto/impl/keyblob.h"
9 #include "sw/device/lib/crypto/impl/integrity.h"
10 #include "sw/device/lib/crypto/impl/status.h"
13 #define MODULE_ID MAKE_MODULE_ID('k', 'b', 'b')
27 switch (launder32(key_type)) {
28 case kOtcryptoKeyTypeEcc:
31 return config.key_length + (64 / 8);
32 case kOtcryptoKeyTypeRsa:
36 return config.key_length;
39 HARDENED_CHECK_NE(config.key_mode >> 16, kOtcryptoKeyTypeEcc);
40 HARDENED_CHECK_NE(config.key_mode >> 16, kOtcryptoKeyTypeRsa);
41 return config.key_length;
47 size_t len_bytes = keyblob_share_num_bytes(config);
48 return ceil_div(len_bytes,
sizeof(uint32_t));
54 return kKeyblobHwBackedWords;
57 return 2 * keyblob_share_num_words(config);
70 size_t num_words = keyblob_num_words(key->config);
71 if (launder32(key->keyblob_length) == num_words *
sizeof(uint32_t)) {
73 HARDENED_CHECK_LE(key->keyblob_length /
sizeof(uint32_t), num_words);
76 return OTCRYPTO_BAD_ARGS;
82 HARDENED_TRY(check_keyblob_length(key));
84 size_t key_words = keyblob_share_num_words(key->config);
85 *share0 = key->keyblob;
86 *share1 = &key->keyblob[key_words];
90 void keyblob_from_shares(
const uint32_t *share0,
const uint32_t *share1,
93 size_t share_words = keyblob_share_num_words(config);
98 status_t keyblob_buffer_to_keymgr_diversification(
102 diversification->
version = launder32(keyblob[0]);
108 diversification->
salt[kKeymgrSaltNumWords - 1] = launder32(mode);
112 kKeymgrSaltNumWords - 1),
118 status_t keyblob_to_keymgr_diversification(
122 key->keyblob == NULL) {
123 return OTCRYPTO_BAD_ARGS;
127 if (key->keyblob_length != kKeyblobHwBackedBytes) {
128 return OTCRYPTO_BAD_ARGS;
131 return keyblob_buffer_to_keymgr_diversification(
132 key->keyblob, key->config.key_mode, diversification);
139 return OTCRYPTO_BAD_ARGS;
146 int32_t result = (int32_t)launder32((uint32_t)(OTCRYPTO_OK.value ^ key_type));
147 switch (launder32(key_type)) {
148 case kOtcryptoKeyTypeAes:
150 result ^= launder32(kOtcryptoKeyTypeAes);
152 case kOtcryptoKeyTypeHmac:
154 result ^= launder32(kOtcryptoKeyTypeHmac);
156 case kOtcryptoKeyTypeKmac:
158 result ^= launder32(kOtcryptoKeyTypeKmac);
160 case kOtcryptoKeyTypeKdf:
162 result ^= launder32(kOtcryptoKeyTypeKdf);
164 case kOtcryptoKeyTypeEcc:
166 return OTCRYPTO_BAD_ARGS;
167 case kOtcryptoKeyTypeRsa:
169 return OTCRYPTO_BAD_ARGS;
172 return OTCRYPTO_BAD_ARGS;
174 HARDENED_CHECK_NE(config.key_mode >> 16, kOtcryptoKeyTypeEcc);
175 HARDENED_CHECK_NE(config.key_mode >> 16, kOtcryptoKeyTypeRsa);
181 status_t keyblob_from_key_and_mask(
const uint32_t *key,
const uint32_t *mask,
185 HARDENED_TRY(keyblob_ensure_xor_masked(config));
188 size_t key_words = keyblob_share_num_words(config);
189 uint32_t share0[key_words];
191 for (; launder32(i) < key_words; i++) {
192 share0[i] = key[i] ^ mask[i];
196 keyblob_from_shares(share0, mask, config, keyblob);
202 HARDENED_TRY(keyblob_ensure_xor_masked(key->config));
205 HARDENED_TRY(check_keyblob_length(key));
207 size_t key_share_words = keyblob_share_num_words(key->config);
208 size_t keyblob_words = keyblob_num_words(key->config);
212 for (; launder32(i) < keyblob_words; i++) {
213 key->keyblob[i] ^= mask[i % key_share_words];
218 key->checksum = integrity_blinded_checksum(key);
223 size_t unmasked_key_len, uint32_t *unmasked_key) {
224 if (key == NULL || unmasked_key == NULL) {
225 return OTCRYPTO_BAD_ARGS;
227 if (keyblob_share_num_words(key->config) != unmasked_key_len) {
228 return OTCRYPTO_BAD_ARGS;
233 HARDENED_TRY(keyblob_to_shares(key, &share0, &share1));
235 for (
size_t i = 0; i < unmasked_key_len; i++) {
236 unmasked_key[i] = share0[i] ^ share1[i];
243 HARDENED_TRY(keyblob_to_keymgr_diversification(key, &diversification));
244 return keymgr_generate_key_otbn(diversification);