Encryption performance test
[platform/core/security/key-manager.git] / misc / encryption_perf / main.cpp
1 #include <iostream>
2 #include <string>
3 #include <algorithm>
4 #include <chrono>
5
6 #include <ckmc/ckmc-manager.h>
7
8 const char* const ALIAS = "enc_perf_test";
9
10 int main(int argc, char* argv[])
11 {
12         int ret;
13         ckmc_policy_s policy {nullptr, false};
14         ckmc_raw_buffer_s* input = nullptr;
15         ckmc_raw_buffer_s* output = nullptr;
16         ckmc_raw_buffer_s* iv = nullptr;
17         ckmc_param_list_h params = nullptr;
18
19         if (argc < 2) {
20                 std::cerr << "Invalid arguments. Usage: " << argv[0] << " INPUT_SIZE [MAX_CHUNK_SIZE]\n";
21                 return 1;
22         }
23
24         // size of data to encrypt
25         size_t size = std::stoi(argv[1]);
26
27         // max size
28         size_t maxSize = size;
29         if (argc >= 3)
30                 maxSize = std::stoi(argv[2]);
31
32         unsigned char *data = new unsigned char[maxSize];
33
34         // generate key
35         ret = ckmc_create_key_aes(256, ALIAS, policy);
36         if (ret != CKMC_ERROR_NONE && ret != CKMC_ERROR_DB_ALIAS_EXISTS) {
37                 std::cerr << "ckmc_create_key_aes() failed: " << ret << "\n";
38                 goto finish;
39         }
40
41         // setup encryption params
42         ret = ckmc_generate_new_params(CKMC_ALGO_AES_GCM, &params);
43         if (ret != CKMC_ERROR_NONE) {
44                 std::cerr << "ckmc_generate_new_params() failed: " << ret << "\n";
45                 goto finish;
46         }
47
48         ret = ckmc_buffer_new(data, 16, &iv);
49         if (ret != CKMC_ERROR_NONE) {
50                 std::cerr << "ckmc_buffer_new() for IV failed: " << ret << "\n";
51                 goto finish;
52         }
53
54         ret = ckmc_param_list_set_buffer(params, CKMC_PARAM_ED_IV, iv);
55         if (ret != CKMC_ERROR_NONE) {
56                 std::cerr << "ckmc_param_list_set_buffer() failed: " << ret << "\n";
57                 goto finish;
58         }
59
60         std::chrono::duration<double> duration;
61         for(;;) {
62                 size_t chunkSize = std::min(size, maxSize);
63
64                 // allocate buffer
65                 ret = ckmc_buffer_new(data, chunkSize, &input);
66                 if (ret != CKMC_ERROR_NONE) {
67                         std::cerr << "ckmc_buffer_new() for input failed: " << ret << "\n";
68                         goto finish;
69                 }
70
71                 auto before = std::chrono::steady_clock::now();
72
73                 // encrypt
74                 ret = ckmc_encrypt_data(params, ALIAS, "", *input, &output);
75
76                 auto after = std::chrono::steady_clock::now();
77                 duration += after - before;
78
79                 ckmc_buffer_free(input);
80                 input = nullptr;
81                 ckmc_buffer_free(output);
82                 output = nullptr;
83                 if (ret != CKMC_ERROR_NONE) {
84                         std::cerr << "ckmc_encrypt_data() failed: " << ret << "\n";
85                         goto finish;
86                 }
87                 std::cout << "." << std::flush;
88
89                 size -= chunkSize;
90                 if (size == 0) {
91                         std::cout << "\nEncryption duration: " << duration.count() << "s\n";
92                         break;
93                 }
94         }
95
96 finish:
97         delete [] data;
98         ckmc_remove_key(ALIAS);
99         ckmc_buffer_free(input);
100         ckmc_buffer_free(output);
101         ckmc_buffer_free(iv);
102         ckmc_param_list_free(params);
103
104         return ret;
105 }