--- /dev/null
+#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, ¶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<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;
+}