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]);