updated build system
This commit is contained in:
		| @@ -35,7 +35,8 @@ TEST(utils_encrypting_reader, read_file_data) { | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token); | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, | ||||
|         std::nullopt); | ||||
|  | ||||
|     for (std::uint8_t i = 0U; i < 8U; i++) { | ||||
|       data_buffer buffer( | ||||
| @@ -76,14 +77,14 @@ TEST(utils_encrypting_reader, read_file_data_using_argon2id) { | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, cfg); | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, cfg, | ||||
|         std::nullopt); | ||||
|  | ||||
|     std::array<std::uint8_t, utils::encryption::kdf_config::size()> hdr; | ||||
|     EXPECT_EQ(hdr.size(), utils::encryption::encrypting_reader::reader_function( | ||||
|                               reinterpret_cast<char *>(hdr.data()), hdr.size(), | ||||
|                               1U, &reader)); | ||||
|     EXPECT_TRUE(utils::encryption::kdf_config::from_header(hdr, cfg)); | ||||
|     // EXPECT_EQ(cfg, reader.get_kdf_config().value()); | ||||
|  | ||||
|     for (std::uint8_t i = 0U; i < 8U; i++) { | ||||
|       data_buffer buffer( | ||||
| @@ -98,7 +99,62 @@ TEST(utils_encrypting_reader, read_file_data_using_argon2id) { | ||||
|  | ||||
|       data_buffer decrypted_data; | ||||
|       EXPECT_TRUE(utils::encryption::decrypt_data( | ||||
|           token, *reader.get_kdf_config(), buffer, decrypted_data)); | ||||
|           token, *reader.get_kdf_config_for_data(), buffer, decrypted_data)); | ||||
|  | ||||
|       EXPECT_EQ(utils::encryption::encrypting_reader::get_data_chunk_size(), | ||||
|                 decrypted_data.size()); | ||||
|  | ||||
|       std::size_t bytes_read{}; | ||||
|       data_buffer file_data(decrypted_data.size()); | ||||
|       EXPECT_TRUE(source_file.read( | ||||
|           file_data, | ||||
|           utils::encryption::encrypting_reader::get_data_chunk_size() * i, | ||||
|           &bytes_read)); | ||||
|       EXPECT_EQ(0, std::memcmp(file_data.data(), decrypted_data.data(), | ||||
|                                file_data.size())); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(utils_encrypting_reader, read_file_data_using_argon2id_master_key) { | ||||
|   const auto token = std::string("moose"); | ||||
|   utils::encryption::kdf_config cfg; | ||||
|  | ||||
|   auto master_key = | ||||
|       utils::encryption::generate_key<utils::hash::hash_256_t>(token, cfg); | ||||
|  | ||||
|   auto &source_file = test::create_random_file( | ||||
|       8U * utils::encryption::encrypting_reader::get_data_chunk_size()); | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, master_key, cfg, | ||||
|         std::nullopt); | ||||
|  | ||||
|     std::array<std::uint8_t, utils::encryption::kdf_config::size()> hdr; | ||||
|     EXPECT_EQ(hdr.size(), utils::encryption::encrypting_reader::reader_function( | ||||
|                               reinterpret_cast<char *>(hdr.data()), hdr.size(), | ||||
|                               1U, &reader)); | ||||
|     EXPECT_TRUE(utils::encryption::kdf_config::from_header(hdr, cfg)); | ||||
|  | ||||
|     for (std::uint8_t i = 0U; i < 8U; i++) { | ||||
|       data_buffer buffer( | ||||
|           utils::encryption::encrypting_reader::get_encrypted_chunk_size()); | ||||
|       for (std::uint8_t j = 0U; j < 2U; j++) { | ||||
|         ASSERT_EQ( | ||||
|             buffer.size() / 2U, | ||||
|             utils::encryption::encrypting_reader::reader_function( | ||||
|                 reinterpret_cast<char *>(&buffer[(buffer.size() / 2U) * j]), | ||||
|                 buffer.size() / 2U, 1U, &reader)); | ||||
|       } | ||||
|  | ||||
|       auto data_cfg = *reader.get_kdf_config_for_data(); | ||||
|       utils::hash::hash_256_t data_key; | ||||
|       std::tie(data_key, std::ignore) = cfg.create_subkey( | ||||
|           utils::encryption::kdf_context::data, data_cfg.unique_id, master_key); | ||||
|       data_buffer decrypted_data; | ||||
|       EXPECT_TRUE( | ||||
|           utils::encryption::decrypt_data(data_key, buffer, decrypted_data)); | ||||
|  | ||||
|       EXPECT_EQ(utils::encryption::encrypting_reader::get_data_chunk_size(), | ||||
|                 decrypted_data.size()); | ||||
| @@ -122,7 +178,8 @@ TEST(utils_encrypting_reader, read_file_data_in_multiple_chunks) { | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token); | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, | ||||
|         std::nullopt); | ||||
|  | ||||
|     for (std::uint8_t i = 0U; i < 8U; i += 2U) { | ||||
|       data_buffer buffer( | ||||
| @@ -172,14 +229,14 @@ TEST(utils_encrypting_reader, | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, cfg); | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, cfg, | ||||
|         std::nullopt); | ||||
|  | ||||
|     std::array<std::uint8_t, utils::encryption::kdf_config::size()> hdr; | ||||
|     EXPECT_EQ(hdr.size(), utils::encryption::encrypting_reader::reader_function( | ||||
|                               reinterpret_cast<char *>(hdr.data()), hdr.size(), | ||||
|                               1U, &reader)); | ||||
|     EXPECT_TRUE(utils::encryption::kdf_config::from_header(hdr, cfg)); | ||||
|     // EXPECT_EQ(cfg, reader.get_kdf_config().value()); | ||||
|  | ||||
|     for (std::uint8_t i = 0U; i < 8U; i += 2U) { | ||||
|       data_buffer buffer( | ||||
| @@ -194,7 +251,72 @@ TEST(utils_encrypting_reader, | ||||
|         data_buffer decrypted_data; | ||||
|         const auto offset = (j * (buffer.size() / 2U)); | ||||
|         EXPECT_TRUE(utils::encryption::decrypt_data( | ||||
|             token, *reader.get_kdf_config(), | ||||
|             token, *reader.get_kdf_config_for_data(), | ||||
|             data_buffer( | ||||
|                 std::next(buffer.begin(), static_cast<std::int64_t>(offset)), | ||||
|                 std::next(buffer.begin(), static_cast<std::int64_t>( | ||||
|                                               offset + (buffer.size() / 2U)))), | ||||
|             decrypted_data)); | ||||
|  | ||||
|         EXPECT_EQ(utils::encryption::encrypting_reader::get_data_chunk_size(), | ||||
|                   decrypted_data.size()); | ||||
|  | ||||
|         std::size_t bytes_read{}; | ||||
|         data_buffer file_data(decrypted_data.size()); | ||||
|         EXPECT_TRUE(source_file.read( | ||||
|             file_data, | ||||
|             (utils::encryption::encrypting_reader::get_data_chunk_size() * i) + | ||||
|                 (j * | ||||
|                  utils::encryption::encrypting_reader::get_data_chunk_size()), | ||||
|             &bytes_read)); | ||||
|         EXPECT_EQ(0, std::memcmp(file_data.data(), decrypted_data.data(), | ||||
|                                  file_data.size())); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(utils_encrypting_reader, | ||||
|      read_file_data_in_multiple_chunks_using_argon2id_master_key) { | ||||
|   const auto token = std::string("moose"); | ||||
|   utils::encryption::kdf_config cfg; | ||||
|  | ||||
|   auto master_key = | ||||
|       utils::encryption::generate_key<utils::hash::hash_256_t>(token, cfg); | ||||
|  | ||||
|   auto &source_file = test::create_random_file( | ||||
|       8U * utils::encryption::encrypting_reader::get_data_chunk_size()); | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, master_key, cfg, | ||||
|         std::nullopt); | ||||
|  | ||||
|     std::array<std::uint8_t, utils::encryption::kdf_config::size()> hdr; | ||||
|     EXPECT_EQ(hdr.size(), utils::encryption::encrypting_reader::reader_function( | ||||
|                               reinterpret_cast<char *>(hdr.data()), hdr.size(), | ||||
|                               1U, &reader)); | ||||
|     EXPECT_TRUE(utils::encryption::kdf_config::from_header(hdr, cfg)); | ||||
|  | ||||
|     for (std::uint8_t i = 0U; i < 8U; i += 2U) { | ||||
|       data_buffer buffer( | ||||
|           utils::encryption::encrypting_reader::get_encrypted_chunk_size() * | ||||
|           2U); | ||||
|       EXPECT_EQ(buffer.size(), | ||||
|                 utils::encryption::encrypting_reader::reader_function( | ||||
|                     reinterpret_cast<char *>(buffer.data()), buffer.size(), 1U, | ||||
|                     &reader)); | ||||
|  | ||||
|       auto data_cfg = *reader.get_kdf_config_for_data(); | ||||
|       utils::hash::hash_256_t data_key; | ||||
|       std::tie(data_key, std::ignore) = cfg.create_subkey( | ||||
|           utils::encryption::kdf_context::data, data_cfg.unique_id, master_key); | ||||
|  | ||||
|       for (std::uint8_t j = 0U; j < 2U; j++) { | ||||
|         data_buffer decrypted_data; | ||||
|         const auto offset = (j * (buffer.size() / 2U)); | ||||
|         EXPECT_TRUE(utils::encryption::decrypt_data( | ||||
|             data_key, | ||||
|             data_buffer( | ||||
|                 std::next(buffer.begin(), static_cast<std::int64_t>(offset)), | ||||
|                 std::next(buffer.begin(), static_cast<std::int64_t>( | ||||
| @@ -226,7 +348,8 @@ TEST(utils_encrypting_reader, read_file_data_as_stream) { | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token); | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, | ||||
|         std::nullopt); | ||||
|     auto io_stream = reader.create_iostream(); | ||||
|     EXPECT_FALSE(io_stream->seekg(0, std::ios_base::end).fail()); | ||||
|     EXPECT_TRUE(io_stream->good()); | ||||
| @@ -280,7 +403,8 @@ TEST(utils_encrypting_reader, read_file_data_as_stream_using_argon2id) { | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, cfg); | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, cfg, | ||||
|         std::nullopt); | ||||
|     auto io_stream = reader.create_iostream(); | ||||
|     EXPECT_FALSE(io_stream->seekg(0, std::ios_base::end).fail()); | ||||
|     EXPECT_TRUE(io_stream->good()); | ||||
| @@ -310,7 +434,73 @@ TEST(utils_encrypting_reader, read_file_data_as_stream_using_argon2id) { | ||||
|  | ||||
|       data_buffer decrypted_data; | ||||
|       EXPECT_TRUE(utils::encryption::decrypt_data( | ||||
|           token, *reader.get_kdf_config(), buffer, decrypted_data)); | ||||
|           token, *reader.get_kdf_config_for_data(), buffer, decrypted_data)); | ||||
|  | ||||
|       EXPECT_EQ(utils::encryption::encrypting_reader::get_data_chunk_size(), | ||||
|                 decrypted_data.size()); | ||||
|  | ||||
|       std::size_t bytes_read{}; | ||||
|       data_buffer file_data(decrypted_data.size()); | ||||
|       EXPECT_TRUE(source_file.read( | ||||
|           file_data, | ||||
|           utils::encryption::encrypting_reader::get_data_chunk_size() * i, | ||||
|           &bytes_read)); | ||||
|       EXPECT_EQ(0, std::memcmp(file_data.data(), decrypted_data.data(), | ||||
|                                file_data.size())); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(utils_encrypting_reader, | ||||
|      read_file_data_as_stream_using_argon2id_master_key) { | ||||
|   const auto token = std::string("moose"); | ||||
|   utils::encryption::kdf_config cfg; | ||||
|  | ||||
|   auto master_key = | ||||
|       utils::encryption::generate_key<utils::hash::hash_256_t>(token, cfg); | ||||
|  | ||||
|   auto &source_file = test::create_random_file( | ||||
|       8U * utils::encryption::encrypting_reader::get_data_chunk_size()); | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, master_key, cfg, | ||||
|         std::nullopt); | ||||
|     auto io_stream = reader.create_iostream(); | ||||
|     EXPECT_FALSE(io_stream->seekg(0, std::ios_base::end).fail()); | ||||
|     EXPECT_TRUE(io_stream->good()); | ||||
|     EXPECT_EQ(reader.get_total_size(), | ||||
|               static_cast<std::uint64_t>(io_stream->tellg())); | ||||
|     EXPECT_FALSE(io_stream->seekg(0, std::ios_base::beg).fail()); | ||||
|     EXPECT_TRUE(io_stream->good()); | ||||
|  | ||||
|     for (std::uint8_t i = 0U; i < 8U; i++) { | ||||
|       data_buffer buffer( | ||||
|           utils::encryption::encrypting_reader::get_encrypted_chunk_size()); | ||||
|       EXPECT_FALSE( | ||||
|           io_stream | ||||
|               ->seekg(static_cast<std::streamoff>( | ||||
|                   i * buffer.size() + utils::encryption::kdf_config::size())) | ||||
|               .fail()); | ||||
|       EXPECT_TRUE(io_stream->good()); | ||||
|       for (std::uint8_t j = 0U; j < 2U; j++) { | ||||
|         EXPECT_FALSE( | ||||
|             io_stream | ||||
|                 ->read( | ||||
|                     reinterpret_cast<char *>(&buffer[(buffer.size() / 2U) * j]), | ||||
|                     static_cast<std::streamsize>(buffer.size()) / 2U) | ||||
|                 .fail()); | ||||
|         EXPECT_TRUE(io_stream->good()); | ||||
|       } | ||||
|  | ||||
|       auto data_cfg = *reader.get_kdf_config_for_data(); | ||||
|       utils::hash::hash_256_t data_key; | ||||
|       std::tie(data_key, std::ignore) = cfg.create_subkey( | ||||
|           utils::encryption::kdf_context::data, data_cfg.unique_id, master_key); | ||||
|  | ||||
|       data_buffer decrypted_data; | ||||
|       EXPECT_TRUE( | ||||
|           utils::encryption::decrypt_data(data_key, buffer, decrypted_data)); | ||||
|  | ||||
|       EXPECT_EQ(utils::encryption::encrypting_reader::get_data_chunk_size(), | ||||
|                 decrypted_data.size()); | ||||
| @@ -334,7 +524,8 @@ TEST(utils_encrypting_reader, read_file_data_in_multiple_chunks_as_stream) { | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token); | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, | ||||
|         std::nullopt); | ||||
|     auto io_stream = reader.create_iostream(); | ||||
|     EXPECT_FALSE(io_stream->seekg(0, std::ios_base::end).fail()); | ||||
|     EXPECT_TRUE(io_stream->good()); | ||||
| @@ -392,7 +583,8 @@ TEST(utils_encrypting_reader, | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, cfg); | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, token, cfg, | ||||
|         std::nullopt); | ||||
|     auto io_stream = reader.create_iostream(); | ||||
|     EXPECT_FALSE(io_stream->seekg(0, std::ios_base::end).fail()); | ||||
|     EXPECT_TRUE(io_stream->good()); | ||||
| @@ -420,7 +612,79 @@ TEST(utils_encrypting_reader, | ||||
|         data_buffer decrypted_data; | ||||
|         const auto offset = (j * (buffer.size() / 2U)); | ||||
|         EXPECT_TRUE(utils::encryption::decrypt_data( | ||||
|             token, *reader.get_kdf_config(), | ||||
|             token, *reader.get_kdf_config_for_data(), | ||||
|             data_buffer( | ||||
|                 std::next(buffer.begin(), static_cast<std::int64_t>(offset)), | ||||
|                 std::next(buffer.begin(), static_cast<std::int64_t>( | ||||
|                                               offset + (buffer.size() / 2U)))), | ||||
|             decrypted_data)); | ||||
|  | ||||
|         EXPECT_EQ(utils::encryption::encrypting_reader::get_data_chunk_size(), | ||||
|                   decrypted_data.size()); | ||||
|  | ||||
|         std::size_t bytes_read{}; | ||||
|         data_buffer file_data(decrypted_data.size()); | ||||
|         EXPECT_TRUE(source_file.read( | ||||
|             file_data, | ||||
|             (utils::encryption::encrypting_reader::get_data_chunk_size() * i) + | ||||
|                 (j * | ||||
|                  utils::encryption::encrypting_reader::get_data_chunk_size()), | ||||
|             &bytes_read)); | ||||
|         EXPECT_EQ(0, std::memcmp(file_data.data(), decrypted_data.data(), | ||||
|                                  file_data.size())); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(utils_encrypting_reader, | ||||
|      read_file_data_in_multiple_chunks_as_stream_using_argon2id_master_key) { | ||||
|   const auto token = std::string("moose"); | ||||
|   utils::encryption::kdf_config cfg; | ||||
|  | ||||
|   auto master_key = | ||||
|       utils::encryption::generate_key<utils::hash::hash_256_t>(token, cfg); | ||||
|  | ||||
|   auto &source_file = test::create_random_file( | ||||
|       8u * utils::encryption::encrypting_reader::get_data_chunk_size()); | ||||
|   EXPECT_TRUE(source_file); | ||||
|   if (source_file) { | ||||
|     utils::encryption::encrypting_reader reader( | ||||
|         "test.dat", source_file.get_path(), get_stop_requested, master_key, cfg, | ||||
|         std::nullopt); | ||||
|     auto io_stream = reader.create_iostream(); | ||||
|     EXPECT_FALSE(io_stream->seekg(0, std::ios_base::end).fail()); | ||||
|     EXPECT_TRUE(io_stream->good()); | ||||
|     EXPECT_EQ(reader.get_total_size(), | ||||
|               static_cast<std::uint64_t>(io_stream->tellg())); | ||||
|     EXPECT_FALSE(io_stream->seekg(0, std::ios_base::beg).fail()); | ||||
|     EXPECT_TRUE(io_stream->good()); | ||||
|  | ||||
|     EXPECT_FALSE(io_stream | ||||
|                      ->seekg(static_cast<std::streamoff>( | ||||
|                          utils::encryption::kdf_config::size())) | ||||
|                      .fail()); | ||||
|  | ||||
|     for (std::uint8_t i = 0U; i < 8U; i += 2U) { | ||||
|       data_buffer buffer( | ||||
|           utils::encryption::encrypting_reader::get_encrypted_chunk_size() * | ||||
|           2U); | ||||
|       EXPECT_FALSE(io_stream | ||||
|                        ->read(reinterpret_cast<char *>(buffer.data()), | ||||
|                               static_cast<std::streamsize>(buffer.size())) | ||||
|                        .fail()); | ||||
|       EXPECT_TRUE(io_stream->good()); | ||||
|  | ||||
|       auto data_cfg = *reader.get_kdf_config_for_data(); | ||||
|       utils::hash::hash_256_t data_key; | ||||
|       std::tie(data_key, std::ignore) = cfg.create_subkey( | ||||
|           utils::encryption::kdf_context::data, data_cfg.unique_id, master_key); | ||||
|  | ||||
|       for (std::uint8_t j = 0U; j < 2U; j++) { | ||||
|         data_buffer decrypted_data; | ||||
|         const auto offset = (j * (buffer.size() / 2U)); | ||||
|         EXPECT_TRUE(utils::encryption::decrypt_data( | ||||
|             data_key, | ||||
|             data_buffer( | ||||
|                 std::next(buffer.begin(), static_cast<std::int64_t>(offset)), | ||||
|                 std::next(buffer.begin(), static_cast<std::int64_t>( | ||||
|   | ||||
| @@ -27,40 +27,41 @@ namespace repertory { | ||||
| TEST(utils_encryption_kdf_config, can_construct_using_default_constructor) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|  | ||||
|   EXPECT_EQ(utils::encryption::kdf_config::repertory_magic, cfg.magic); | ||||
|   EXPECT_EQ(utils::encryption::kdf_version::v1, cfg.version); | ||||
|   EXPECT_EQ(utils::encryption::kdf_type::argon2id, cfg.kdf); | ||||
|   EXPECT_EQ(utils::encryption::memlimit_level::level3, cfg.memlimit); | ||||
|   EXPECT_EQ(utils::encryption::opslimit_level::level2, cfg.opslimit); | ||||
|   EXPECT_EQ(utils::encryption::kdf_config::salt_t{}, cfg.salt); | ||||
|   EXPECT_EQ(0U, cfg.unique_id); | ||||
|   EXPECT_EQ(0U, cfg.checksum); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, can_generate_salt) { | ||||
| TEST(utils_encryption_kdf_config, can_seal) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.generate_salt(); | ||||
|   cfg.seal(); | ||||
|   EXPECT_NE(utils::encryption::kdf_config::salt_t{}, cfg.salt); | ||||
|  | ||||
|   auto orig_salt = cfg.salt; | ||||
|   cfg.generate_salt(); | ||||
|   cfg.seal(); | ||||
|   EXPECT_NE(orig_salt, cfg.salt); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, can_generate_checksum) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   EXPECT_EQ(8853559678329530327ULL, cfg.generate_checksum()); | ||||
|   EXPECT_EQ(13087047540462255120ULL, cfg.generate_checksum()); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, generate_salt_calculates_checksum) { | ||||
| TEST(utils_encryption_kdf_config, seal_calculates_checksum) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.generate_salt(); | ||||
|   cfg.seal(); | ||||
|  | ||||
|   EXPECT_NE(0U, cfg.checksum); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, can_create_header_and_restore) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.generate_salt(); | ||||
|   cfg.unique_id = 2U; | ||||
|   cfg.seal(); | ||||
|   auto hdr = cfg.to_header(); | ||||
|  | ||||
|   EXPECT_EQ(utils::encryption::kdf_config::size(), hdr.size()); | ||||
| @@ -70,30 +71,20 @@ TEST(utils_encryption_kdf_config, can_create_header_and_restore) { | ||||
|   auto restored_hdr = restored_cfg.to_header(); | ||||
|  | ||||
|   EXPECT_EQ(hdr, restored_hdr); | ||||
|   EXPECT_EQ(cfg.magic, restored_cfg.magic); | ||||
|   EXPECT_EQ(cfg.version, restored_cfg.version); | ||||
|   EXPECT_EQ(cfg.kdf, restored_cfg.kdf); | ||||
|   EXPECT_EQ(cfg.memlimit, restored_cfg.memlimit); | ||||
|   EXPECT_EQ(cfg.opslimit, restored_cfg.opslimit); | ||||
|   EXPECT_EQ(cfg.salt, restored_cfg.salt); | ||||
|   EXPECT_EQ(cfg.checksum, restored_cfg.checksum); | ||||
|   EXPECT_EQ(cfg.unique_id, restored_cfg.unique_id); | ||||
|   EXPECT_EQ(cfg, restored_cfg); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, header_restore_fails_if_magic_is_invalid) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.magic = 0x11; | ||||
|   cfg.generate_salt(); | ||||
|  | ||||
|   auto hdr = cfg.to_header(); | ||||
|   utils::encryption::kdf_config restored_cfg; | ||||
|   EXPECT_FALSE(utils::encryption::kdf_config::from_header(hdr, restored_cfg)); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, header_restore_fails_if_version_is_invalid) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.version = static_cast<utils::encryption::kdf_version>(0x11); | ||||
|   cfg.generate_salt(); | ||||
|   cfg.seal(); | ||||
|  | ||||
|   auto hdr = cfg.to_header(); | ||||
|   utils::encryption::kdf_config restored_cfg; | ||||
| @@ -103,7 +94,7 @@ TEST(utils_encryption_kdf_config, header_restore_fails_if_version_is_invalid) { | ||||
| TEST(utils_encryption_kdf_config, header_restore_fails_if_kdf_is_invalid) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.kdf = static_cast<utils::encryption::kdf_type>(0x11); | ||||
|   cfg.generate_salt(); | ||||
|   cfg.seal(); | ||||
|  | ||||
|   auto hdr = cfg.to_header(); | ||||
|   utils::encryption::kdf_config restored_cfg; | ||||
| @@ -113,7 +104,7 @@ TEST(utils_encryption_kdf_config, header_restore_fails_if_kdf_is_invalid) { | ||||
| TEST(utils_encryption_kdf_config, header_restore_fails_if_memlimit_is_invalid) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.memlimit = static_cast<utils::encryption::memlimit_level>(0x11); | ||||
|   cfg.generate_salt(); | ||||
|   cfg.seal(); | ||||
|  | ||||
|   auto hdr = cfg.to_header(); | ||||
|   utils::encryption::kdf_config restored_cfg; | ||||
| @@ -123,7 +114,7 @@ TEST(utils_encryption_kdf_config, header_restore_fails_if_memlimit_is_invalid) { | ||||
| TEST(utils_encryption_kdf_config, header_restore_fails_if_opslimit_is_invalid) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.opslimit = static_cast<utils::encryption::opslimit_level>(0x11); | ||||
|   cfg.generate_salt(); | ||||
|   cfg.seal(); | ||||
|  | ||||
|   auto hdr = cfg.to_header(); | ||||
|   utils::encryption::kdf_config restored_cfg; | ||||
| @@ -132,13 +123,280 @@ TEST(utils_encryption_kdf_config, header_restore_fails_if_opslimit_is_invalid) { | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, header_restore_fails_if_salt_is_invalid) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.generate_salt(); | ||||
|   cfg.seal(); | ||||
|   cfg.salt = utils::encryption::kdf_config::salt_t{}; | ||||
|  | ||||
|   auto hdr = cfg.to_header(); | ||||
|   utils::encryption::kdf_config restored_cfg; | ||||
|   EXPECT_FALSE(utils::encryption::kdf_config::from_header(hdr, restored_cfg)); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, header_restore_fails_if_id_is_invalid) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.seal(); | ||||
|   cfg.unique_id = 22U; | ||||
|  | ||||
|   auto hdr = cfg.to_header(); | ||||
|   utils::encryption::kdf_config restored_cfg; | ||||
|   EXPECT_FALSE(utils::encryption::kdf_config::from_header(hdr, restored_cfg)); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, create_subkey_sets_id_and_updates_checksum) { | ||||
|   using hash_t = utils::hash::hash_256_t; | ||||
|  | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.seal(); | ||||
|  | ||||
|   hash_t master_key = | ||||
|       utils::encryption::generate_key<hash_t>("root-master-key"); | ||||
|  | ||||
|   constexpr std::size_t sub_id = 42; | ||||
|   auto [subkey, out_cfg] = cfg.create_subkey<hash_t>( | ||||
|       utils::encryption::kdf_context::path, sub_id, master_key); | ||||
|  | ||||
|   EXPECT_NE(subkey, hash_t{}); | ||||
|   EXPECT_NE(subkey, master_key); | ||||
|  | ||||
|   EXPECT_EQ(out_cfg.unique_id, static_cast<std::uint64_t>(sub_id)); | ||||
|   EXPECT_EQ(out_cfg.checksum, out_cfg.generate_checksum()); | ||||
|  | ||||
|   EXPECT_EQ(out_cfg.version, cfg.version); | ||||
|   EXPECT_EQ(out_cfg.kdf, cfg.kdf); | ||||
|   EXPECT_EQ(out_cfg.memlimit, cfg.memlimit); | ||||
|   EXPECT_EQ(out_cfg.opslimit, cfg.opslimit); | ||||
|   EXPECT_EQ(out_cfg.salt, cfg.salt); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, | ||||
|      create_subkey_is_deterministic_for_same_inputs) { | ||||
|   using hash_t = utils::hash::hash_256_t; | ||||
|  | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.seal(); | ||||
|  | ||||
|   hash_t master_key = | ||||
|       utils::encryption::generate_key<hash_t>("root-master-key"); | ||||
|  | ||||
|   constexpr auto ctx = utils::encryption::kdf_context::data; | ||||
|   constexpr std::size_t sub_id = 7; | ||||
|  | ||||
|   auto [k1, c1] = cfg.create_subkey<hash_t>(ctx, sub_id, master_key); | ||||
|   auto [k2, c2] = cfg.create_subkey<hash_t>(ctx, sub_id, master_key); | ||||
|  | ||||
|   EXPECT_EQ(k1, k2); | ||||
|   EXPECT_EQ(c1.unique_id, c2.unique_id); | ||||
|   EXPECT_EQ(c1.checksum, c2.checksum); | ||||
|   EXPECT_EQ(c1, c2); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, create_subkey_varies_with_different_id) { | ||||
|   using hash_t = utils::hash::hash_256_t; | ||||
|  | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.seal(); | ||||
|  | ||||
|   hash_t master_key = | ||||
|       utils::encryption::generate_key<hash_t>("root-master-key"); | ||||
|  | ||||
|   constexpr auto ctx = utils::encryption::kdf_context::data; | ||||
|  | ||||
|   auto [k1, c1] = cfg.create_subkey<hash_t>(ctx, 1, master_key); | ||||
|   auto [k2, c2] = cfg.create_subkey<hash_t>(ctx, 2, master_key); | ||||
|  | ||||
|   EXPECT_NE(k1, k2); | ||||
|   EXPECT_NE(c1.unique_id, c2.unique_id); | ||||
|   EXPECT_NE(c1.checksum, c2.checksum); | ||||
|  | ||||
|   EXPECT_EQ(c1.version, c2.version); | ||||
|   EXPECT_EQ(c1.kdf, c2.kdf); | ||||
|   EXPECT_EQ(c1.memlimit, c2.memlimit); | ||||
|   EXPECT_EQ(c1.opslimit, c2.opslimit); | ||||
|   EXPECT_EQ(c1.salt, c2.salt); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, create_subkey_varies_with_different_context) { | ||||
|   using hash_t = utils::hash::hash_256_t; | ||||
|  | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.seal(); | ||||
|  | ||||
|   hash_t master_key = | ||||
|       utils::encryption::generate_key<hash_t>("root-master-key"); | ||||
|  | ||||
|   constexpr std::size_t sub_id = 123; | ||||
|  | ||||
|   auto [ka, ca] = cfg.create_subkey<hash_t>( | ||||
|       utils::encryption::kdf_context::data, sub_id, master_key); | ||||
|   auto [kb, cb] = cfg.create_subkey<hash_t>( | ||||
|       utils::encryption::kdf_context::path, sub_id, master_key); | ||||
|  | ||||
|   EXPECT_NE(ka, kb); | ||||
|   EXPECT_EQ(ca.unique_id, cb.unique_id); | ||||
|   EXPECT_EQ(ca.checksum, cb.checksum); | ||||
|   EXPECT_EQ(ca, cb); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, | ||||
|      create_subkey_with_undefined_context_uses_fallback) { | ||||
|   using hash_t = utils::hash::hash_256_t; | ||||
|  | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.seal(); | ||||
|  | ||||
|   hash_t master_key = | ||||
|       utils::encryption::generate_key<hash_t>("root-master-key"); | ||||
|  | ||||
|   constexpr std::size_t sub_id = 55; | ||||
|  | ||||
|   auto [k_def, c_def] = cfg.create_subkey<hash_t>( | ||||
|       utils::encryption::kdf_context::undefined, sub_id, master_key); | ||||
|   auto [k_dat, c_dat] = cfg.create_subkey<hash_t>( | ||||
|       utils::encryption::kdf_context::data, sub_id, master_key); | ||||
|  | ||||
|   EXPECT_NE(k_def, hash_t{}); | ||||
|   EXPECT_NE(k_dat, hash_t{}); | ||||
|   EXPECT_NE(k_def, k_dat); | ||||
|  | ||||
|   EXPECT_EQ(c_def, c_dat); | ||||
| } | ||||
|  | ||||
| #if defined(PROJECT_ENABLE_JSON) | ||||
| TEST(utils_encryption_kdf_config, can_convert_kdf_config_to_and_from_json) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.unique_id = 2U; | ||||
|   cfg.seal(); | ||||
|  | ||||
|   nlohmann::json json_kdf(cfg); | ||||
|  | ||||
|   auto cfg2 = json_kdf.get<utils::encryption::kdf_config>(); | ||||
|   EXPECT_EQ(cfg, cfg2); | ||||
| } | ||||
| #endif // defined(PROJECT_ENABLE_JSON) | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, equality) { | ||||
|   { | ||||
|     utils::encryption::kdf_config cfg; | ||||
|     utils::encryption::kdf_config cfg2; | ||||
|  | ||||
|     EXPECT_EQ(cfg, cfg2); | ||||
|   } | ||||
|  | ||||
|   { | ||||
|     utils::encryption::kdf_config cfg; | ||||
|     utils::encryption::kdf_config cfg2{cfg}; | ||||
|  | ||||
|     EXPECT_EQ(cfg, cfg2); | ||||
|   } | ||||
|  | ||||
|   { | ||||
|     utils::encryption::kdf_config cfg; | ||||
|     cfg.seal(); | ||||
|  | ||||
|     utils::encryption::kdf_config cfg2{cfg}; | ||||
|  | ||||
|     EXPECT_EQ(cfg, cfg2); | ||||
|   } | ||||
|  | ||||
|   { | ||||
|     utils::encryption::kdf_config cfg; | ||||
|     utils::encryption::kdf_config cfg2; | ||||
|     cfg2 = cfg; | ||||
|  | ||||
|     EXPECT_EQ(cfg, cfg2); | ||||
|   } | ||||
|  | ||||
|   { | ||||
|     utils::encryption::kdf_config cfg; | ||||
|     cfg.seal(); | ||||
|  | ||||
|     utils::encryption::kdf_config cfg2; | ||||
|     cfg2 = cfg; | ||||
|  | ||||
|     EXPECT_EQ(cfg, cfg2); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, sealed_is_not_equal_to_unsealed) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.seal(); | ||||
|  | ||||
|   utils::encryption::kdf_config cfg2; | ||||
|  | ||||
|   EXPECT_NE(cfg, cfg2); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, sealed_is_not_equal_to_sealed) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.seal(); | ||||
|  | ||||
|   utils::encryption::kdf_config cfg2; | ||||
|   cfg2.seal(); | ||||
|  | ||||
|   EXPECT_NE(cfg, cfg2); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, is_not_equal_to_different_id) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.unique_id = 2UL; | ||||
|  | ||||
|   utils::encryption::kdf_config cfg2; | ||||
|  | ||||
|   EXPECT_NE(cfg, cfg2); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, is_not_equal_to_different_version) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.version = static_cast<utils::encryption::kdf_version>(0x11); | ||||
|  | ||||
|   utils::encryption::kdf_config cfg2; | ||||
|  | ||||
|   EXPECT_NE(cfg, cfg2); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, is_not_equal_to_different_kdf) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.kdf = static_cast<utils::encryption::kdf_type>(0x11); | ||||
|  | ||||
|   utils::encryption::kdf_config cfg2; | ||||
|  | ||||
|   EXPECT_NE(cfg, cfg2); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, is_not_equal_to_different_memlimit) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.memlimit = static_cast<utils::encryption::memlimit_level>(0x11); | ||||
|  | ||||
|   utils::encryption::kdf_config cfg2; | ||||
|  | ||||
|   EXPECT_NE(cfg, cfg2); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, is_not_equal_to_different_opslimit) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.opslimit = static_cast<utils::encryption::opslimit_level>(0x11); | ||||
|  | ||||
|   utils::encryption::kdf_config cfg2; | ||||
|  | ||||
|   EXPECT_NE(cfg, cfg2); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, is_not_equal_to_different_salt) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.salt[0U] = 1U; | ||||
|  | ||||
|   utils::encryption::kdf_config cfg2; | ||||
|  | ||||
|   EXPECT_NE(cfg, cfg2); | ||||
| } | ||||
|  | ||||
| TEST(utils_encryption_kdf_config, is_not_equal_to_different_checksum) { | ||||
|   utils::encryption::kdf_config cfg; | ||||
|   cfg.checksum = 2U; | ||||
|  | ||||
|   utils::encryption::kdf_config cfg2; | ||||
|  | ||||
|   EXPECT_NE(cfg, cfg2); | ||||
| } | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // defined(PROJECT_ENABLE_LIBSODIUM) && defined(PROJECT_ENABLE_BOOST) | ||||
|   | ||||
| @@ -375,6 +375,10 @@ TEST(utils_encryption, encrypt_data_pointer_using_argon2id) { | ||||
| // TEST(utils_encryption, decrypt_file_name_using_argon2id) {} | ||||
|  | ||||
| // TEST(utils_encryption, decrypt_file_path_using_argon2id) {} | ||||
| // | ||||
| // TEST(utils_encryption, decrypt_file_name_using_argon2id_master_key) {} | ||||
|  | ||||
| // TEST(utils_encryption, decrypt_file_path_using_argon2id_master_key) {} | ||||
| #endif // defined(PROJECT_ENABLE_BOOST) | ||||
| } // namespace repertory | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user