xref: /isa-l_crypto/examples/saturation_test/aes_thread.c (revision 5e6526ee40a69b90ccddc657a303f853af79de4d)
1acb6d415SXiaodong Liu 
2acb6d415SXiaodong Liu #include <pthread.h>
3acb6d415SXiaodong Liu #include <sys/time.h>
4acb6d415SXiaodong Liu #include <sys/types.h>
5acb6d415SXiaodong Liu #include <stdio.h>
6acb6d415SXiaodong Liu #include <stdlib.h>
7acb6d415SXiaodong Liu #include <stdbool.h>
8acb6d415SXiaodong Liu #include <string.h>
9acb6d415SXiaodong Liu #include <unistd.h>
10acb6d415SXiaodong Liu 
11acb6d415SXiaodong Liu #include "isal_multithread_perf.h"
12acb6d415SXiaodong Liu 
13acb6d415SXiaodong Liu struct aes_context {
14acb6d415SXiaodong Liu         int const bits;
15acb6d415SXiaodong Liu         int (*const preproc)(struct aes_context *pCtx);
16c280984aSMarcel Cornu         void (*const processor)(struct aes_context *pCtx, char *plaintext, char *ciphertext,
17c280984aSMarcel Cornu                                 uint64_t len);
18acb6d415SXiaodong Liu         void (*const postproc)(struct aes_context *pCtx);
19acb6d415SXiaodong Liu };
20acb6d415SXiaodong Liu 
21acb6d415SXiaodong Liu #define rounds_buf 2 /* first one is plain text, second is cipher text */
22acb6d415SXiaodong Liu 
23c280984aSMarcel Cornu static uint64_t
aes_thread_func(int32_t id,struct aes_context * pCtx)24c280984aSMarcel Cornu aes_thread_func(int32_t id, struct aes_context *pCtx)
25acb6d415SXiaodong Liu {
26acb6d415SXiaodong Liu         uint32_t i = 0, j = 0;
27acb6d415SXiaodong Liu         char *aes_buf[rounds_buf] = { NULL };   /* aes buf is used to do checksum compute */
28acb6d415SXiaodong Liu         char *carry_buf[rounds_buf] = { NULL }; /* carry buf is used to do memory movement */
29acb6d415SXiaodong Liu         uint64_t round = -1;
30acb6d415SXiaodong Liu         struct timeval start_tv, stop_tv;
31acb6d415SXiaodong Liu         long long secs = run_secs;
32acb6d415SXiaodong Liu 
33acb6d415SXiaodong Liu         printfv("Thread %i is started\n", id);
34acb6d415SXiaodong Liu         /* memory allocate */
35acb6d415SXiaodong Liu         for (j = 0; j < rounds_buf; j++) {
36acb6d415SXiaodong Liu                 carry_buf[j] = (char *) calloc((size_t) buflen, 1);
37acb6d415SXiaodong Liu                 if (carry_buf[j] == NULL) {
38acb6d415SXiaodong Liu                         printf("calloc failed test aborted\n");
39acb6d415SXiaodong Liu                         goto out;
40acb6d415SXiaodong Liu                 }
41acb6d415SXiaodong Liu 
42acb6d415SXiaodong Liu                 aes_buf[j] = (char *) calloc((size_t) buflen, 1);
43acb6d415SXiaodong Liu                 if (aes_buf[j] == NULL) {
44acb6d415SXiaodong Liu                         printf("calloc failed test aborted\n");
45acb6d415SXiaodong Liu                         goto out;
46acb6d415SXiaodong Liu                 }
47acb6d415SXiaodong Liu 
48acb6d415SXiaodong Liu                 /* Create the random data */
49acb6d415SXiaodong Liu                 for (i = 0; i < buflen; i += 1024) {
50acb6d415SXiaodong Liu                         carry_buf[j][i] = i % 256;
51acb6d415SXiaodong Liu                         aes_buf[j][i] = i % 256;
52acb6d415SXiaodong Liu                 }
53acb6d415SXiaodong Liu         }
54acb6d415SXiaodong Liu 
55acb6d415SXiaodong Liu         if (pCtx->preproc(pCtx)) {
56acb6d415SXiaodong Liu                 printf("preproc failed test aborted\n");
57acb6d415SXiaodong Liu                 goto out;
58acb6d415SXiaodong Liu         }
59acb6d415SXiaodong Liu 
60acb6d415SXiaodong Liu         /* Thread sync */
61acb6d415SXiaodong Liu         pthread_mutex_lock(&count_lock);
62acb6d415SXiaodong Liu         count++;
63acb6d415SXiaodong Liu         if (count == num_threads) {
64acb6d415SXiaodong Liu                 pthread_cond_broadcast(&count_cond);
65acb6d415SXiaodong Liu         } else {
66acb6d415SXiaodong Liu                 pthread_cond_wait(&count_cond, &count_lock);
67acb6d415SXiaodong Liu         }
68acb6d415SXiaodong Liu         pthread_mutex_unlock(&count_lock);
69acb6d415SXiaodong Liu 
70acb6d415SXiaodong Liu         printfv("Thread %i is ready\n", id);
71acb6d415SXiaodong Liu         /* hash func starts to run */
72acb6d415SXiaodong Liu         round = 0;
73acb6d415SXiaodong Liu         gettimeofday(&start_tv, 0);
74acb6d415SXiaodong Liu         gettimeofday(&stop_tv, 0);
75acb6d415SXiaodong Liu         while (secs > (stop_tv.tv_sec - start_tv.tv_sec)) {
76acb6d415SXiaodong Liu                 /* Pre mem-operation */
77acb6d415SXiaodong Liu                 if (prememcpy)
78acb6d415SXiaodong Liu                         memcpy(aes_buf[0], carry_buf[0], buflen);
79acb6d415SXiaodong Liu 
80acb6d415SXiaodong Liu                 /* Calculate checksum */
81acb6d415SXiaodong Liu                 pCtx->processor(pCtx, aes_buf[0], aes_buf[1], buflen);
82acb6d415SXiaodong Liu 
83acb6d415SXiaodong Liu                 /* Post mem-operation */
84acb6d415SXiaodong Liu                 if (postmemcpy)
85acb6d415SXiaodong Liu                         memcpy(carry_buf[1], aes_buf[1], buflen);
86acb6d415SXiaodong Liu 
87acb6d415SXiaodong Liu                 round++;
88acb6d415SXiaodong Liu 
89acb6d415SXiaodong Liu                 gettimeofday(&stop_tv, 0);
90acb6d415SXiaodong Liu         }
91acb6d415SXiaodong Liu         printfv("thread %2i, aes_func rounds %ld\n", id, round);
92acb6d415SXiaodong Liu 
93acb6d415SXiaodong Liu out:
94acb6d415SXiaodong Liu         pCtx->postproc(pCtx);
95acb6d415SXiaodong Liu 
96acb6d415SXiaodong Liu         for (j = 0; j < rounds_buf; j++) {
97acb6d415SXiaodong Liu                 free(carry_buf[j]);
98acb6d415SXiaodong Liu                 free(aes_buf[j]);
99acb6d415SXiaodong Liu         }
100acb6d415SXiaodong Liu 
101acb6d415SXiaodong Liu         return round;
102acb6d415SXiaodong Liu }
103acb6d415SXiaodong Liu 
104acb6d415SXiaodong Liu /*
105acb6d415SXiaodong Liu  * facilities for AES-CBC
106acb6d415SXiaodong Liu  */
107c280984aSMarcel Cornu static unsigned char const ic[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
108c280984aSMarcel Cornu                                     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
109acb6d415SXiaodong Liu 
110c280984aSMarcel Cornu void
mk_rand_data(uint8_t * data,uint32_t size)111c280984aSMarcel Cornu mk_rand_data(uint8_t *data, uint32_t size)
112acb6d415SXiaodong Liu {
113acb6d415SXiaodong Liu         unsigned int i;
114acb6d415SXiaodong Liu         for (i = 0; i < size; i++) {
115acb6d415SXiaodong Liu                 *data++ = rand();
116acb6d415SXiaodong Liu         }
117acb6d415SXiaodong Liu }
118acb6d415SXiaodong Liu 
119acb6d415SXiaodong Liu /* thread functions for cbc dec */
120acb6d415SXiaodong Liu struct cbc_context {
121acb6d415SXiaodong Liu         struct aes_context base;
122acb6d415SXiaodong Liu         uint8_t *iv;
123e4a84933SMarcel Cornu         uint8_t key[ISAL_CBC_256_BITS];
124e4a84933SMarcel Cornu         struct isal_cbc_key_data *key_data;
125acb6d415SXiaodong Liu };
126acb6d415SXiaodong Liu 
127c280984aSMarcel Cornu static int
cbc_dec_pre(struct aes_context * p)128c280984aSMarcel Cornu cbc_dec_pre(struct aes_context *p)
129acb6d415SXiaodong Liu {
130acb6d415SXiaodong Liu         struct cbc_context *pCtx = (struct cbc_context *) p;
131c91caf97STom Cosgrove         int ret;
132acb6d415SXiaodong Liu 
133e4a84933SMarcel Cornu         ret = posix_memalign((void **) &pCtx->iv, 16, (ISAL_CBC_IV_DATA_LEN));
134c91caf97STom Cosgrove         ret |= posix_memalign((void **) &pCtx->key_data, 16, (sizeof(*pCtx->key_data)));
135acb6d415SXiaodong Liu 
136c91caf97STom Cosgrove         if ((0 != ret) || (NULL == pCtx->iv) || (NULL == pCtx->key_data))
137acb6d415SXiaodong Liu                 return 1;
138acb6d415SXiaodong Liu 
139acb6d415SXiaodong Liu         mk_rand_data(pCtx->key, sizeof(pCtx->key));
140e4a84933SMarcel Cornu         memcpy(pCtx->iv, ic, ISAL_CBC_IV_DATA_LEN);
141e28f3412SPablo de Lara         switch (pCtx->base.bits) {
142e28f3412SPablo de Lara         case 128:
143e28f3412SPablo de Lara                 isal_aes_keyexp_128(pCtx->key, pCtx->key_data->enc_keys, pCtx->key_data->dec_keys);
144e28f3412SPablo de Lara                 break;
145e28f3412SPablo de Lara         case 192:
146e28f3412SPablo de Lara                 isal_aes_keyexp_192(pCtx->key, pCtx->key_data->enc_keys, pCtx->key_data->dec_keys);
147e28f3412SPablo de Lara                 break;
148e28f3412SPablo de Lara         case 256:
149e28f3412SPablo de Lara                 isal_aes_keyexp_256(pCtx->key, pCtx->key_data->enc_keys, pCtx->key_data->dec_keys);
150e28f3412SPablo de Lara                 break;
151e28f3412SPablo de Lara         default:
152e28f3412SPablo de Lara                 return 1;
153e28f3412SPablo de Lara         }
154acb6d415SXiaodong Liu 
155acb6d415SXiaodong Liu         return 0;
156acb6d415SXiaodong Liu }
157acb6d415SXiaodong Liu 
158c280984aSMarcel Cornu static void
cbc_dec_post(struct aes_context * p)159c280984aSMarcel Cornu cbc_dec_post(struct aes_context *p)
160acb6d415SXiaodong Liu {
161acb6d415SXiaodong Liu         struct cbc_context *pCtx = (struct cbc_context *) p;
162acb6d415SXiaodong Liu 
163acb6d415SXiaodong Liu         free(pCtx->iv);
164acb6d415SXiaodong Liu         free(pCtx->key_data);
165acb6d415SXiaodong Liu 
166acb6d415SXiaodong Liu         return;
167acb6d415SXiaodong Liu }
168acb6d415SXiaodong Liu 
169c280984aSMarcel Cornu static void
cbc_dec_proc(struct aes_context * p,char * plaintext,char * ciphertext,uint64_t len)170c280984aSMarcel Cornu cbc_dec_proc(struct aes_context *p, char *plaintext, char *ciphertext, uint64_t len)
171acb6d415SXiaodong Liu {
172acb6d415SXiaodong Liu         struct cbc_context *pCtx = (struct cbc_context *) p;
173acb6d415SXiaodong Liu 
174acb6d415SXiaodong Liu         if (pCtx->base.bits == 128)
1759b0cbfb3SPablo de Lara                 isal_aes_cbc_dec_128(ciphertext, pCtx->iv, pCtx->key_data->dec_keys, plaintext,
1769b0cbfb3SPablo de Lara                                      len);
177acb6d415SXiaodong Liu         else if (pCtx->base.bits == 192)
1789b0cbfb3SPablo de Lara                 isal_aes_cbc_dec_192(ciphertext, pCtx->iv, pCtx->key_data->dec_keys, plaintext,
1799b0cbfb3SPablo de Lara                                      len);
180acb6d415SXiaodong Liu         else if (pCtx->base.bits == 256)
1819b0cbfb3SPablo de Lara                 isal_aes_cbc_dec_256(ciphertext, pCtx->iv, pCtx->key_data->dec_keys, plaintext,
1829b0cbfb3SPablo de Lara                                      len);
183acb6d415SXiaodong Liu         else {
184acb6d415SXiaodong Liu                 printf("unsupported cbc encryption bits %d\n", pCtx->base.bits);
185acb6d415SXiaodong Liu                 exit(1);
186acb6d415SXiaodong Liu         }
187acb6d415SXiaodong Liu 
188acb6d415SXiaodong Liu         return;
189acb6d415SXiaodong Liu }
190acb6d415SXiaodong Liu 
191c280984aSMarcel Cornu void *
cbc_128_dec_func(void * arg)192c280984aSMarcel Cornu cbc_128_dec_func(void *arg)
193acb6d415SXiaodong Liu {
194acb6d415SXiaodong Liu         int32_t id = *((int *) arg);
195acb6d415SXiaodong Liu         uint64_t round = -1;
196acb6d415SXiaodong Liu 
197c280984aSMarcel Cornu         struct cbc_context ctx = {
198c280984aSMarcel Cornu                 { 128, cbc_dec_pre, cbc_dec_proc, cbc_dec_post }, NULL, { 0 }, NULL
199c280984aSMarcel Cornu         };
200acb6d415SXiaodong Liu 
201acb6d415SXiaodong Liu         round = aes_thread_func(id, &ctx.base);
202acb6d415SXiaodong Liu 
203acb6d415SXiaodong Liu         pthread_exit((void *) round);
204acb6d415SXiaodong Liu }
205acb6d415SXiaodong Liu 
206c280984aSMarcel Cornu void *
cbc_192_dec_func(void * arg)207c280984aSMarcel Cornu cbc_192_dec_func(void *arg)
208acb6d415SXiaodong Liu {
209acb6d415SXiaodong Liu         int32_t id = *((int *) arg);
210acb6d415SXiaodong Liu         uint64_t round = -1;
211acb6d415SXiaodong Liu 
212c280984aSMarcel Cornu         struct cbc_context ctx = {
213c280984aSMarcel Cornu                 { 192, cbc_dec_pre, cbc_dec_proc, cbc_dec_post }, NULL, { 0 }, NULL
214c280984aSMarcel Cornu         };
215acb6d415SXiaodong Liu 
216acb6d415SXiaodong Liu         round = aes_thread_func(id, &ctx.base);
217acb6d415SXiaodong Liu 
218acb6d415SXiaodong Liu         pthread_exit((void *) round);
219acb6d415SXiaodong Liu }
220acb6d415SXiaodong Liu 
221c280984aSMarcel Cornu void *
cbc_256_dec_func(void * arg)222c280984aSMarcel Cornu cbc_256_dec_func(void *arg)
223acb6d415SXiaodong Liu {
224acb6d415SXiaodong Liu         int32_t id = *((int *) arg);
225acb6d415SXiaodong Liu         uint64_t round = -1;
226acb6d415SXiaodong Liu 
227c280984aSMarcel Cornu         struct cbc_context ctx = {
228c280984aSMarcel Cornu                 { 256, cbc_dec_pre, cbc_dec_proc, cbc_dec_post }, NULL, { 0 }, NULL
229c280984aSMarcel Cornu         };
230acb6d415SXiaodong Liu 
231acb6d415SXiaodong Liu         round = aes_thread_func(id, &ctx.base);
232acb6d415SXiaodong Liu 
233acb6d415SXiaodong Liu         pthread_exit((void *) round);
234acb6d415SXiaodong Liu }
235acb6d415SXiaodong Liu 
236acb6d415SXiaodong Liu /*
237acb6d415SXiaodong Liu  * thread functions for xts enc
238acb6d415SXiaodong Liu  */
239acb6d415SXiaodong Liu struct xts_content {
240acb6d415SXiaodong Liu         struct aes_context base;
241acb6d415SXiaodong Liu         unsigned char key1[16 * 2];
242acb6d415SXiaodong Liu         unsigned char key2[16 * 2];
243acb6d415SXiaodong Liu         unsigned char tinit[16];
244acb6d415SXiaodong Liu };
245acb6d415SXiaodong Liu 
246c280984aSMarcel Cornu static int
xts_enc_pre(struct aes_context * p)247c280984aSMarcel Cornu xts_enc_pre(struct aes_context *p)
248acb6d415SXiaodong Liu {
249acb6d415SXiaodong Liu         struct xts_content *pCtx = (struct xts_content *) p;
250acb6d415SXiaodong Liu 
251acb6d415SXiaodong Liu         mk_rand_data(pCtx->key1, pCtx->base.bits / 8);
252acb6d415SXiaodong Liu         mk_rand_data(pCtx->key2, pCtx->base.bits / 8);
253acb6d415SXiaodong Liu         mk_rand_data(pCtx->tinit, sizeof(pCtx->tinit));
254acb6d415SXiaodong Liu 
255acb6d415SXiaodong Liu         return 0;
256acb6d415SXiaodong Liu }
257acb6d415SXiaodong Liu 
258c280984aSMarcel Cornu static void
xts_enc_post(struct aes_context * p)259c280984aSMarcel Cornu xts_enc_post(struct aes_context *p)
260acb6d415SXiaodong Liu {
261acb6d415SXiaodong Liu         return;
262acb6d415SXiaodong Liu }
263acb6d415SXiaodong Liu 
264c280984aSMarcel Cornu static void
xts_enc_proc(struct aes_context * p,char * plaintext,char * ciphertext,uint64_t len)265c280984aSMarcel Cornu xts_enc_proc(struct aes_context *p, char *plaintext, char *ciphertext, uint64_t len)
266acb6d415SXiaodong Liu {
267acb6d415SXiaodong Liu         struct xts_content *pCtx = (struct xts_content *) p;
268acb6d415SXiaodong Liu 
269acb6d415SXiaodong Liu         if (pCtx->base.bits == 128)
270d531c9b6SMarcel Cornu                 isal_aes_xts_enc_128(pCtx->key2, pCtx->key1, pCtx->tinit, len, plaintext,
271d531c9b6SMarcel Cornu                                      ciphertext);
272acb6d415SXiaodong Liu         else if (pCtx->base.bits == 256)
273d531c9b6SMarcel Cornu                 isal_aes_xts_enc_256(pCtx->key2, pCtx->key1, pCtx->tinit, len, plaintext,
274d531c9b6SMarcel Cornu                                      ciphertext);
275acb6d415SXiaodong Liu         else {
276acb6d415SXiaodong Liu                 printf("unsupported xts encryption bits %d\n", pCtx->base.bits);
277acb6d415SXiaodong Liu                 exit(1);
278acb6d415SXiaodong Liu         }
279acb6d415SXiaodong Liu 
280acb6d415SXiaodong Liu         return;
281acb6d415SXiaodong Liu }
282acb6d415SXiaodong Liu 
283c280984aSMarcel Cornu void *
xts_128_enc_func(void * arg)284c280984aSMarcel Cornu xts_128_enc_func(void *arg)
285acb6d415SXiaodong Liu {
286acb6d415SXiaodong Liu         int32_t id = *((int *) arg);
287acb6d415SXiaodong Liu         uint64_t round = -1;
288acb6d415SXiaodong Liu 
289c280984aSMarcel Cornu         struct xts_content ctx = {
290c280984aSMarcel Cornu                 { 128, xts_enc_pre, xts_enc_proc, xts_enc_post }, { 0 }, { 0 }, { 0 }
291c280984aSMarcel Cornu         };
292acb6d415SXiaodong Liu 
293acb6d415SXiaodong Liu         round = aes_thread_func(id, &ctx.base);
294acb6d415SXiaodong Liu 
295acb6d415SXiaodong Liu         pthread_exit((void *) round);
296acb6d415SXiaodong Liu }
297acb6d415SXiaodong Liu 
298c280984aSMarcel Cornu void *
xts_256_enc_func(void * arg)299c280984aSMarcel Cornu xts_256_enc_func(void *arg)
300acb6d415SXiaodong Liu {
301acb6d415SXiaodong Liu         int32_t id = *((int *) arg);
302acb6d415SXiaodong Liu         uint64_t round = -1;
303acb6d415SXiaodong Liu 
304c280984aSMarcel Cornu         struct xts_content ctx = {
305c280984aSMarcel Cornu                 { 256, xts_enc_pre, xts_enc_proc, xts_enc_post }, { 0 }, { 0 }, { 0 }
306c280984aSMarcel Cornu         };
307acb6d415SXiaodong Liu 
308acb6d415SXiaodong Liu         round = aes_thread_func(id, &ctx.base);
309acb6d415SXiaodong Liu 
310acb6d415SXiaodong Liu         pthread_exit((void *) round);
311acb6d415SXiaodong Liu }
312acb6d415SXiaodong Liu 
313acb6d415SXiaodong Liu /*
314acb6d415SXiaodong Liu  * thread functions for gcm enc
315acb6d415SXiaodong Liu  */
316acb6d415SXiaodong Liu struct gcm_context {
317acb6d415SXiaodong Liu         struct aes_context base;
318acb6d415SXiaodong Liu         uint8_t *key;
319acb6d415SXiaodong Liu         unsigned char *iv;
320acb6d415SXiaodong Liu         unsigned char *aad;
321acb6d415SXiaodong Liu         unsigned char *gcm_tag;
322*5e6526eeSMarcel Cornu         struct isal_gcm_key_data gkey;
323*5e6526eeSMarcel Cornu         struct isal_gcm_context_data gctx;
324acb6d415SXiaodong Liu };
325acb6d415SXiaodong Liu 
326c280984aSMarcel Cornu static int
gcm_enc_pre(struct aes_context * p)327c280984aSMarcel Cornu gcm_enc_pre(struct aes_context *p)
328acb6d415SXiaodong Liu {
329acb6d415SXiaodong Liu         struct gcm_context *pCtx = (struct gcm_context *) p;
330acb6d415SXiaodong Liu 
331acb6d415SXiaodong Liu         pCtx->key = malloc(pCtx->base.bits / 8);
3327ba877e6SMarcel Cornu         pCtx->iv = malloc(ISAL_GCM_IV_LEN);
3337ba877e6SMarcel Cornu         pCtx->gcm_tag = malloc(ISAL_GCM_MAX_TAG_LEN);
334acb6d415SXiaodong Liu         pCtx->aad = malloc(AAD_LENGTH);
335acb6d415SXiaodong Liu 
336acb6d415SXiaodong Liu         mk_rand_data(pCtx->aad, AAD_LENGTH);
337acb6d415SXiaodong Liu 
3387ba877e6SMarcel Cornu         mk_rand_data(pCtx->iv, ISAL_GCM_IV_LEN);
339acb6d415SXiaodong Liu 
340acb6d415SXiaodong Liu         mk_rand_data(pCtx->key, pCtx->base.bits / 8);
341acb6d415SXiaodong Liu         if (pCtx->base.bits == 128)
3428957a389SPablo de Lara                 isal_aes_gcm_pre_128(pCtx->key, &pCtx->gkey);
343acb6d415SXiaodong Liu         else
3448957a389SPablo de Lara                 isal_aes_gcm_pre_256(pCtx->key, &pCtx->gkey);
345acb6d415SXiaodong Liu 
346acb6d415SXiaodong Liu         return 0;
347acb6d415SXiaodong Liu }
348acb6d415SXiaodong Liu 
349c280984aSMarcel Cornu static void
gcm_enc_post(struct aes_context * p)350c280984aSMarcel Cornu gcm_enc_post(struct aes_context *p)
351acb6d415SXiaodong Liu {
352acb6d415SXiaodong Liu         struct gcm_context *pCtx = (struct gcm_context *) p;
353acb6d415SXiaodong Liu 
354acb6d415SXiaodong Liu         free(pCtx->key);
355acb6d415SXiaodong Liu         free(pCtx->iv);
356acb6d415SXiaodong Liu         free(pCtx->gcm_tag);
357acb6d415SXiaodong Liu         free(pCtx->aad);
358acb6d415SXiaodong Liu 
359acb6d415SXiaodong Liu         return;
360acb6d415SXiaodong Liu }
361acb6d415SXiaodong Liu 
362c280984aSMarcel Cornu static void
gcm_enc_proc(struct aes_context * p,char * plaintext,char * ciphertext,uint64_t len)363c280984aSMarcel Cornu gcm_enc_proc(struct aes_context *p, char *plaintext, char *ciphertext, uint64_t len)
364acb6d415SXiaodong Liu {
365acb6d415SXiaodong Liu         struct gcm_context *pCtx = (struct gcm_context *) p;
366acb6d415SXiaodong Liu 
367acb6d415SXiaodong Liu         if (pCtx->base.bits == 128)
3688957a389SPablo de Lara                 isal_aes_gcm_enc_128(&pCtx->gkey, &pCtx->gctx, ciphertext, plaintext, len, pCtx->iv,
3697ba877e6SMarcel Cornu                                      pCtx->aad, AAD_LENGTH, pCtx->gcm_tag, ISAL_GCM_MAX_TAG_LEN);
370acb6d415SXiaodong Liu         else if (pCtx->base.bits == 256)
3718957a389SPablo de Lara                 isal_aes_gcm_enc_256(&pCtx->gkey, &pCtx->gctx, ciphertext, plaintext, len, pCtx->iv,
3727ba877e6SMarcel Cornu                                      pCtx->aad, AAD_LENGTH, pCtx->gcm_tag, ISAL_GCM_MAX_TAG_LEN);
373acb6d415SXiaodong Liu         else {
374acb6d415SXiaodong Liu                 printf("unsupported gcm encryption bits %d\n", pCtx->base.bits);
375acb6d415SXiaodong Liu                 exit(1);
376acb6d415SXiaodong Liu         }
377acb6d415SXiaodong Liu 
378acb6d415SXiaodong Liu         return;
379acb6d415SXiaodong Liu }
380acb6d415SXiaodong Liu 
381c280984aSMarcel Cornu void *
gcm_128_enc_func(void * arg)382c280984aSMarcel Cornu gcm_128_enc_func(void *arg)
383acb6d415SXiaodong Liu {
384acb6d415SXiaodong Liu         int32_t id = *((int *) arg);
385acb6d415SXiaodong Liu         uint64_t round = -1;
386acb6d415SXiaodong Liu 
387c280984aSMarcel Cornu         struct gcm_context ctx = {
388c280984aSMarcel Cornu                 { 128, gcm_enc_pre, gcm_enc_proc, gcm_enc_post }, NULL, NULL, NULL, NULL, { 0 }
389c280984aSMarcel Cornu         };
390acb6d415SXiaodong Liu 
391acb6d415SXiaodong Liu         round = aes_thread_func(id, &ctx.base);
392acb6d415SXiaodong Liu 
393acb6d415SXiaodong Liu         pthread_exit((void *) round);
394acb6d415SXiaodong Liu }
395acb6d415SXiaodong Liu 
396c280984aSMarcel Cornu void *
gcm_256_enc_func(void * arg)397c280984aSMarcel Cornu gcm_256_enc_func(void *arg)
398acb6d415SXiaodong Liu {
399acb6d415SXiaodong Liu         int32_t id = *((int *) arg);
400acb6d415SXiaodong Liu         uint64_t round = -1;
401acb6d415SXiaodong Liu 
402c280984aSMarcel Cornu         struct gcm_context ctx = {
403c280984aSMarcel Cornu                 { 256, gcm_enc_pre, gcm_enc_proc, gcm_enc_post }, NULL, NULL, NULL, NULL, { 0 }
404c280984aSMarcel Cornu         };
405acb6d415SXiaodong Liu 
406acb6d415SXiaodong Liu         round = aes_thread_func(id, &ctx.base);
407acb6d415SXiaodong Liu 
408acb6d415SXiaodong Liu         pthread_exit((void *) round);
409acb6d415SXiaodong Liu }
410