From 9d0dbf82d9b767f2042f2ba1c3e87851192f87ae Mon Sep 17 00:00:00 2001 From: Krzysztof Jackiewicz Date: Fri, 10 Feb 2023 13:52:28 +0100 Subject: [PATCH] Encryption performance test Change-Id: Ifacdbff488e977eca69417d6362273f32feeea11 --- misc/CMakeLists.txt | 3 +- misc/encryption_perf/CMakeLists.txt | 25 +++++++++ misc/encryption_perf/main.cpp | 105 ++++++++++++++++++++++++++++++++++++ packaging/key-manager.spec | 1 + 4 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 misc/encryption_perf/CMakeLists.txt create mode 100644 misc/encryption_perf/main.cpp diff --git a/misc/CMakeLists.txt b/misc/CMakeLists.txt index b149a7e..140e014 100644 --- a/misc/CMakeLists.txt +++ b/misc/CMakeLists.txt @@ -48,4 +48,5 @@ INSTALL(TARGETS ${CKM_TOOL} ADD_SUBDIRECTORY(ckm_db_tool) ADD_SUBDIRECTORY(ckm_initial_values) ADD_SUBDIRECTORY(encryption_scheme) -ADD_SUBDIRECTORY(db_perf) \ No newline at end of file +ADD_SUBDIRECTORY(db_perf) +ADD_SUBDIRECTORY(encryption_perf) \ No newline at end of file diff --git a/misc/encryption_perf/CMakeLists.txt b/misc/encryption_perf/CMakeLists.txt new file mode 100644 index 0000000..b59f703 --- /dev/null +++ b/misc/encryption_perf/CMakeLists.txt @@ -0,0 +1,25 @@ +SET(CKM_ENC_PERF "ckm_enc_perf") + +INCLUDE_DIRECTORIES( + ${KEY_MANAGER_DEP_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ) + +ADD_EXECUTABLE(${CKM_ENC_PERF} ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp) + +TARGET_LINK_LIBRARIES(${CKM_ENC_PERF} + ${TARGET_KEY_MANAGER_CLIENT} + ) + +#place for output file +INSTALL(TARGETS ${CKM_ENC_PERF} + DESTINATION ${BIN_DIR} + PERMISSIONS OWNER_READ + OWNER_WRITE + OWNER_EXECUTE + GROUP_READ + GROUP_EXECUTE + WORLD_READ + WORLD_EXECUTE + ) + diff --git a/misc/encryption_perf/main.cpp b/misc/encryption_perf/main.cpp new file mode 100644 index 0000000..1a2409f --- /dev/null +++ b/misc/encryption_perf/main.cpp @@ -0,0 +1,105 @@ +#include +#include +#include +#include + +#include + +const char* const ALIAS = "enc_perf_test"; + +int main(int argc, char* argv[]) +{ + int ret; + ckmc_policy_s policy {nullptr, false}; + ckmc_raw_buffer_s* input = nullptr; + ckmc_raw_buffer_s* output = nullptr; + ckmc_raw_buffer_s* iv = nullptr; + ckmc_param_list_h params = nullptr; + + if (argc < 2) { + std::cerr << "Invalid arguments. Usage: " << argv[0] << " INPUT_SIZE [MAX_CHUNK_SIZE]\n"; + return 1; + } + + // size of data to encrypt + size_t size = std::stoi(argv[1]); + + // max size + size_t maxSize = size; + if (argc >= 3) + maxSize = std::stoi(argv[2]); + + unsigned char *data = new unsigned char[maxSize]; + + // generate key + ret = ckmc_create_key_aes(256, ALIAS, policy); + if (ret != CKMC_ERROR_NONE && ret != CKMC_ERROR_DB_ALIAS_EXISTS) { + std::cerr << "ckmc_create_key_aes() failed: " << ret << "\n"; + goto finish; + } + + // setup encryption params + ret = ckmc_generate_new_params(CKMC_ALGO_AES_GCM, ¶ms); + if (ret != CKMC_ERROR_NONE) { + std::cerr << "ckmc_generate_new_params() failed: " << ret << "\n"; + goto finish; + } + + ret = ckmc_buffer_new(data, 16, &iv); + if (ret != CKMC_ERROR_NONE) { + std::cerr << "ckmc_buffer_new() for IV failed: " << ret << "\n"; + goto finish; + } + + ret = ckmc_param_list_set_buffer(params, CKMC_PARAM_ED_IV, iv); + if (ret != CKMC_ERROR_NONE) { + std::cerr << "ckmc_param_list_set_buffer() failed: " << ret << "\n"; + goto finish; + } + + std::chrono::duration duration; + for(;;) { + size_t chunkSize = std::min(size, maxSize); + + // allocate buffer + ret = ckmc_buffer_new(data, chunkSize, &input); + if (ret != CKMC_ERROR_NONE) { + std::cerr << "ckmc_buffer_new() for input failed: " << ret << "\n"; + goto finish; + } + + auto before = std::chrono::steady_clock::now(); + + // encrypt + ret = ckmc_encrypt_data(params, ALIAS, "", *input, &output); + + auto after = std::chrono::steady_clock::now(); + duration += after - before; + + ckmc_buffer_free(input); + input = nullptr; + ckmc_buffer_free(output); + output = nullptr; + if (ret != CKMC_ERROR_NONE) { + std::cerr << "ckmc_encrypt_data() failed: " << ret << "\n"; + goto finish; + } + std::cout << "." << std::flush; + + size -= chunkSize; + if (size == 0) { + std::cout << "\nEncryption duration: " << duration.count() << "s\n"; + break; + } + } + +finish: + delete [] data; + ckmc_remove_key(ALIAS); + ckmc_buffer_free(input); + ckmc_buffer_free(output); + ckmc_buffer_free(iv); + ckmc_param_list_free(params); + + return ret; +} diff --git a/packaging/key-manager.spec b/packaging/key-manager.spec index f1e8c7d..88b7c97 100644 --- a/packaging/key-manager.spec +++ b/packaging/key-manager.spec @@ -393,6 +393,7 @@ fi %{bin_dir}/ckm_db_merge %{bin_dir}/ckm_generate_db %{bin_dir}/ckm_db_perf +%{bin_dir}/ckm_enc_perf %misc_dir %endif -- 2.7.4