5 #include "sw/device/lib/crypto/impl/keyblob.h"
9 #include "gmock/gmock.h"
10 #include "gtest/gtest.h"
11 #include "sw/device/lib/crypto/impl/status.h"
14 namespace keyblob_unittest {
16 using ::testing::ElementsAreArray;
18 #define EXPECT_OK(status_) EXPECT_EQ(status_.value, OTCRYPTO_OK.value)
19 #define EXPECT_NOT_OK(status_) EXPECT_NE(status_.value, OTCRYPTO_OK.value)
23 .version = kOtcryptoLibVersion1,
24 .key_mode = kOtcryptoKeyModeAesCtr,
27 .security_level = kOtcryptoKeySecurityLevelLow,
33 .version = kOtcryptoLibVersion1,
34 .key_mode = kOtcryptoKeyModeAesCtr,
37 .security_level = kOtcryptoKeySecurityLevelLow,
43 .version = kOtcryptoLibVersion1,
44 .key_mode = kOtcryptoKeyModeAesCtr,
45 .key_length = SIZE_MAX,
47 .security_level = kOtcryptoKeySecurityLevelLow,
52 .version = kOtcryptoLibVersion1,
53 .key_mode = kOtcryptoKeyModeAesCtr,
56 .security_level = kOtcryptoKeySecurityLevelLow,
61 .version = kOtcryptoLibVersion1,
62 .key_mode = kOtcryptoKeyModeAesOfb,
65 .security_level = kOtcryptoKeySecurityLevelLow,
68 TEST(Keyblob, ShareNumWordsSimpleTest) {
69 size_t share_words = keyblob_share_num_words(kConfigCtr128);
70 EXPECT_GE(share_words *
sizeof(uint32_t), kConfigCtr128.key_length);
71 EXPECT_LT((share_words - 1) *
sizeof(uint32_t), kConfigCtr128.key_length);
74 TEST(Keyblob, ShareNumWordsOdd) {
75 size_t share_words = keyblob_share_num_words(kConfigOddBytes);
76 EXPECT_GE(share_words *
sizeof(uint32_t), kConfigOddBytes.key_length);
77 EXPECT_LT((share_words - 1) *
sizeof(uint32_t), kConfigOddBytes.key_length);
80 TEST(Keyblob, ShareNumWordsHuge) {
81 size_t share_words = keyblob_share_num_words(kConfigHuge);
82 EXPECT_GE(share_words, kConfigHuge.key_length /
sizeof(uint32_t));
83 EXPECT_LT((share_words - 1) *
sizeof(uint32_t), kConfigHuge.key_length);
86 TEST(Keyblob, KeyblobNumWordsSimpleTest) {
87 EXPECT_EQ(keyblob_num_words(kConfigCtr128),
88 2 * keyblob_share_num_words(kConfigCtr128));
91 TEST(Keyblob, KeyblobNumWordsOdd) {
92 EXPECT_EQ(keyblob_num_words(kConfigOddBytes),
93 2 * keyblob_share_num_words(kConfigOddBytes));
96 TEST(Keyblob, KeyblobNumWordsHuge) {
97 EXPECT_EQ(keyblob_num_words(kConfigHuge),
98 2 * keyblob_share_num_words(kConfigHuge));
101 TEST(Keyblob, FromSharesSimpleTest) {
102 std::array<uint32_t, 4> test_share0 = {0x01234567, 0x89abcdef, 0x00010203,
104 std::array<uint32_t, 4> test_share1 = {0x08090a0b, 0x0c0d0e0f, 0x10111213,
108 ASSERT_EQ(test_share0.size(), keyblob_share_num_words(kConfigCtr128));
109 ASSERT_EQ(test_share1.size(), keyblob_share_num_words(kConfigCtr128));
112 size_t keyblob_words = keyblob_num_words(kConfigCtr128);
113 EXPECT_THAT(keyblob_share_num_words(kConfigCtr128), 4);
114 uint32_t keyblob[keyblob_words] = {0};
115 keyblob_from_shares(test_share0.data(), test_share1.data(), kConfigCtr128,
119 for (
size_t i = 0; i < test_share0.size(); i++) {
120 EXPECT_EQ(keyblob[i], test_share0[i]);
122 for (
size_t i = 0; i < test_share1.size(); i++) {
123 EXPECT_EQ(keyblob[test_share0.size() + i], test_share1[i]);
127 TEST(Keyblob, FromToSharesNoop) {
128 std::array<uint32_t, 4> test_share0 = {0x01234567, 0x89abcdef, 0x00010203,
130 std::array<uint32_t, 4> test_share1 = {0x08090a0b, 0x0c0d0e0f, 0x10111213,
134 ASSERT_EQ(test_share0.size(), keyblob_share_num_words(kConfigCtr128));
135 ASSERT_EQ(test_share1.size(), keyblob_share_num_words(kConfigCtr128));
138 size_t keyblob_words = keyblob_num_words(kConfigCtr128);
139 uint32_t keyblob[keyblob_words] = {0};
140 keyblob_from_shares(test_share0.data(), test_share1.data(), kConfigCtr128,
145 .config = kConfigCtr128,
146 .keyblob_length =
sizeof(keyblob),
154 EXPECT_OK(keyblob_to_shares(&key, &share0, &share1));
157 for (
size_t i = 0; i < test_share0.size(); i++) {
158 EXPECT_EQ(share0[i], test_share0[i]);
160 for (
size_t i = 0; i < test_share1.size(); i++) {
161 EXPECT_EQ(share1[i], test_share1[i]);
165 TEST(Keyblob, FromKeyMaskDoesNotChangeKey) {
166 std::array<uint32_t, 4> test_key = {0x01234567, 0x89abcdef, 0x00010203,
168 std::array<uint32_t, 4> test_mask = {0x08090a0b, 0x0c0d0e0f, 0x10111213,
172 ASSERT_EQ(test_key.size(), keyblob_share_num_words(kConfigCtr128));
173 ASSERT_EQ(test_mask.size(), keyblob_share_num_words(kConfigCtr128));
176 size_t keyblob_words = keyblob_num_words(kConfigCtr128);
177 uint32_t keyblob[keyblob_words] = {0};
178 EXPECT_OK(keyblob_from_key_and_mask(test_key.data(), test_mask.data(),
179 kConfigCtr128, keyblob));
183 .config = kConfigCtr128,
184 .keyblob_length =
sizeof(keyblob),
192 EXPECT_OK(keyblob_to_shares(&key, &share0, &share1));
195 for (
size_t i = 0; i < test_key.size(); i++) {
196 uint32_t share0 = keyblob[i];
197 uint32_t share1 = keyblob[test_key.size() + i];
198 EXPECT_EQ(share1, test_mask[i]);
199 EXPECT_EQ(share0 ^ share1, test_key[i]);
203 TEST(Keyblob, ToKeymgrDiversificationSimple) {
205 std::array<uint32_t, 7> test_salt = {0x01234567, 0x89abcdef, 0x00010203,
206 0x04050607, 0x08090a0b, 0x0c0d0e0f,
208 uint32_t test_version = 0xdeadbeef;
211 uint32_t keyblob[test_salt.size() + 1];
212 keyblob[0] = test_version;
213 for (
size_t i = 0; i < test_salt.size(); i++) {
214 keyblob[i + 1] = test_salt[i];
219 .config = kConfigCtrSideloaded,
220 .keyblob_length =
sizeof(keyblob),
227 EXPECT_OK(keyblob_to_keymgr_diversification(&key, &diversification));
230 EXPECT_EQ(diversification.
version, test_version);
231 for (
size_t i = 0; i < test_salt.size(); i++) {
232 EXPECT_EQ(diversification.
salt[i], test_salt[i]);
234 EXPECT_EQ(diversification.
salt[test_salt.size()], key.config.key_mode);
237 TEST(Keyblob, ToKeymgrDiversificationBadlength) {
239 std::array<uint32_t, 6> test_salt = {0x01234567, 0x89abcdef, 0x00010203,
240 0x04050607, 0x08090a0b, 0x0c0d0e0f};
241 uint32_t test_version = 0xdeadbeef;
244 uint32_t keyblob[test_salt.size() + 1];
245 keyblob[0] = test_version;
246 for (
size_t i = 0; i < test_salt.size(); i++) {
247 keyblob[i + 1] = test_salt[i];
252 .config = kConfigCtrSideloaded,
253 .keyblob_length =
sizeof(keyblob),
260 EXPECT_NOT_OK(keyblob_to_keymgr_diversification(&key, &diversification));
263 TEST(Keyblob, ToKeymgrDiversificationDifferentModes) {
265 std::array<uint32_t, 7> test_salt = {0x01234567, 0x89abcdef, 0x00010203,
266 0x04050607, 0x08090a0b, 0x0c0d0e0f,
268 uint32_t test_version = 0xdeadbeef;
271 uint32_t keyblob[test_salt.size() + 1];
272 keyblob[0] = test_version;
273 for (
size_t i = 0; i < test_salt.size(); i++) {
274 keyblob[i + 1] = test_salt[i];
279 .config = kConfigCtrSideloaded,
280 .keyblob_length =
sizeof(keyblob),
287 .config = kConfigOfbSideloaded,
288 .keyblob_length =
sizeof(keyblob),
295 EXPECT_OK(keyblob_to_keymgr_diversification(&key1, &diversification1));
297 EXPECT_OK(keyblob_to_keymgr_diversification(&key2, &diversification2));
300 bool salts_equal =
true;
301 for (
size_t i = 0; i <
ARRAYSIZE(diversification1.
salt); i++) {
302 if (diversification1.
salt[i] != diversification2.
salt[i]) {
306 EXPECT_EQ(salts_equal,
false);
309 TEST(Keyblob, RemaskDoesNotChangeKey) {
310 std::array<uint32_t, 4> test_key = {0x01234567, 0x89abcdef, 0x00010203,
312 std::array<uint32_t, 4> test_mask0 = {0x08090a0b, 0x0c0d0e0f, 0x10111213,
314 std::array<uint32_t, 4> test_mask1 = {0x18191a1b, 0x1c1d1e1f, 0x20212223,
318 ASSERT_EQ(test_key.size(), keyblob_share_num_words(kConfigCtr128));
319 ASSERT_EQ(test_mask0.size(), keyblob_share_num_words(kConfigCtr128));
320 ASSERT_EQ(test_mask1.size(), keyblob_share_num_words(kConfigCtr128));
323 size_t keyblob_words = keyblob_num_words(kConfigCtr128);
324 uint32_t keyblob[keyblob_words] = {0};
325 EXPECT_OK(keyblob_from_key_and_mask(test_key.data(), test_mask0.data(),
326 kConfigCtr128, keyblob));
330 .config = kConfigCtr128,
331 .keyblob_length =
sizeof(keyblob),
337 EXPECT_OK(keyblob_remask(&key, test_mask1.data()));
342 EXPECT_OK(keyblob_to_shares(&key, &share0, &share1));
345 for (
size_t i = 0; i < test_key.size(); i++) {
346 uint32_t share0 = keyblob[i];
347 uint32_t share1 = keyblob[test_key.size() + i];
348 EXPECT_EQ(share1, test_mask0[i] ^ test_mask1[i]);
349 EXPECT_EQ(share0 ^ share1, test_key[i]);
353 TEST(Keyblob, RemaskWithZero) {
354 std::array<uint32_t, 4> test_key = {0x01234567, 0x89abcdef, 0x00010203,
356 std::array<uint32_t, 4> test_mask0 = {0x08090a0b, 0x0c0d0e0f, 0x10111213,
358 std::array<uint32_t, 4> test_mask1 = {0x18191a1b, 0x1c1d1e1f, 0x20212223,
362 ASSERT_EQ(test_key.size(), keyblob_share_num_words(kConfigCtr128));
363 ASSERT_EQ(test_mask0.size(), keyblob_share_num_words(kConfigCtr128));
364 ASSERT_EQ(test_mask1.size(), keyblob_share_num_words(kConfigCtr128));
367 size_t keyblob_words = keyblob_num_words(kConfigCtr128);
368 uint32_t keyblob[keyblob_words] = {0};
369 EXPECT_OK(keyblob_from_key_and_mask(test_key.data(), test_mask0.data(),
370 kConfigCtr128, keyblob));
374 .config = kConfigCtr128,
375 .keyblob_length =
sizeof(keyblob),
381 EXPECT_OK(keyblob_remask(&key, test_mask1.data()));
386 EXPECT_OK(keyblob_to_shares(&key, &share0, &share1));
389 for (
size_t i = 0; i < test_key.size(); i++) {
390 uint32_t share0 = keyblob[i];
391 uint32_t share1 = keyblob[test_key.size() + i];
392 EXPECT_EQ(share1, test_mask0[i] ^ test_mask1[i]);
393 EXPECT_EQ(share0 ^ share1, test_key[i]);