9 #include "gmock/gmock.h"
10 #include "gtest/gtest.h"
11 #include "sw/device/lib/crypto/impl/keyblob.h"
12 #include "sw/device/lib/crypto/impl/status.h"
15 namespace key_transport_unittest {
17 using ::testing::ElementsAreArray;
21 .version = kOtcryptoLibVersion1,
22 .key_mode = kOtcryptoKeyModeAesCtr,
23 .key_length = 128 / 8,
26 .security_level = kOtcryptoKeySecurityLevelLow,
31 .version = kOtcryptoLibVersion1,
32 .key_mode = kOtcryptoKeyModeRsaSignPkcs,
33 .key_length = 2048 / 8,
36 .security_level = kOtcryptoKeySecurityLevelLow,
41 .version = kOtcryptoLibVersion1,
42 .key_mode = kOtcryptoKeyModeAesCtr,
43 .key_length = 128 / 8,
46 .security_level = kOtcryptoKeySecurityLevelLow,
51 .version = kOtcryptoLibVersion1,
52 .key_mode = kOtcryptoKeyModeAesCtr,
53 .key_length = 128 / 8,
56 .security_level = kOtcryptoKeySecurityLevelLow,
59 TEST(KeyTransport, HwBackedKeyToDiversificationData) {
60 uint32_t test_version = 0xf0f1f2f3;
61 std::array<uint32_t, 7> test_salt = {0x01234567, 0x89abcdef, 0x00010203,
62 0x04050607, 0x08090a0b, 0x0c0d0e0f,
66 uint32_t keyblob[32] = {0};
68 .config = kConfigHwBackedAesCtr128,
80 status_ok(keyblob_to_keymgr_diversification(&key, &diversification)),
82 EXPECT_EQ(diversification.
version, test_version);
83 for (
size_t i = 0; i < kKeymgrSaltNumWords - 1; i++) {
84 EXPECT_EQ(diversification.
salt[i], test_salt[i]);
86 EXPECT_EQ(diversification.
salt[kKeymgrSaltNumWords - 1],
87 kConfigHwBackedAesCtr128.key_mode);
90 TEST(KeyTransport, HwBackedRsaKeyFails) {
91 uint32_t test_version = 0xf0f1f2f3;
92 std::array<uint32_t, 7> test_salt = {0x01234567, 0x89abcdef, 0x00010203,
93 0x04050607, 0x08090a0b, 0x0c0d0e0f,
97 uint32_t keyblob[32] = {0};
99 .config = kConfigRsaInvalid,
100 .keyblob_length = 32,
110 TEST(KeyTransport, BlindedKeyImportExport) {
111 std::array<uint32_t, 4> share0 = {0x00010203, 0x04050607, 0x08090a0b,
113 std::array<uint32_t, 4> share1 = {0xf0f1f2f3, 0xf4f5f6f7, 0xf8f9fafb,
117 std::array<uint32_t, 4> unmasked_key;
118 for (
size_t i = 0; i < unmasked_key.size(); i++) {
119 unmasked_key[i] = share0[i] ^ share1[i];
122 uint32_t keyblob[share0.size() * 2];
124 .config = kConfigExportableAesCtr128,
125 .keyblob_length =
sizeof(keyblob),
132 .data = share0.data(),
133 .len = share0.size(),
136 .data = share1.data(),
137 .len = share1.size(),
143 memset(share0.data(), 0,
sizeof(share0));
144 memset(share1.data(), 0,
sizeof(share1));
148 .data = share0.data(),
149 .len = share0.size(),
152 .data = share1.data(),
153 .len = share1.size(),
160 for (
size_t i = 0; i < unmasked_key.size(); i++) {
161 EXPECT_EQ(unmasked_key[i], share0[i] ^ share1[i]);
165 TEST(KeyTransport, BlindedKeyImportBadLengths) {
166 std::array<uint32_t, 4> share0 = {0x00010203, 0x04050607, 0x08090a0b,
168 std::array<uint32_t, 4> share1 = {0xf0f1f2f3, 0xf4f5f6f7, 0xf8f9fafb,
172 uint32_t keyblob[share0.size() * 2];
174 .config = kConfigExportableAesCtr128,
175 .keyblob_length =
sizeof(keyblob),
182 .data = share0.data(),
183 .len = share0.size() - 1,
186 .data = share1.data(),
187 .len = share1.size(),
195 .data = share0.data(),
196 .len = share0.size(),
199 .data = share1.data(),
200 .len = share1.size() - 1,
207 .config = kConfigExportableAesCtr128,
208 .keyblob_length =
sizeof(keyblob) - 1,
213 .data = share0.data(),
214 .len = share0.size(),
217 .data = share1.data(),
218 .len = share1.size(),
224 TEST(KeyTransport, BlindedKeyExportBadLengths) {
225 std::array<uint32_t, 4> share0 = {0x00010203, 0x04050607, 0x08090a0b,
227 std::array<uint32_t, 4> share1 = {0xf0f1f2f3, 0xf4f5f6f7, 0xf8f9fafb,
231 uint32_t keyblob[share0.size() * 2];
233 .config = kConfigExportableAesCtr128,
234 .keyblob_length =
sizeof(keyblob),
241 .data = share0.data(),
242 .len = share0.size(),
245 .data = share1.data(),
246 .len = share1.size(),
252 .data = share0.data(),
253 .len = share0.size(),
256 .data = share1.data(),
257 .len = share1.size() - 1,
262 blinded_key, share_with_bad_length, share_with_good_length)),
267 blinded_key, share_with_good_length, share_with_bad_length)),
272 .config = kConfigExportableAesCtr128,
273 .keyblob_length =
sizeof(keyblob) - 1,
278 bad_blinded_key, share_with_good_length, share_with_good_length)),
282 TEST(KeyTransport, BlindedKeyExportNotExportable) {
283 std::array<uint32_t, 4> share0 = {0x00010203, 0x04050607, 0x08090a0b,
285 std::array<uint32_t, 4> share1 = {0xf0f1f2f3, 0xf4f5f6f7, 0xf8f9fafb,
289 uint32_t keyblob[share0.size() * 2];
291 .config = kConfigNonExportableAesCtr128,
292 .keyblob_length =
sizeof(keyblob),
299 .data = share0.data(),
300 .len = share0.size(),
303 .data = share1.data(),
304 .len = share1.size(),
311 .data = share0.data(),
312 .len = share0.size(),
315 .data = share1.data(),
316 .len = share1.size(),