Encryption performance test 30/288130/2
authorKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Fri, 10 Feb 2023 12:52:28 +0000 (13:52 +0100)
committerKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Mon, 13 Feb 2023 09:35:48 +0000 (10:35 +0100)
Change-Id: Ifacdbff488e977eca69417d6362273f32feeea11

misc/CMakeLists.txt
misc/encryption_perf/CMakeLists.txt [new file with mode: 0644]
misc/encryption_perf/main.cpp [new file with mode: 0644]
packaging/key-manager.spec

index b149a7e..140e014 100644 (file)
@@ -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 (file)
index 0000000..b59f703
--- /dev/null
@@ -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 (file)
index 0000000..1a2409f
--- /dev/null
@@ -0,0 +1,105 @@
+#include <iostream>
+#include <string>
+#include <algorithm>
+#include <chrono>
+
+#include <ckmc/ckmc-manager.h>
+
+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, &params);
+       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<double> 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;
+}
index f1e8c7d..88b7c97 100644 (file)
@@ -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