test/crypto: check out-of-place support
[dpdk.git] / app / test / test_cryptodev.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2020 Intel Corporation
3  */
4
5 #include <time.h>
6
7 #include <rte_common.h>
8 #include <rte_hexdump.h>
9 #include <rte_mbuf.h>
10 #include <rte_malloc.h>
11 #include <rte_memcpy.h>
12 #include <rte_pause.h>
13 #include <rte_bus_vdev.h>
14
15 #include <rte_crypto.h>
16 #include <rte_cryptodev.h>
17 #include <rte_cryptodev_pmd.h>
18 #include <rte_string_fns.h>
19
20 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
21 #include <rte_cryptodev_scheduler.h>
22 #include <rte_cryptodev_scheduler_operations.h>
23 #endif
24
25 #include <rte_lcore.h>
26
27 #include "test.h"
28 #include "test_cryptodev.h"
29
30 #include "test_cryptodev_blockcipher.h"
31 #include "test_cryptodev_aes_test_vectors.h"
32 #include "test_cryptodev_des_test_vectors.h"
33 #include "test_cryptodev_hash_test_vectors.h"
34 #include "test_cryptodev_kasumi_test_vectors.h"
35 #include "test_cryptodev_kasumi_hash_test_vectors.h"
36 #include "test_cryptodev_snow3g_test_vectors.h"
37 #include "test_cryptodev_snow3g_hash_test_vectors.h"
38 #include "test_cryptodev_zuc_test_vectors.h"
39 #include "test_cryptodev_aead_test_vectors.h"
40 #include "test_cryptodev_hmac_test_vectors.h"
41 #include "test_cryptodev_mixed_test_vectors.h"
42 #ifdef RTE_LIBRTE_SECURITY
43 #include "test_cryptodev_security_pdcp_test_vectors.h"
44 #include "test_cryptodev_security_pdcp_test_func.h"
45 #endif
46
47 #define VDEV_ARGS_SIZE 100
48 #define MAX_NB_SESSIONS 4
49
50 #define IN_PLACE 0
51 #define OUT_OF_PLACE 1
52
53 static int gbl_driver_id;
54
55 static enum rte_security_session_action_type gbl_action_type =
56         RTE_SECURITY_ACTION_TYPE_NONE;
57
58 struct crypto_testsuite_params {
59         struct rte_mempool *mbuf_pool;
60         struct rte_mempool *large_mbuf_pool;
61         struct rte_mempool *op_mpool;
62         struct rte_mempool *session_mpool;
63         struct rte_mempool *session_priv_mpool;
64         struct rte_cryptodev_config conf;
65         struct rte_cryptodev_qp_conf qp_conf;
66
67         uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
68         uint8_t valid_dev_count;
69 };
70
71 struct crypto_unittest_params {
72         struct rte_crypto_sym_xform cipher_xform;
73         struct rte_crypto_sym_xform auth_xform;
74         struct rte_crypto_sym_xform aead_xform;
75
76         union {
77                 struct rte_cryptodev_sym_session *sess;
78 #ifdef RTE_LIBRTE_SECURITY
79                 struct rte_security_session *sec_session;
80 #endif
81         };
82 #ifdef RTE_LIBRTE_SECURITY
83         enum rte_security_session_action_type type;
84 #endif
85         struct rte_crypto_op *op;
86
87         struct rte_mbuf *obuf, *ibuf;
88
89         uint8_t *digest;
90 };
91
92 #define ALIGN_POW2_ROUNDUP(num, align) \
93         (((num) + (align) - 1) & ~((align) - 1))
94
95 /*
96  * Forward declarations.
97  */
98 static int
99 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
100                 struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
101                 uint8_t *hmac_key);
102
103 static int
104 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
105                 struct crypto_unittest_params *ut_params,
106                 struct crypto_testsuite_params *ts_param,
107                 const uint8_t *cipher,
108                 const uint8_t *digest,
109                 const uint8_t *iv);
110
111 static struct rte_mbuf *
112 setup_test_string(struct rte_mempool *mpool,
113                 const char *string, size_t len, uint8_t blocksize)
114 {
115         struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
116         size_t t_len = len - (blocksize ? (len % blocksize) : 0);
117
118         memset(m->buf_addr, 0, m->buf_len);
119         if (m) {
120                 char *dst = rte_pktmbuf_append(m, t_len);
121
122                 if (!dst) {
123                         rte_pktmbuf_free(m);
124                         return NULL;
125                 }
126                 if (string != NULL)
127                         rte_memcpy(dst, string, t_len);
128                 else
129                         memset(dst, 0, t_len);
130         }
131
132         return m;
133 }
134
135 /* Get number of bytes in X bits (rounding up) */
136 static uint32_t
137 ceil_byte_length(uint32_t num_bits)
138 {
139         if (num_bits % 8)
140                 return ((num_bits >> 3) + 1);
141         else
142                 return (num_bits >> 3);
143 }
144
145 static void
146 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
147 {
148         int32_t n, st;
149         void *iv;
150         struct rte_crypto_sym_op *sop;
151         union rte_crypto_sym_ofs ofs;
152         struct rte_crypto_sgl sgl;
153         struct rte_crypto_sym_vec symvec;
154         struct rte_crypto_vec vec[UINT8_MAX];
155
156         sop = op->sym;
157
158         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
159                 sop->aead.data.length, vec, RTE_DIM(vec));
160
161         if (n < 0 || n != sop->m_src->nb_segs) {
162                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
163                 return;
164         }
165
166         sgl.vec = vec;
167         sgl.num = n;
168         symvec.sgl = &sgl;
169         iv = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
170         symvec.iv = &iv;
171         symvec.aad = (void **)&sop->aead.aad.data;
172         symvec.digest = (void **)&sop->aead.digest.data;
173         symvec.status = &st;
174         symvec.num = 1;
175
176         ofs.raw = 0;
177
178         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
179                 &symvec);
180
181         if (n != 1)
182                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
183         else
184                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
185 }
186
187 static void
188 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
189 {
190         int32_t n, st;
191         void *iv;
192         struct rte_crypto_sym_op *sop;
193         union rte_crypto_sym_ofs ofs;
194         struct rte_crypto_sgl sgl;
195         struct rte_crypto_sym_vec symvec;
196         struct rte_crypto_vec vec[UINT8_MAX];
197
198         sop = op->sym;
199
200         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
201                 sop->auth.data.length, vec, RTE_DIM(vec));
202
203         if (n < 0 || n != sop->m_src->nb_segs) {
204                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
205                 return;
206         }
207
208         sgl.vec = vec;
209         sgl.num = n;
210         symvec.sgl = &sgl;
211         iv = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
212         symvec.iv = &iv;
213         symvec.aad = (void **)&sop->aead.aad.data;
214         symvec.digest = (void **)&sop->auth.digest.data;
215         symvec.status = &st;
216         symvec.num = 1;
217
218         ofs.raw = 0;
219         ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
220         ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
221                 (sop->cipher.data.offset + sop->cipher.data.length);
222
223         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
224                 &symvec);
225
226         if (n != 1)
227                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
228         else
229                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
230 }
231
232 static struct rte_crypto_op *
233 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
234 {
235
236         RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
237
238         if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
239                 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
240                 return NULL;
241         }
242
243         op = NULL;
244
245         while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
246                 rte_pause();
247
248         if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
249                 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
250                 return NULL;
251         }
252
253         return op;
254 }
255
256 static struct crypto_testsuite_params testsuite_params = { NULL };
257 static struct crypto_unittest_params unittest_params;
258
259 static int
260 testsuite_setup(void)
261 {
262         struct crypto_testsuite_params *ts_params = &testsuite_params;
263         struct rte_cryptodev_info info;
264         uint32_t i = 0, nb_devs, dev_id;
265         int ret;
266         uint16_t qp_id;
267
268         memset(ts_params, 0, sizeof(*ts_params));
269
270         ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
271         if (ts_params->mbuf_pool == NULL) {
272                 /* Not already created so create */
273                 ts_params->mbuf_pool = rte_pktmbuf_pool_create(
274                                 "CRYPTO_MBUFPOOL",
275                                 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
276                                 rte_socket_id());
277                 if (ts_params->mbuf_pool == NULL) {
278                         RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
279                         return TEST_FAILED;
280                 }
281         }
282
283         ts_params->large_mbuf_pool = rte_mempool_lookup(
284                         "CRYPTO_LARGE_MBUFPOOL");
285         if (ts_params->large_mbuf_pool == NULL) {
286                 /* Not already created so create */
287                 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
288                                 "CRYPTO_LARGE_MBUFPOOL",
289                                 1, 0, 0, UINT16_MAX,
290                                 rte_socket_id());
291                 if (ts_params->large_mbuf_pool == NULL) {
292                         RTE_LOG(ERR, USER1,
293                                 "Can't create CRYPTO_LARGE_MBUFPOOL\n");
294                         return TEST_FAILED;
295                 }
296         }
297
298         ts_params->op_mpool = rte_crypto_op_pool_create(
299                         "MBUF_CRYPTO_SYM_OP_POOL",
300                         RTE_CRYPTO_OP_TYPE_SYMMETRIC,
301                         NUM_MBUFS, MBUF_CACHE_SIZE,
302                         DEFAULT_NUM_XFORMS *
303                         sizeof(struct rte_crypto_sym_xform) +
304                         MAXIMUM_IV_LENGTH,
305                         rte_socket_id());
306         if (ts_params->op_mpool == NULL) {
307                 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
308                 return TEST_FAILED;
309         }
310
311         /* Create an AESNI MB device if required */
312         if (gbl_driver_id == rte_cryptodev_driver_id_get(
313                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) {
314                 nb_devs = rte_cryptodev_device_count_by_driver(
315                                 rte_cryptodev_driver_id_get(
316                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
317                 if (nb_devs < 1) {
318                         ret = rte_vdev_init(
319                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);
320
321                         TEST_ASSERT(ret == 0,
322                                 "Failed to create instance of"
323                                 " pmd : %s",
324                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
325                 }
326         }
327
328         /* Create an AESNI GCM device if required */
329         if (gbl_driver_id == rte_cryptodev_driver_id_get(
330                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) {
331                 nb_devs = rte_cryptodev_device_count_by_driver(
332                                 rte_cryptodev_driver_id_get(
333                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)));
334                 if (nb_devs < 1) {
335                         TEST_ASSERT_SUCCESS(rte_vdev_init(
336                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL),
337                                 "Failed to create instance of"
338                                 " pmd : %s",
339                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
340                 }
341         }
342
343         /* Create a SNOW 3G device if required */
344         if (gbl_driver_id == rte_cryptodev_driver_id_get(
345                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) {
346                 nb_devs = rte_cryptodev_device_count_by_driver(
347                                 rte_cryptodev_driver_id_get(
348                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)));
349                 if (nb_devs < 1) {
350                         TEST_ASSERT_SUCCESS(rte_vdev_init(
351                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL),
352                                 "Failed to create instance of"
353                                 " pmd : %s",
354                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
355                 }
356         }
357
358         /* Create a KASUMI device if required */
359         if (gbl_driver_id == rte_cryptodev_driver_id_get(
360                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))) {
361                 nb_devs = rte_cryptodev_device_count_by_driver(
362                                 rte_cryptodev_driver_id_get(
363                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)));
364                 if (nb_devs < 1) {
365                         TEST_ASSERT_SUCCESS(rte_vdev_init(
366                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL),
367                                 "Failed to create instance of"
368                                 " pmd : %s",
369                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
370                 }
371         }
372
373         /* Create a ZUC device if required */
374         if (gbl_driver_id == rte_cryptodev_driver_id_get(
375                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) {
376                 nb_devs = rte_cryptodev_device_count_by_driver(
377                                 rte_cryptodev_driver_id_get(
378                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD)));
379                 if (nb_devs < 1) {
380                         TEST_ASSERT_SUCCESS(rte_vdev_init(
381                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL),
382                                 "Failed to create instance of"
383                                 " pmd : %s",
384                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
385                 }
386         }
387
388         /* Create a NULL device if required */
389         if (gbl_driver_id == rte_cryptodev_driver_id_get(
390                         RTE_STR(CRYPTODEV_NAME_NULL_PMD))) {
391                 nb_devs = rte_cryptodev_device_count_by_driver(
392                                 rte_cryptodev_driver_id_get(
393                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD)));
394                 if (nb_devs < 1) {
395                         ret = rte_vdev_init(
396                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL);
397
398                         TEST_ASSERT(ret == 0,
399                                 "Failed to create instance of"
400                                 " pmd : %s",
401                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD));
402                 }
403         }
404
405         /* Create an OPENSSL device if required */
406         if (gbl_driver_id == rte_cryptodev_driver_id_get(
407                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) {
408                 nb_devs = rte_cryptodev_device_count_by_driver(
409                                 rte_cryptodev_driver_id_get(
410                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)));
411                 if (nb_devs < 1) {
412                         ret = rte_vdev_init(
413                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),
414                                 NULL);
415
416                         TEST_ASSERT(ret == 0, "Failed to create "
417                                 "instance of pmd : %s",
418                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
419                 }
420         }
421
422         /* Create a ARMv8 device if required */
423         if (gbl_driver_id == rte_cryptodev_driver_id_get(
424                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) {
425                 nb_devs = rte_cryptodev_device_count_by_driver(
426                                 rte_cryptodev_driver_id_get(
427                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)));
428                 if (nb_devs < 1) {
429                         ret = rte_vdev_init(
430                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD),
431                                 NULL);
432
433                         TEST_ASSERT(ret == 0, "Failed to create "
434                                 "instance of pmd : %s",
435                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
436                 }
437         }
438
439         /* Create a MVSAM device if required */
440         if (gbl_driver_id == rte_cryptodev_driver_id_get(
441                         RTE_STR(CRYPTODEV_NAME_MVSAM_PMD))) {
442                 nb_devs = rte_cryptodev_device_count_by_driver(
443                                 rte_cryptodev_driver_id_get(
444                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)));
445                 if (nb_devs < 1) {
446                         ret = rte_vdev_init(
447                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD),
448                                 NULL);
449
450                         TEST_ASSERT(ret == 0, "Failed to create "
451                                 "instance of pmd : %s",
452                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
453                 }
454         }
455
456         /* Create an CCP device if required */
457         if (gbl_driver_id == rte_cryptodev_driver_id_get(
458                         RTE_STR(CRYPTODEV_NAME_CCP_PMD))) {
459                 nb_devs = rte_cryptodev_device_count_by_driver(
460                                 rte_cryptodev_driver_id_get(
461                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD)));
462                 if (nb_devs < 1) {
463                         ret = rte_vdev_init(
464                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD),
465                                 NULL);
466
467                         TEST_ASSERT(ret == 0, "Failed to create "
468                                 "instance of pmd : %s",
469                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD));
470                 }
471         }
472
473 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
474         char vdev_args[VDEV_ARGS_SIZE] = {""};
475         char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
476                 "ordering=enable,name=cryptodev_test_scheduler,corelist="};
477         uint16_t slave_core_count = 0;
478         uint16_t socket_id = 0;
479
480         if (gbl_driver_id == rte_cryptodev_driver_id_get(
481                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
482
483                 /* Identify the Slave Cores
484                  * Use 2 slave cores for the device args
485                  */
486                 RTE_LCORE_FOREACH_SLAVE(i) {
487                         if (slave_core_count > 1)
488                                 break;
489                         snprintf(vdev_args, sizeof(vdev_args),
490                                         "%s%d", temp_str, i);
491                         strcpy(temp_str, vdev_args);
492                         strlcat(temp_str, ";", sizeof(temp_str));
493                         slave_core_count++;
494                         socket_id = rte_lcore_to_socket_id(i);
495                 }
496                 if (slave_core_count != 2) {
497                         RTE_LOG(ERR, USER1,
498                                 "Cryptodev scheduler test require at least "
499                                 "two slave cores to run. "
500                                 "Please use the correct coremask.\n");
501                         return TEST_FAILED;
502                 }
503                 strcpy(temp_str, vdev_args);
504                 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
505                                 temp_str, socket_id);
506                 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
507                 nb_devs = rte_cryptodev_device_count_by_driver(
508                                 rte_cryptodev_driver_id_get(
509                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
510                 if (nb_devs < 1) {
511                         ret = rte_vdev_init(
512                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
513                                         vdev_args);
514                         TEST_ASSERT(ret == 0,
515                                 "Failed to create instance %u of"
516                                 " pmd : %s",
517                                 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
518                 }
519         }
520 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
521
522         nb_devs = rte_cryptodev_count();
523         if (nb_devs < 1) {
524                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
525                 return TEST_SKIPPED;
526         }
527
528         /* Create list of valid crypto devs */
529         for (i = 0; i < nb_devs; i++) {
530                 rte_cryptodev_info_get(i, &info);
531                 if (info.driver_id == gbl_driver_id)
532                         ts_params->valid_devs[ts_params->valid_dev_count++] = i;
533         }
534
535         if (ts_params->valid_dev_count < 1)
536                 return TEST_FAILED;
537
538         /* Set up all the qps on the first of the valid devices found */
539
540         dev_id = ts_params->valid_devs[0];
541
542         rte_cryptodev_info_get(dev_id, &info);
543
544         ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
545         ts_params->conf.socket_id = SOCKET_ID_ANY;
546         ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
547
548         unsigned int session_size =
549                 rte_cryptodev_sym_get_private_session_size(dev_id);
550
551         /*
552          * Create mempool with maximum number of sessions * 2,
553          * to include the session headers
554          */
555         if (info.sym.max_nb_sessions != 0 &&
556                         info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
557                 RTE_LOG(ERR, USER1, "Device does not support "
558                                 "at least %u sessions\n",
559                                 MAX_NB_SESSIONS);
560                 return TEST_FAILED;
561         }
562
563         ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
564                         "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
565                         SOCKET_ID_ANY);
566         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
567                         "session mempool allocation failed");
568
569         ts_params->session_priv_mpool = rte_mempool_create(
570                         "test_sess_mp_priv",
571                         MAX_NB_SESSIONS,
572                         session_size,
573                         0, 0, NULL, NULL, NULL,
574                         NULL, SOCKET_ID_ANY,
575                         0);
576         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
577                         "session mempool allocation failed");
578
579
580
581         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
582                         &ts_params->conf),
583                         "Failed to configure cryptodev %u with %u qps",
584                         dev_id, ts_params->conf.nb_queue_pairs);
585
586         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
587         ts_params->qp_conf.mp_session = ts_params->session_mpool;
588         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
589
590         for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
591                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
592                         dev_id, qp_id, &ts_params->qp_conf,
593                         rte_cryptodev_socket_id(dev_id)),
594                         "Failed to setup queue pair %u on cryptodev %u",
595                         qp_id, dev_id);
596         }
597
598         return TEST_SUCCESS;
599 }
600
601 static void
602 testsuite_teardown(void)
603 {
604         struct crypto_testsuite_params *ts_params = &testsuite_params;
605
606         if (ts_params->mbuf_pool != NULL) {
607                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
608                 rte_mempool_avail_count(ts_params->mbuf_pool));
609         }
610
611         if (ts_params->op_mpool != NULL) {
612                 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
613                 rte_mempool_avail_count(ts_params->op_mpool));
614         }
615
616         /* Free session mempools */
617         if (ts_params->session_priv_mpool != NULL) {
618                 rte_mempool_free(ts_params->session_priv_mpool);
619                 ts_params->session_priv_mpool = NULL;
620         }
621
622         if (ts_params->session_mpool != NULL) {
623                 rte_mempool_free(ts_params->session_mpool);
624                 ts_params->session_mpool = NULL;
625         }
626 }
627
628 static int
629 ut_setup(void)
630 {
631         struct crypto_testsuite_params *ts_params = &testsuite_params;
632         struct crypto_unittest_params *ut_params = &unittest_params;
633
634         uint16_t qp_id;
635
636         /* Clear unit test parameters before running test */
637         memset(ut_params, 0, sizeof(*ut_params));
638
639         /* Reconfigure device to default parameters */
640         ts_params->conf.socket_id = SOCKET_ID_ANY;
641         ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
642         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
643         ts_params->qp_conf.mp_session = ts_params->session_mpool;
644         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
645
646         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
647                         &ts_params->conf),
648                         "Failed to configure cryptodev %u",
649                         ts_params->valid_devs[0]);
650
651         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
652                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
653                         ts_params->valid_devs[0], qp_id,
654                         &ts_params->qp_conf,
655                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
656                         "Failed to setup queue pair %u on cryptodev %u",
657                         qp_id, ts_params->valid_devs[0]);
658         }
659
660
661         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
662
663         /* Start the device */
664         TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
665                         "Failed to start cryptodev %u",
666                         ts_params->valid_devs[0]);
667
668         return TEST_SUCCESS;
669 }
670
671 static void
672 ut_teardown(void)
673 {
674         struct crypto_testsuite_params *ts_params = &testsuite_params;
675         struct crypto_unittest_params *ut_params = &unittest_params;
676         struct rte_cryptodev_stats stats;
677
678         /* free crypto session structure */
679 #ifdef RTE_LIBRTE_SECURITY
680         if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
681                 if (ut_params->sec_session) {
682                         rte_security_session_destroy(rte_cryptodev_get_sec_ctx
683                                                 (ts_params->valid_devs[0]),
684                                                 ut_params->sec_session);
685                         ut_params->sec_session = NULL;
686                 }
687         } else
688 #endif
689         {
690                 if (ut_params->sess) {
691                         rte_cryptodev_sym_session_clear(
692                                         ts_params->valid_devs[0],
693                                         ut_params->sess);
694                         rte_cryptodev_sym_session_free(ut_params->sess);
695                         ut_params->sess = NULL;
696                 }
697         }
698
699         /* free crypto operation structure */
700         if (ut_params->op)
701                 rte_crypto_op_free(ut_params->op);
702
703         /*
704          * free mbuf - both obuf and ibuf are usually the same,
705          * so check if they point at the same address is necessary,
706          * to avoid freeing the mbuf twice.
707          */
708         if (ut_params->obuf) {
709                 rte_pktmbuf_free(ut_params->obuf);
710                 if (ut_params->ibuf == ut_params->obuf)
711                         ut_params->ibuf = 0;
712                 ut_params->obuf = 0;
713         }
714         if (ut_params->ibuf) {
715                 rte_pktmbuf_free(ut_params->ibuf);
716                 ut_params->ibuf = 0;
717         }
718
719         if (ts_params->mbuf_pool != NULL)
720                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
721                         rte_mempool_avail_count(ts_params->mbuf_pool));
722
723         rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
724
725         /* Stop the device */
726         rte_cryptodev_stop(ts_params->valid_devs[0]);
727 }
728
729 static int
730 test_device_configure_invalid_dev_id(void)
731 {
732         struct crypto_testsuite_params *ts_params = &testsuite_params;
733         uint16_t dev_id, num_devs = 0;
734
735         TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
736                         "Need at least %d devices for test", 1);
737
738         /* valid dev_id values */
739         dev_id = ts_params->valid_devs[ts_params->valid_dev_count - 1];
740
741         /* Stop the device in case it's started so it can be configured */
742         rte_cryptodev_stop(dev_id);
743
744         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
745                         "Failed test for rte_cryptodev_configure: "
746                         "invalid dev_num %u", dev_id);
747
748         /* invalid dev_id values */
749         dev_id = num_devs;
750
751         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
752                         "Failed test for rte_cryptodev_configure: "
753                         "invalid dev_num %u", dev_id);
754
755         dev_id = 0xff;
756
757         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
758                         "Failed test for rte_cryptodev_configure:"
759                         "invalid dev_num %u", dev_id);
760
761         return TEST_SUCCESS;
762 }
763
764 static int
765 test_device_configure_invalid_queue_pair_ids(void)
766 {
767         struct crypto_testsuite_params *ts_params = &testsuite_params;
768         uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
769
770         /* This test is for QAT and NITROX PMDs only */
771         if (gbl_driver_id != rte_cryptodev_driver_id_get(
772                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)) &&
773             gbl_driver_id != rte_cryptodev_driver_id_get(
774                         RTE_STR(CRYPTODEV_NAME_NITROX_PMD)))
775                 return -ENOTSUP;
776
777         /* Stop the device in case it's started so it can be configured */
778         rte_cryptodev_stop(ts_params->valid_devs[0]);
779
780         /* valid - one queue pairs */
781         ts_params->conf.nb_queue_pairs = 1;
782
783         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
784                         &ts_params->conf),
785                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
786                         ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
787
788
789         /* valid - max value queue pairs */
790         ts_params->conf.nb_queue_pairs = orig_nb_qps;
791
792         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
793                         &ts_params->conf),
794                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
795                         ts_params->valid_devs[0],
796                         ts_params->conf.nb_queue_pairs);
797
798
799         /* invalid - zero queue pairs */
800         ts_params->conf.nb_queue_pairs = 0;
801
802         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
803                         &ts_params->conf),
804                         "Failed test for rte_cryptodev_configure, dev_id %u,"
805                         " invalid qps: %u",
806                         ts_params->valid_devs[0],
807                         ts_params->conf.nb_queue_pairs);
808
809
810         /* invalid - max value supported by field queue pairs */
811         ts_params->conf.nb_queue_pairs = UINT16_MAX;
812
813         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
814                         &ts_params->conf),
815                         "Failed test for rte_cryptodev_configure, dev_id %u,"
816                         " invalid qps: %u",
817                         ts_params->valid_devs[0],
818                         ts_params->conf.nb_queue_pairs);
819
820
821         /* invalid - max value + 1 queue pairs */
822         ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
823
824         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
825                         &ts_params->conf),
826                         "Failed test for rte_cryptodev_configure, dev_id %u,"
827                         " invalid qps: %u",
828                         ts_params->valid_devs[0],
829                         ts_params->conf.nb_queue_pairs);
830
831         /* revert to original testsuite value */
832         ts_params->conf.nb_queue_pairs = orig_nb_qps;
833
834         return TEST_SUCCESS;
835 }
836
837 static int
838 test_queue_pair_descriptor_setup(void)
839 {
840         struct crypto_testsuite_params *ts_params = &testsuite_params;
841         struct rte_cryptodev_info dev_info;
842         struct rte_cryptodev_qp_conf qp_conf = {
843                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
844         };
845
846         uint16_t qp_id;
847
848         /* This test is for QAT PMD only */
849         if (gbl_driver_id != rte_cryptodev_driver_id_get(
850                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)))
851                 return -ENOTSUP;
852
853         /* Stop the device in case it's started so it can be configured */
854         rte_cryptodev_stop(ts_params->valid_devs[0]);
855
856
857         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
858
859         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
860                         &ts_params->conf),
861                         "Failed to configure cryptodev %u",
862                         ts_params->valid_devs[0]);
863
864         /*
865          * Test various ring sizes on this device. memzones can't be
866          * freed so are re-used if ring is released and re-created.
867          */
868         qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
869         qp_conf.mp_session = ts_params->session_mpool;
870         qp_conf.mp_session_private = ts_params->session_priv_mpool;
871
872         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
873                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
874                                 ts_params->valid_devs[0], qp_id, &qp_conf,
875                                 rte_cryptodev_socket_id(
876                                                 ts_params->valid_devs[0])),
877                                 "Failed test for "
878                                 "rte_cryptodev_queue_pair_setup: num_inflights "
879                                 "%u on qp %u on cryptodev %u",
880                                 qp_conf.nb_descriptors, qp_id,
881                                 ts_params->valid_devs[0]);
882         }
883
884         qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
885
886         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
887                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
888                                 ts_params->valid_devs[0], qp_id, &qp_conf,
889                                 rte_cryptodev_socket_id(
890                                                 ts_params->valid_devs[0])),
891                                 "Failed test for"
892                                 " rte_cryptodev_queue_pair_setup: num_inflights"
893                                 " %u on qp %u on cryptodev %u",
894                                 qp_conf.nb_descriptors, qp_id,
895                                 ts_params->valid_devs[0]);
896         }
897
898         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
899
900         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
901                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
902                                 ts_params->valid_devs[0], qp_id, &qp_conf,
903                                 rte_cryptodev_socket_id(
904                                                 ts_params->valid_devs[0])),
905                                 "Failed test for "
906                                 "rte_cryptodev_queue_pair_setup: num_inflights"
907                                 " %u on qp %u on cryptodev %u",
908                                 qp_conf.nb_descriptors, qp_id,
909                                 ts_params->valid_devs[0]);
910         }
911
912         /* invalid number of descriptors - max supported + 2 */
913         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT + 2;
914
915         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
916                 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
917                                 ts_params->valid_devs[0], qp_id, &qp_conf,
918                                 rte_cryptodev_socket_id(
919                                                 ts_params->valid_devs[0])),
920                                 "Unexpectedly passed test for "
921                                 "rte_cryptodev_queue_pair_setup:"
922                                 "num_inflights %u on qp %u on cryptodev %u",
923                                 qp_conf.nb_descriptors, qp_id,
924                                 ts_params->valid_devs[0]);
925         }
926
927         /* invalid number of descriptors - max value of parameter */
928         qp_conf.nb_descriptors = UINT32_MAX-1;
929
930         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
931                 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
932                                 ts_params->valid_devs[0], qp_id, &qp_conf,
933                                 rte_cryptodev_socket_id(
934                                                 ts_params->valid_devs[0])),
935                                 "Unexpectedly passed test for "
936                                 "rte_cryptodev_queue_pair_setup:"
937                                 "num_inflights %u on qp %u on cryptodev %u",
938                                 qp_conf.nb_descriptors, qp_id,
939                                 ts_params->valid_devs[0]);
940         }
941
942         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
943
944         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
945                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
946                                 ts_params->valid_devs[0], qp_id, &qp_conf,
947                                 rte_cryptodev_socket_id(
948                                                 ts_params->valid_devs[0])),
949                                 "Failed test for"
950                                 " rte_cryptodev_queue_pair_setup:"
951                                 "num_inflights %u on qp %u on cryptodev %u",
952                                 qp_conf.nb_descriptors, qp_id,
953                                 ts_params->valid_devs[0]);
954         }
955
956         /* invalid number of descriptors - max supported + 1 */
957         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT + 1;
958
959         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
960                 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
961                                 ts_params->valid_devs[0], qp_id, &qp_conf,
962                                 rte_cryptodev_socket_id(
963                                                 ts_params->valid_devs[0])),
964                                 "Unexpectedly passed test for "
965                                 "rte_cryptodev_queue_pair_setup:"
966                                 "num_inflights %u on qp %u on cryptodev %u",
967                                 qp_conf.nb_descriptors, qp_id,
968                                 ts_params->valid_devs[0]);
969         }
970
971         /* test invalid queue pair id */
972         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;      /*valid */
973
974         qp_id = ts_params->conf.nb_queue_pairs;         /*invalid */
975
976         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
977                         ts_params->valid_devs[0],
978                         qp_id, &qp_conf,
979                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
980                         "Failed test for rte_cryptodev_queue_pair_setup:"
981                         "invalid qp %u on cryptodev %u",
982                         qp_id, ts_params->valid_devs[0]);
983
984         qp_id = 0xffff; /*invalid*/
985
986         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
987                         ts_params->valid_devs[0],
988                         qp_id, &qp_conf,
989                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
990                         "Failed test for rte_cryptodev_queue_pair_setup:"
991                         "invalid qp %u on cryptodev %u",
992                         qp_id, ts_params->valid_devs[0]);
993
994         return TEST_SUCCESS;
995 }
996
997 /* ***** Plaintext data for tests ***** */
998
999 const char catch_22_quote_1[] =
1000                 "There was only one catch and that was Catch-22, which "
1001                 "specified that a concern for one's safety in the face of "
1002                 "dangers that were real and immediate was the process of a "
1003                 "rational mind. Orr was crazy and could be grounded. All he "
1004                 "had to do was ask; and as soon as he did, he would no longer "
1005                 "be crazy and would have to fly more missions. Orr would be "
1006                 "crazy to fly more missions and sane if he didn't, but if he "
1007                 "was sane he had to fly them. If he flew them he was crazy "
1008                 "and didn't have to; but if he didn't want to he was sane and "
1009                 "had to. Yossarian was moved very deeply by the absolute "
1010                 "simplicity of this clause of Catch-22 and let out a "
1011                 "respectful whistle. \"That's some catch, that Catch-22\", he "
1012                 "observed. \"It's the best there is,\" Doc Daneeka agreed.";
1013
1014 const char catch_22_quote[] =
1015                 "What a lousy earth! He wondered how many people were "
1016                 "destitute that same night even in his own prosperous country, "
1017                 "how many homes were shanties, how many husbands were drunk "
1018                 "and wives socked, and how many children were bullied, abused, "
1019                 "or abandoned. How many families hungered for food they could "
1020                 "not afford to buy? How many hearts were broken? How many "
1021                 "suicides would take place that same night, how many people "
1022                 "would go insane? How many cockroaches and landlords would "
1023                 "triumph? How many winners were losers, successes failures, "
1024                 "and rich men poor men? How many wise guys were stupid? How "
1025                 "many happy endings were unhappy endings? How many honest men "
1026                 "were liars, brave men cowards, loyal men traitors, how many "
1027                 "sainted men were corrupt, how many people in positions of "
1028                 "trust had sold their souls to bodyguards, how many had never "
1029                 "had souls? How many straight-and-narrow paths were crooked "
1030                 "paths? How many best families were worst families and how "
1031                 "many good people were bad people? When you added them all up "
1032                 "and then subtracted, you might be left with only the children, "
1033                 "and perhaps with Albert Einstein and an old violinist or "
1034                 "sculptor somewhere.";
1035
1036 #define QUOTE_480_BYTES         (480)
1037 #define QUOTE_512_BYTES         (512)
1038 #define QUOTE_768_BYTES         (768)
1039 #define QUOTE_1024_BYTES        (1024)
1040
1041
1042
1043 /* ***** SHA1 Hash Tests ***** */
1044
1045 #define HMAC_KEY_LENGTH_SHA1    (DIGEST_BYTE_LENGTH_SHA1)
1046
1047 static uint8_t hmac_sha1_key[] = {
1048         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1049         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1050         0xDE, 0xF4, 0xDE, 0xAD };
1051
1052 /* ***** SHA224 Hash Tests ***** */
1053
1054 #define HMAC_KEY_LENGTH_SHA224  (DIGEST_BYTE_LENGTH_SHA224)
1055
1056
1057 /* ***** AES-CBC Cipher Tests ***** */
1058
1059 #define CIPHER_KEY_LENGTH_AES_CBC       (16)
1060 #define CIPHER_IV_LENGTH_AES_CBC        (CIPHER_KEY_LENGTH_AES_CBC)
1061
1062 static uint8_t aes_cbc_key[] = {
1063         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1064         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1065
1066 static uint8_t aes_cbc_iv[] = {
1067         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1068         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1069
1070
1071 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1072
1073 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1074         0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1075         0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1076         0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1077         0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1078         0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1079         0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1080         0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1081         0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1082         0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1083         0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1084         0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1085         0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1086         0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1087         0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1088         0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1089         0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1090         0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1091         0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1092         0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1093         0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1094         0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1095         0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1096         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1097         0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1098         0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1099         0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1100         0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1101         0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1102         0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1103         0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1104         0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1105         0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1106         0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1107         0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1108         0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1109         0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1110         0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1111         0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1112         0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1113         0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1114         0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1115         0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1116         0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1117         0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1118         0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1119         0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1120         0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1121         0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1122         0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1123         0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1124         0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1125         0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1126         0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1127         0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1128         0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1129         0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1130         0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1131         0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1132         0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1133         0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1134         0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1135         0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1136         0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1137         0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1138 };
1139
1140 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1141         0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1142         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1143         0x18, 0x8c, 0x1d, 0x32
1144 };
1145
1146
1147 /* Multisession Vector context Test */
1148 /*Begin Session 0 */
1149 static uint8_t ms_aes_cbc_key0[] = {
1150         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1151         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1152 };
1153
1154 static uint8_t ms_aes_cbc_iv0[] = {
1155         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1156         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1157 };
1158
1159 static const uint8_t ms_aes_cbc_cipher0[] = {
1160                 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1161                 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1162                 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1163                 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1164                 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1165                 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1166                 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1167                 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1168                 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1169                 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1170                 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1171                 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1172                 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1173                 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1174                 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1175                 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1176                 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1177                 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1178                 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1179                 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1180                 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1181                 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1182                 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1183                 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1184                 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1185                 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1186                 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1187                 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1188                 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1189                 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1190                 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1191                 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1192                 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1193                 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1194                 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1195                 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1196                 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1197                 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1198                 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1199                 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1200                 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1201                 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1202                 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1203                 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1204                 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1205                 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1206                 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1207                 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1208                 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1209                 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1210                 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1211                 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1212                 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1213                 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1214                 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1215                 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1216                 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1217                 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1218                 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1219                 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1220                 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1221                 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1222                 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1223                 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1224 };
1225
1226
1227 static  uint8_t ms_hmac_key0[] = {
1228                 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1229                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1230                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1231                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1232                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1233                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1234                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1235                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1236 };
1237
1238 static const uint8_t ms_hmac_digest0[] = {
1239                 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1240                 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1241                 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1242                 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1243                 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1244                 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1245                 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1246                 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1247                 };
1248
1249 /* End Session 0 */
1250 /* Begin session 1 */
1251
1252 static  uint8_t ms_aes_cbc_key1[] = {
1253                 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1254                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1255 };
1256
1257 static  uint8_t ms_aes_cbc_iv1[] = {
1258         0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1259         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1260 };
1261
1262 static const uint8_t ms_aes_cbc_cipher1[] = {
1263                 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1264                 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1265                 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1266                 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1267                 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1268                 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1269                 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1270                 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1271                 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1272                 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1273                 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1274                 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1275                 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1276                 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1277                 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1278                 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1279                 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1280                 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1281                 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1282                 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1283                 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1284                 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1285                 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1286                 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1287                 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1288                 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1289                 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1290                 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1291                 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1292                 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1293                 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1294                 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1295                 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1296                 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1297                 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1298                 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1299                 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1300                 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1301                 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1302                 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1303                 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1304                 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1305                 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1306                 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1307                 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1308                 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1309                 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1310                 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1311                 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1312                 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1313                 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1314                 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1315                 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1316                 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1317                 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1318                 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1319                 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1320                 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1321                 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1322                 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1323                 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1324                 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1325                 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1326                 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1327
1328 };
1329
1330 static uint8_t ms_hmac_key1[] = {
1331                 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1332                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1333                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1334                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1335                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1336                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1337                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1338                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1339 };
1340
1341 static const uint8_t ms_hmac_digest1[] = {
1342                 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1343                 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1344                 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1345                 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1346                 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1347                 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1348                 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1349                 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1350 };
1351 /* End Session 1  */
1352 /* Begin Session 2 */
1353 static  uint8_t ms_aes_cbc_key2[] = {
1354                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1355                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1356 };
1357
1358 static  uint8_t ms_aes_cbc_iv2[] = {
1359                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1360                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1361 };
1362
1363 static const uint8_t ms_aes_cbc_cipher2[] = {
1364                 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
1365                 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
1366                 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
1367                 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
1368                 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
1369                 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
1370                 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
1371                 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
1372                 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
1373                 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
1374                 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
1375                 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
1376                 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
1377                 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
1378                 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
1379                 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
1380                 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
1381                 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
1382                 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
1383                 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
1384                 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
1385                 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
1386                 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
1387                 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
1388                 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
1389                 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
1390                 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
1391                 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
1392                 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
1393                 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
1394                 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
1395                 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
1396                 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
1397                 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
1398                 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
1399                 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
1400                 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
1401                 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
1402                 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
1403                 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
1404                 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
1405                 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
1406                 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
1407                 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
1408                 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
1409                 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
1410                 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
1411                 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
1412                 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
1413                 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
1414                 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
1415                 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
1416                 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
1417                 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
1418                 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
1419                 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
1420                 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
1421                 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
1422                 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
1423                 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
1424                 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
1425                 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
1426                 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
1427                 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
1428 };
1429
1430 static  uint8_t ms_hmac_key2[] = {
1431                 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1432                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1433                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1434                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1435                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1436                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1437                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1438                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1439 };
1440
1441 static const uint8_t ms_hmac_digest2[] = {
1442                 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
1443                 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
1444                 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
1445                 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
1446                 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
1447                 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
1448                 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
1449                 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
1450 };
1451
1452 /* End Session 2 */
1453
1454
1455 static int
1456 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
1457 {
1458         struct crypto_testsuite_params *ts_params = &testsuite_params;
1459         struct crypto_unittest_params *ut_params = &unittest_params;
1460
1461         /* Verify the capabilities */
1462         struct rte_cryptodev_sym_capability_idx cap_idx;
1463         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1464         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
1465         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1466                         &cap_idx) == NULL)
1467                 return -ENOTSUP;
1468         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1469         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
1470         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1471                         &cap_idx) == NULL)
1472                 return -ENOTSUP;
1473
1474         /* Generate test mbuf data and space for digest */
1475         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1476                         catch_22_quote, QUOTE_512_BYTES, 0);
1477
1478         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1479                         DIGEST_BYTE_LENGTH_SHA1);
1480         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1481
1482         /* Setup Cipher Parameters */
1483         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1484         ut_params->cipher_xform.next = &ut_params->auth_xform;
1485
1486         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1487         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
1488         ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
1489         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1490         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1491         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1492
1493         /* Setup HMAC Parameters */
1494         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1495
1496         ut_params->auth_xform.next = NULL;
1497
1498         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
1499         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
1500         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
1501         ut_params->auth_xform.auth.key.data = hmac_sha1_key;
1502         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
1503
1504         ut_params->sess = rte_cryptodev_sym_session_create(
1505                         ts_params->session_mpool);
1506
1507         /* Create crypto session*/
1508         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
1509                         ut_params->sess, &ut_params->cipher_xform,
1510                         ts_params->session_priv_mpool);
1511         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1512
1513         /* Generate crypto op data structure */
1514         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1515                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1516         TEST_ASSERT_NOT_NULL(ut_params->op,
1517                         "Failed to allocate symmetric crypto operation struct");
1518
1519         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1520
1521         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1522
1523         /* set crypto operation source mbuf */
1524         sym_op->m_src = ut_params->ibuf;
1525
1526         /* Set crypto operation authentication parameters */
1527         sym_op->auth.digest.data = ut_params->digest;
1528         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1529                         ut_params->ibuf, QUOTE_512_BYTES);
1530
1531         sym_op->auth.data.offset = 0;
1532         sym_op->auth.data.length = QUOTE_512_BYTES;
1533
1534         /* Copy IV at the end of the crypto operation */
1535         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1536                         aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
1537
1538         /* Set crypto operation cipher parameters */
1539         sym_op->cipher.data.offset = 0;
1540         sym_op->cipher.data.length = QUOTE_512_BYTES;
1541
1542         /* Process crypto operation */
1543         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1544                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1545                         ut_params->op);
1546         else
1547                 TEST_ASSERT_NOT_NULL(
1548                         process_crypto_request(ts_params->valid_devs[0],
1549                                 ut_params->op),
1550                                 "failed to process sym crypto op");
1551
1552         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1553                         "crypto op processing failed");
1554
1555         /* Validate obuf */
1556         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
1557                         uint8_t *);
1558
1559         TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
1560                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
1561                         QUOTE_512_BYTES,
1562                         "ciphertext data not as expected");
1563
1564         uint8_t *digest = ciphertext + QUOTE_512_BYTES;
1565
1566         TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
1567                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
1568                         gbl_driver_id == rte_cryptodev_driver_id_get(
1569                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
1570                                         TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
1571                                         DIGEST_BYTE_LENGTH_SHA1,
1572                         "Generated digest data not as expected");
1573
1574         return TEST_SUCCESS;
1575 }
1576
1577 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
1578
1579 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
1580
1581 static uint8_t hmac_sha512_key[] = {
1582         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1583         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1584         0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1585         0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
1586         0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
1587         0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1588         0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
1589         0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
1590
1591 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
1592         0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
1593         0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
1594         0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
1595         0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
1596         0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
1597         0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
1598         0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
1599         0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
1600
1601
1602
1603 static int
1604 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1605                 struct crypto_unittest_params *ut_params,
1606                 uint8_t *cipher_key,
1607                 uint8_t *hmac_key);
1608
1609 static int
1610 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1611                 struct crypto_unittest_params *ut_params,
1612                 struct crypto_testsuite_params *ts_params,
1613                 const uint8_t *cipher,
1614                 const uint8_t *digest,
1615                 const uint8_t *iv);
1616
1617
1618 static int
1619 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1620                 struct crypto_unittest_params *ut_params,
1621                 uint8_t *cipher_key,
1622                 uint8_t *hmac_key)
1623 {
1624
1625         /* Setup Cipher Parameters */
1626         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1627         ut_params->cipher_xform.next = NULL;
1628
1629         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1630         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
1631         ut_params->cipher_xform.cipher.key.data = cipher_key;
1632         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1633         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1634         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1635
1636         /* Setup HMAC Parameters */
1637         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1638         ut_params->auth_xform.next = &ut_params->cipher_xform;
1639
1640         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
1641         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
1642         ut_params->auth_xform.auth.key.data = hmac_key;
1643         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
1644         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
1645
1646         return TEST_SUCCESS;
1647 }
1648
1649
1650 static int
1651 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1652                 struct crypto_unittest_params *ut_params,
1653                 struct crypto_testsuite_params *ts_params,
1654                 const uint8_t *cipher,
1655                 const uint8_t *digest,
1656                 const uint8_t *iv)
1657 {
1658         /* Generate test mbuf data and digest */
1659         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1660                         (const char *)
1661                         cipher,
1662                         QUOTE_512_BYTES, 0);
1663
1664         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1665                         DIGEST_BYTE_LENGTH_SHA512);
1666         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1667
1668         rte_memcpy(ut_params->digest,
1669                         digest,
1670                         DIGEST_BYTE_LENGTH_SHA512);
1671
1672         /* Generate Crypto op data structure */
1673         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1674                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1675         TEST_ASSERT_NOT_NULL(ut_params->op,
1676                         "Failed to allocate symmetric crypto operation struct");
1677
1678         rte_crypto_op_attach_sym_session(ut_params->op, sess);
1679
1680         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1681
1682         /* set crypto operation source mbuf */
1683         sym_op->m_src = ut_params->ibuf;
1684
1685         sym_op->auth.digest.data = ut_params->digest;
1686         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1687                         ut_params->ibuf, QUOTE_512_BYTES);
1688
1689         sym_op->auth.data.offset = 0;
1690         sym_op->auth.data.length = QUOTE_512_BYTES;
1691
1692         /* Copy IV at the end of the crypto operation */
1693         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1694                         iv, CIPHER_IV_LENGTH_AES_CBC);
1695
1696         sym_op->cipher.data.offset = 0;
1697         sym_op->cipher.data.length = QUOTE_512_BYTES;
1698
1699         /* Process crypto operation */
1700         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1701                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1702                         ut_params->op);
1703         else
1704                 TEST_ASSERT_NOT_NULL(
1705                                 process_crypto_request(ts_params->valid_devs[0],
1706                                         ut_params->op),
1707                                         "failed to process sym crypto op");
1708
1709         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1710                         "crypto op processing failed");
1711
1712         ut_params->obuf = ut_params->op->sym->m_src;
1713
1714         /* Validate obuf */
1715         TEST_ASSERT_BUFFERS_ARE_EQUAL(
1716                         rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
1717                         catch_22_quote,
1718                         QUOTE_512_BYTES,
1719                         "Plaintext data not as expected");
1720
1721         /* Validate obuf */
1722         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1723                         "Digest verification failed");
1724
1725         return TEST_SUCCESS;
1726 }
1727
1728 static int
1729 test_blockcipher(enum blockcipher_test_type test_type)
1730 {
1731         struct crypto_testsuite_params *ts_params = &testsuite_params;
1732         int status;
1733
1734         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1735                 ts_params->op_mpool,
1736                 ts_params->session_mpool, ts_params->session_priv_mpool,
1737                 ts_params->valid_devs[0],
1738                 gbl_driver_id,
1739                 test_type);
1740
1741         if (status == -ENOTSUP)
1742                 return status;
1743
1744         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1745
1746         return TEST_SUCCESS;
1747 }
1748
1749 static int
1750 test_AES_cipheronly_all(void)
1751 {
1752         return test_blockcipher(BLKCIPHER_AES_CIPHERONLY_TYPE);
1753 }
1754
1755 static int
1756 test_AES_docsis_all(void)
1757 {
1758         return test_blockcipher(BLKCIPHER_AES_DOCSIS_TYPE);
1759 }
1760
1761 static int
1762 test_DES_docsis_all(void)
1763 {
1764         return test_blockcipher(BLKCIPHER_DES_DOCSIS_TYPE);
1765 }
1766
1767 static int
1768 test_DES_cipheronly_all(void)
1769 {
1770         return test_blockcipher(BLKCIPHER_DES_CIPHERONLY_TYPE);
1771 }
1772
1773 static int
1774 test_authonly_all(void)
1775 {
1776         return test_blockcipher(BLKCIPHER_AUTHONLY_TYPE);
1777 }
1778
1779 static int
1780 test_AES_chain_all(void)
1781 {
1782         return test_blockcipher(BLKCIPHER_AES_CHAIN_TYPE);
1783 }
1784
1785 static int
1786 test_3DES_chain_all(void)
1787 {
1788         return test_blockcipher(BLKCIPHER_3DES_CHAIN_TYPE);
1789 }
1790
1791 static int
1792 test_3DES_cipheronly_all(void)
1793 {
1794         return test_blockcipher(BLKCIPHER_3DES_CIPHERONLY_TYPE);
1795 }
1796
1797 /* ***** SNOW 3G Tests ***** */
1798 static int
1799 create_wireless_algo_hash_session(uint8_t dev_id,
1800         const uint8_t *key, const uint8_t key_len,
1801         const uint8_t iv_len, const uint8_t auth_len,
1802         enum rte_crypto_auth_operation op,
1803         enum rte_crypto_auth_algorithm algo)
1804 {
1805         uint8_t hash_key[key_len];
1806         int status;
1807
1808         struct crypto_testsuite_params *ts_params = &testsuite_params;
1809         struct crypto_unittest_params *ut_params = &unittest_params;
1810
1811         memcpy(hash_key, key, key_len);
1812
1813         debug_hexdump(stdout, "key:", key, key_len);
1814
1815         /* Setup Authentication Parameters */
1816         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1817         ut_params->auth_xform.next = NULL;
1818
1819         ut_params->auth_xform.auth.op = op;
1820         ut_params->auth_xform.auth.algo = algo;
1821         ut_params->auth_xform.auth.key.length = key_len;
1822         ut_params->auth_xform.auth.key.data = hash_key;
1823         ut_params->auth_xform.auth.digest_length = auth_len;
1824         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
1825         ut_params->auth_xform.auth.iv.length = iv_len;
1826         ut_params->sess = rte_cryptodev_sym_session_create(
1827                         ts_params->session_mpool);
1828
1829         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
1830                         &ut_params->auth_xform,
1831                         ts_params->session_priv_mpool);
1832         TEST_ASSERT_EQUAL(status, 0, "session init failed");
1833         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1834         return 0;
1835 }
1836
1837 static int
1838 create_wireless_algo_cipher_session(uint8_t dev_id,
1839                         enum rte_crypto_cipher_operation op,
1840                         enum rte_crypto_cipher_algorithm algo,
1841                         const uint8_t *key, const uint8_t key_len,
1842                         uint8_t iv_len)
1843 {
1844         uint8_t cipher_key[key_len];
1845         int status;
1846         struct crypto_testsuite_params *ts_params = &testsuite_params;
1847         struct crypto_unittest_params *ut_params = &unittest_params;
1848
1849         memcpy(cipher_key, key, key_len);
1850
1851         /* Setup Cipher Parameters */
1852         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1853         ut_params->cipher_xform.next = NULL;
1854
1855         ut_params->cipher_xform.cipher.algo = algo;
1856         ut_params->cipher_xform.cipher.op = op;
1857         ut_params->cipher_xform.cipher.key.data = cipher_key;
1858         ut_params->cipher_xform.cipher.key.length = key_len;
1859         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1860         ut_params->cipher_xform.cipher.iv.length = iv_len;
1861
1862         debug_hexdump(stdout, "key:", key, key_len);
1863
1864         /* Create Crypto session */
1865         ut_params->sess = rte_cryptodev_sym_session_create(
1866                         ts_params->session_mpool);
1867
1868         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
1869                         &ut_params->cipher_xform,
1870                         ts_params->session_priv_mpool);
1871         TEST_ASSERT_EQUAL(status, 0, "session init failed");
1872         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1873         return 0;
1874 }
1875
1876 static int
1877 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
1878                         unsigned int cipher_len,
1879                         unsigned int cipher_offset)
1880 {
1881         struct crypto_testsuite_params *ts_params = &testsuite_params;
1882         struct crypto_unittest_params *ut_params = &unittest_params;
1883
1884         /* Generate Crypto op data structure */
1885         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1886                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1887         TEST_ASSERT_NOT_NULL(ut_params->op,
1888                                 "Failed to allocate pktmbuf offload");
1889
1890         /* Set crypto operation data parameters */
1891         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1892
1893         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1894
1895         /* set crypto operation source mbuf */
1896         sym_op->m_src = ut_params->ibuf;
1897
1898         /* iv */
1899         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1900                         iv, iv_len);
1901         sym_op->cipher.data.length = cipher_len;
1902         sym_op->cipher.data.offset = cipher_offset;
1903         return 0;
1904 }
1905
1906 static int
1907 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
1908                         unsigned int cipher_len,
1909                         unsigned int cipher_offset)
1910 {
1911         struct crypto_testsuite_params *ts_params = &testsuite_params;
1912         struct crypto_unittest_params *ut_params = &unittest_params;
1913
1914         /* Generate Crypto op data structure */
1915         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1916                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1917         TEST_ASSERT_NOT_NULL(ut_params->op,
1918                                 "Failed to allocate pktmbuf offload");
1919
1920         /* Set crypto operation data parameters */
1921         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1922
1923         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1924
1925         /* set crypto operation source mbuf */
1926         sym_op->m_src = ut_params->ibuf;
1927         sym_op->m_dst = ut_params->obuf;
1928
1929         /* iv */
1930         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1931                         iv, iv_len);
1932         sym_op->cipher.data.length = cipher_len;
1933         sym_op->cipher.data.offset = cipher_offset;
1934         return 0;
1935 }
1936
1937 static int
1938 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
1939                 enum rte_crypto_cipher_operation cipher_op,
1940                 enum rte_crypto_auth_operation auth_op,
1941                 enum rte_crypto_auth_algorithm auth_algo,
1942                 enum rte_crypto_cipher_algorithm cipher_algo,
1943                 const uint8_t *key, uint8_t key_len,
1944                 uint8_t auth_iv_len, uint8_t auth_len,
1945                 uint8_t cipher_iv_len)
1946
1947 {
1948         uint8_t cipher_auth_key[key_len];
1949         int status;
1950
1951         struct crypto_testsuite_params *ts_params = &testsuite_params;
1952         struct crypto_unittest_params *ut_params = &unittest_params;
1953
1954         memcpy(cipher_auth_key, key, key_len);
1955
1956         /* Setup Authentication Parameters */
1957         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1958         ut_params->auth_xform.next = NULL;
1959
1960         ut_params->auth_xform.auth.op = auth_op;
1961         ut_params->auth_xform.auth.algo = auth_algo;
1962         ut_params->auth_xform.auth.key.length = key_len;
1963         /* Hash key = cipher key */
1964         ut_params->auth_xform.auth.key.data = cipher_auth_key;
1965         ut_params->auth_xform.auth.digest_length = auth_len;
1966         /* Auth IV will be after cipher IV */
1967         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
1968         ut_params->auth_xform.auth.iv.length = auth_iv_len;
1969
1970         /* Setup Cipher Parameters */
1971         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1972         ut_params->cipher_xform.next = &ut_params->auth_xform;
1973
1974         ut_params->cipher_xform.cipher.algo = cipher_algo;
1975         ut_params->cipher_xform.cipher.op = cipher_op;
1976         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
1977         ut_params->cipher_xform.cipher.key.length = key_len;
1978         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1979         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
1980
1981         debug_hexdump(stdout, "key:", key, key_len);
1982
1983         /* Create Crypto session*/
1984         ut_params->sess = rte_cryptodev_sym_session_create(
1985                         ts_params->session_mpool);
1986         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1987
1988         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
1989                         &ut_params->cipher_xform,
1990                         ts_params->session_priv_mpool);
1991         if (status == -ENOTSUP)
1992                 return status;
1993
1994         TEST_ASSERT_EQUAL(status, 0, "session init failed");
1995         return 0;
1996 }
1997
1998 static int
1999 create_wireless_cipher_auth_session(uint8_t dev_id,
2000                 enum rte_crypto_cipher_operation cipher_op,
2001                 enum rte_crypto_auth_operation auth_op,
2002                 enum rte_crypto_auth_algorithm auth_algo,
2003                 enum rte_crypto_cipher_algorithm cipher_algo,
2004                 const struct wireless_test_data *tdata)
2005 {
2006         const uint8_t key_len = tdata->key.len;
2007         uint8_t cipher_auth_key[key_len];
2008         int status;
2009
2010         struct crypto_testsuite_params *ts_params = &testsuite_params;
2011         struct crypto_unittest_params *ut_params = &unittest_params;
2012         const uint8_t *key = tdata->key.data;
2013         const uint8_t auth_len = tdata->digest.len;
2014         uint8_t cipher_iv_len = tdata->cipher_iv.len;
2015         uint8_t auth_iv_len = tdata->auth_iv.len;
2016
2017         memcpy(cipher_auth_key, key, key_len);
2018
2019         /* Setup Authentication Parameters */
2020         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2021         ut_params->auth_xform.next = NULL;
2022
2023         ut_params->auth_xform.auth.op = auth_op;
2024         ut_params->auth_xform.auth.algo = auth_algo;
2025         ut_params->auth_xform.auth.key.length = key_len;
2026         /* Hash key = cipher key */
2027         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2028         ut_params->auth_xform.auth.digest_length = auth_len;
2029         /* Auth IV will be after cipher IV */
2030         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2031         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2032
2033         /* Setup Cipher Parameters */
2034         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2035         ut_params->cipher_xform.next = &ut_params->auth_xform;
2036
2037         ut_params->cipher_xform.cipher.algo = cipher_algo;
2038         ut_params->cipher_xform.cipher.op = cipher_op;
2039         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2040         ut_params->cipher_xform.cipher.key.length = key_len;
2041         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2042         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2043
2044
2045         debug_hexdump(stdout, "key:", key, key_len);
2046
2047         /* Create Crypto session*/
2048         ut_params->sess = rte_cryptodev_sym_session_create(
2049                         ts_params->session_mpool);
2050
2051         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2052                         &ut_params->cipher_xform,
2053                         ts_params->session_priv_mpool);
2054
2055         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2056         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2057         return 0;
2058 }
2059
2060 static int
2061 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2062                 const struct wireless_test_data *tdata)
2063 {
2064         return create_wireless_cipher_auth_session(dev_id,
2065                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2066                 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2067                 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2068 }
2069
2070 static int
2071 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2072                 enum rte_crypto_cipher_operation cipher_op,
2073                 enum rte_crypto_auth_operation auth_op,
2074                 enum rte_crypto_auth_algorithm auth_algo,
2075                 enum rte_crypto_cipher_algorithm cipher_algo,
2076                 const uint8_t *key, const uint8_t key_len,
2077                 uint8_t auth_iv_len, uint8_t auth_len,
2078                 uint8_t cipher_iv_len)
2079 {
2080         uint8_t auth_cipher_key[key_len];
2081         int status;
2082         struct crypto_testsuite_params *ts_params = &testsuite_params;
2083         struct crypto_unittest_params *ut_params = &unittest_params;
2084
2085         memcpy(auth_cipher_key, key, key_len);
2086
2087         /* Setup Authentication Parameters */
2088         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2089         ut_params->auth_xform.auth.op = auth_op;
2090         ut_params->auth_xform.next = &ut_params->cipher_xform;
2091         ut_params->auth_xform.auth.algo = auth_algo;
2092         ut_params->auth_xform.auth.key.length = key_len;
2093         ut_params->auth_xform.auth.key.data = auth_cipher_key;
2094         ut_params->auth_xform.auth.digest_length = auth_len;
2095         /* Auth IV will be after cipher IV */
2096         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2097         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2098
2099         /* Setup Cipher Parameters */
2100         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2101         ut_params->cipher_xform.next = NULL;
2102         ut_params->cipher_xform.cipher.algo = cipher_algo;
2103         ut_params->cipher_xform.cipher.op = cipher_op;
2104         ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2105         ut_params->cipher_xform.cipher.key.length = key_len;
2106         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2107         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2108
2109         debug_hexdump(stdout, "key:", key, key_len);
2110
2111         /* Create Crypto session*/
2112         ut_params->sess = rte_cryptodev_sym_session_create(
2113                         ts_params->session_mpool);
2114         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2115
2116         if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2117                 ut_params->auth_xform.next = NULL;
2118                 ut_params->cipher_xform.next = &ut_params->auth_xform;
2119                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2120                                 &ut_params->cipher_xform,
2121                                 ts_params->session_priv_mpool);
2122
2123         } else
2124                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2125                                 &ut_params->auth_xform,
2126                                 ts_params->session_priv_mpool);
2127
2128         if (status == -ENOTSUP)
2129                 return status;
2130
2131         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2132
2133         return 0;
2134 }
2135
2136 static int
2137 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2138                 unsigned int auth_tag_len,
2139                 const uint8_t *iv, unsigned int iv_len,
2140                 unsigned int data_pad_len,
2141                 enum rte_crypto_auth_operation op,
2142                 unsigned int auth_len, unsigned int auth_offset)
2143 {
2144         struct crypto_testsuite_params *ts_params = &testsuite_params;
2145
2146         struct crypto_unittest_params *ut_params = &unittest_params;
2147
2148         /* Generate Crypto op data structure */
2149         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2150                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2151         TEST_ASSERT_NOT_NULL(ut_params->op,
2152                 "Failed to allocate pktmbuf offload");
2153
2154         /* Set crypto operation data parameters */
2155         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2156
2157         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2158
2159         /* set crypto operation source mbuf */
2160         sym_op->m_src = ut_params->ibuf;
2161
2162         /* iv */
2163         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2164                         iv, iv_len);
2165         /* digest */
2166         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2167                                         ut_params->ibuf, auth_tag_len);
2168
2169         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2170                                 "no room to append auth tag");
2171         ut_params->digest = sym_op->auth.digest.data;
2172         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2173                         ut_params->ibuf, data_pad_len);
2174         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2175                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2176         else
2177                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2178
2179         debug_hexdump(stdout, "digest:",
2180                 sym_op->auth.digest.data,
2181                 auth_tag_len);
2182
2183         sym_op->auth.data.length = auth_len;
2184         sym_op->auth.data.offset = auth_offset;
2185
2186         return 0;
2187 }
2188
2189 static int
2190 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2191         enum rte_crypto_auth_operation op)
2192 {
2193         struct crypto_testsuite_params *ts_params = &testsuite_params;
2194         struct crypto_unittest_params *ut_params = &unittest_params;
2195
2196         const uint8_t *auth_tag = tdata->digest.data;
2197         const unsigned int auth_tag_len = tdata->digest.len;
2198         unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2199         unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2200
2201         const uint8_t *cipher_iv = tdata->cipher_iv.data;
2202         const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2203         const uint8_t *auth_iv = tdata->auth_iv.data;
2204         const uint8_t auth_iv_len = tdata->auth_iv.len;
2205         const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2206         const unsigned int auth_len = tdata->validAuthLenInBits.len;
2207
2208         /* Generate Crypto op data structure */
2209         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2210                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2211         TEST_ASSERT_NOT_NULL(ut_params->op,
2212                         "Failed to allocate pktmbuf offload");
2213         /* Set crypto operation data parameters */
2214         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2215
2216         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2217
2218         /* set crypto operation source mbuf */
2219         sym_op->m_src = ut_params->ibuf;
2220
2221         /* digest */
2222         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2223                         ut_params->ibuf, auth_tag_len);
2224
2225         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2226                         "no room to append auth tag");
2227         ut_params->digest = sym_op->auth.digest.data;
2228         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2229                         ut_params->ibuf, data_pad_len);
2230         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2231                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2232         else
2233                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2234
2235         debug_hexdump(stdout, "digest:",
2236                 sym_op->auth.digest.data,
2237                 auth_tag_len);
2238
2239         /* Copy cipher and auth IVs at the end of the crypto operation */
2240         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2241                                                 IV_OFFSET);
2242         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2243         iv_ptr += cipher_iv_len;
2244         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2245
2246         sym_op->cipher.data.length = cipher_len;
2247         sym_op->cipher.data.offset = 0;
2248         sym_op->auth.data.length = auth_len;
2249         sym_op->auth.data.offset = 0;
2250
2251         return 0;
2252 }
2253
2254 static int
2255 create_zuc_cipher_hash_generate_operation(
2256                 const struct wireless_test_data *tdata)
2257 {
2258         return create_wireless_cipher_hash_operation(tdata,
2259                 RTE_CRYPTO_AUTH_OP_GENERATE);
2260 }
2261
2262 static int
2263 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2264                 const unsigned auth_tag_len,
2265                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2266                 unsigned data_pad_len,
2267                 enum rte_crypto_auth_operation op,
2268                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2269                 const unsigned cipher_len, const unsigned cipher_offset,
2270                 const unsigned auth_len, const unsigned auth_offset)
2271 {
2272         struct crypto_testsuite_params *ts_params = &testsuite_params;
2273         struct crypto_unittest_params *ut_params = &unittest_params;
2274
2275         enum rte_crypto_cipher_algorithm cipher_algo =
2276                         ut_params->cipher_xform.cipher.algo;
2277         enum rte_crypto_auth_algorithm auth_algo =
2278                         ut_params->auth_xform.auth.algo;
2279
2280         /* Generate Crypto op data structure */
2281         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2282                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2283         TEST_ASSERT_NOT_NULL(ut_params->op,
2284                         "Failed to allocate pktmbuf offload");
2285         /* Set crypto operation data parameters */
2286         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2287
2288         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2289
2290         /* set crypto operation source mbuf */
2291         sym_op->m_src = ut_params->ibuf;
2292
2293         /* digest */
2294         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2295                         ut_params->ibuf, auth_tag_len);
2296
2297         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2298                         "no room to append auth tag");
2299         ut_params->digest = sym_op->auth.digest.data;
2300
2301         if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2302                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2303                                 ut_params->ibuf, data_pad_len);
2304         } else {
2305                 struct rte_mbuf *m = ut_params->ibuf;
2306                 unsigned int offset = data_pad_len;
2307
2308                 while (offset > m->data_len && m->next != NULL) {
2309                         offset -= m->data_len;
2310                         m = m->next;
2311                 }
2312                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2313                         m, offset);
2314         }
2315
2316         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2317                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2318         else
2319                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2320
2321         debug_hexdump(stdout, "digest:",
2322                 sym_op->auth.digest.data,
2323                 auth_tag_len);
2324
2325         /* Copy cipher and auth IVs at the end of the crypto operation */
2326         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2327                                                 IV_OFFSET);
2328         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2329         iv_ptr += cipher_iv_len;
2330         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2331
2332         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2333                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2334                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2335                 sym_op->cipher.data.length = cipher_len;
2336                 sym_op->cipher.data.offset = cipher_offset;
2337         } else {
2338                 sym_op->cipher.data.length = cipher_len >> 3;
2339                 sym_op->cipher.data.offset = cipher_offset >> 3;
2340         }
2341
2342         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2343                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2344                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2345                 sym_op->auth.data.length = auth_len;
2346                 sym_op->auth.data.offset = auth_offset;
2347         } else {
2348                 sym_op->auth.data.length = auth_len >> 3;
2349                 sym_op->auth.data.offset = auth_offset >> 3;
2350         }
2351
2352         return 0;
2353 }
2354
2355 static int
2356 create_wireless_algo_auth_cipher_operation(
2357                 const uint8_t *auth_tag, unsigned int auth_tag_len,
2358                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2359                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2360                 unsigned int data_pad_len,
2361                 unsigned int cipher_len, unsigned int cipher_offset,
2362                 unsigned int auth_len, unsigned int auth_offset,
2363                 uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2364 {
2365         struct crypto_testsuite_params *ts_params = &testsuite_params;
2366         struct crypto_unittest_params *ut_params = &unittest_params;
2367
2368         enum rte_crypto_cipher_algorithm cipher_algo =
2369                         ut_params->cipher_xform.cipher.algo;
2370         enum rte_crypto_auth_algorithm auth_algo =
2371                         ut_params->auth_xform.auth.algo;
2372
2373         /* Generate Crypto op data structure */
2374         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2375                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2376         TEST_ASSERT_NOT_NULL(ut_params->op,
2377                         "Failed to allocate pktmbuf offload");
2378
2379         /* Set crypto operation data parameters */
2380         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2381
2382         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2383
2384         /* set crypto operation mbufs */
2385         sym_op->m_src = ut_params->ibuf;
2386         if (op_mode == OUT_OF_PLACE)
2387                 sym_op->m_dst = ut_params->obuf;
2388
2389         /* digest */
2390         if (!do_sgl) {
2391                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2392                         (op_mode == IN_PLACE ?
2393                                 ut_params->ibuf : ut_params->obuf),
2394                         uint8_t *, data_pad_len);
2395                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2396                         (op_mode == IN_PLACE ?
2397                                 ut_params->ibuf : ut_params->obuf),
2398                         data_pad_len);
2399                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2400         } else {
2401                 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
2402                 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
2403                                 sym_op->m_src : sym_op->m_dst);
2404                 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
2405                         remaining_off -= rte_pktmbuf_data_len(sgl_buf);
2406                         sgl_buf = sgl_buf->next;
2407                 }
2408                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
2409                                 uint8_t *, remaining_off);
2410                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
2411                                 remaining_off);
2412                 memset(sym_op->auth.digest.data, 0, remaining_off);
2413                 while (sgl_buf->next != NULL) {
2414                         memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
2415                                 0, rte_pktmbuf_data_len(sgl_buf));
2416                         sgl_buf = sgl_buf->next;
2417                 }
2418         }
2419
2420         /* Copy digest for the verification */
2421         if (verify)
2422                 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2423
2424         /* Copy cipher and auth IVs at the end of the crypto operation */
2425         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
2426                         ut_params->op, uint8_t *, IV_OFFSET);
2427
2428         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2429         iv_ptr += cipher_iv_len;
2430         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2431
2432         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2433                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2434                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2435                 sym_op->cipher.data.length = cipher_len;
2436                 sym_op->cipher.data.offset = cipher_offset;
2437         } else {
2438                 sym_op->cipher.data.length = cipher_len >> 3;
2439                 sym_op->cipher.data.offset = cipher_offset >> 3;
2440         }
2441
2442         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2443                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2444                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2445                 sym_op->auth.data.length = auth_len;
2446                 sym_op->auth.data.offset = auth_offset;
2447         } else {
2448                 sym_op->auth.data.length = auth_len >> 3;
2449                 sym_op->auth.data.offset = auth_offset >> 3;
2450         }
2451
2452         return 0;
2453 }
2454
2455 static int
2456 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
2457 {
2458         struct crypto_testsuite_params *ts_params = &testsuite_params;
2459         struct crypto_unittest_params *ut_params = &unittest_params;
2460
2461         int retval;
2462         unsigned plaintext_pad_len;
2463         unsigned plaintext_len;
2464         uint8_t *plaintext;
2465
2466         /* QAT PMD supports byte-aligned data only */
2467         if ((tdata->validAuthLenInBits.len % 8 != 0) &&
2468                         (gbl_driver_id == rte_cryptodev_driver_id_get(
2469                                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD))))
2470                 return -ENOTSUP;
2471
2472         /* Verify the capabilities */
2473         struct rte_cryptodev_sym_capability_idx cap_idx;
2474         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2475         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2476         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2477                         &cap_idx) == NULL)
2478                 return -ENOTSUP;
2479
2480         /* Create SNOW 3G session */
2481         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2482                         tdata->key.data, tdata->key.len,
2483                         tdata->auth_iv.len, tdata->digest.len,
2484                         RTE_CRYPTO_AUTH_OP_GENERATE,
2485                         RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2486         if (retval < 0)
2487                 return retval;
2488
2489         /* alloc mbuf and set payload */
2490         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2491
2492         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2493         rte_pktmbuf_tailroom(ut_params->ibuf));
2494
2495         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2496         /* Append data which is padded to a multiple of */
2497         /* the algorithms block size */
2498         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2499         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2500                                 plaintext_pad_len);
2501         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2502
2503         /* Create SNOW 3G operation */
2504         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2505                         tdata->auth_iv.data, tdata->auth_iv.len,
2506                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2507                         tdata->validAuthLenInBits.len,
2508                         0);
2509         if (retval < 0)
2510                 return retval;
2511
2512         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2513                                 ut_params->op);
2514         ut_params->obuf = ut_params->op->sym->m_src;
2515         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2516         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2517                         + plaintext_pad_len;
2518
2519         /* Validate obuf */
2520         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2521         ut_params->digest,
2522         tdata->digest.data,
2523         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
2524         "SNOW 3G Generated auth tag not as expected");
2525
2526         return 0;
2527 }
2528
2529 static int
2530 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
2531 {
2532         struct crypto_testsuite_params *ts_params = &testsuite_params;
2533         struct crypto_unittest_params *ut_params = &unittest_params;
2534
2535         int retval;
2536         unsigned plaintext_pad_len;
2537         unsigned plaintext_len;
2538         uint8_t *plaintext;
2539
2540         /* QAT PMD supports byte-aligned data only */
2541         if ((tdata->validAuthLenInBits.len % 8 != 0) &&
2542                         (gbl_driver_id == rte_cryptodev_driver_id_get(
2543                                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD))))
2544                 return -ENOTSUP;
2545
2546         /* Verify the capabilities */
2547         struct rte_cryptodev_sym_capability_idx cap_idx;
2548         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2549         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2550         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2551                         &cap_idx) == NULL)
2552                 return -ENOTSUP;
2553
2554         /* Create SNOW 3G session */
2555         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2556                                 tdata->key.data, tdata->key.len,
2557                                 tdata->auth_iv.len, tdata->digest.len,
2558                                 RTE_CRYPTO_AUTH_OP_VERIFY,
2559                                 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2560         if (retval < 0)
2561                 return retval;
2562         /* alloc mbuf and set payload */
2563         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2564
2565         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2566         rte_pktmbuf_tailroom(ut_params->ibuf));
2567
2568         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2569         /* Append data which is padded to a multiple of */
2570         /* the algorithms block size */
2571         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2572         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2573                                 plaintext_pad_len);
2574         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2575
2576         /* Create SNOW 3G operation */
2577         retval = create_wireless_algo_hash_operation(tdata->digest.data,
2578                         tdata->digest.len,
2579                         tdata->auth_iv.data, tdata->auth_iv.len,
2580                         plaintext_pad_len,
2581                         RTE_CRYPTO_AUTH_OP_VERIFY,
2582                         tdata->validAuthLenInBits.len,
2583                         0);
2584         if (retval < 0)
2585                 return retval;
2586
2587         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2588                                 ut_params->op);
2589         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2590         ut_params->obuf = ut_params->op->sym->m_src;
2591         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2592                                 + plaintext_pad_len;
2593
2594         /* Validate obuf */
2595         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
2596                 return 0;
2597         else
2598                 return -1;
2599
2600         return 0;
2601 }
2602
2603 static int
2604 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
2605 {
2606         struct crypto_testsuite_params *ts_params = &testsuite_params;
2607         struct crypto_unittest_params *ut_params = &unittest_params;
2608
2609         int retval;
2610         unsigned plaintext_pad_len;
2611         unsigned plaintext_len;
2612         uint8_t *plaintext;
2613
2614         /* Verify the capabilities */
2615         struct rte_cryptodev_sym_capability_idx cap_idx;
2616         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2617         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2618         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2619                         &cap_idx) == NULL)
2620                 return -ENOTSUP;
2621
2622         /* Create KASUMI session */
2623         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2624                         tdata->key.data, tdata->key.len,
2625                         0, tdata->digest.len,
2626                         RTE_CRYPTO_AUTH_OP_GENERATE,
2627                         RTE_CRYPTO_AUTH_KASUMI_F9);
2628         if (retval < 0)
2629                 return retval;
2630
2631         /* alloc mbuf and set payload */
2632         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2633
2634         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2635         rte_pktmbuf_tailroom(ut_params->ibuf));
2636
2637         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2638         /* Append data which is padded to a multiple of */
2639         /* the algorithms block size */
2640         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2641         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2642                                 plaintext_pad_len);
2643         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2644
2645         /* Create KASUMI operation */
2646         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2647                         NULL, 0,
2648                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2649                         tdata->plaintext.len,
2650                         0);
2651         if (retval < 0)
2652                 return retval;
2653
2654         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2655                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2656                         ut_params->op);
2657         else
2658                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2659                         ut_params->op);
2660
2661         ut_params->obuf = ut_params->op->sym->m_src;
2662         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2663         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2664                         + plaintext_pad_len;
2665
2666         /* Validate obuf */
2667         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2668         ut_params->digest,
2669         tdata->digest.data,
2670         DIGEST_BYTE_LENGTH_KASUMI_F9,
2671         "KASUMI Generated auth tag not as expected");
2672
2673         return 0;
2674 }
2675
2676 static int
2677 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
2678 {
2679         struct crypto_testsuite_params *ts_params = &testsuite_params;
2680         struct crypto_unittest_params *ut_params = &unittest_params;
2681
2682         int retval;
2683         unsigned plaintext_pad_len;
2684         unsigned plaintext_len;
2685         uint8_t *plaintext;
2686
2687         /* Verify the capabilities */
2688         struct rte_cryptodev_sym_capability_idx cap_idx;
2689         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2690         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2691         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2692                         &cap_idx) == NULL)
2693                 return -ENOTSUP;
2694
2695         /* Create KASUMI session */
2696         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2697                                 tdata->key.data, tdata->key.len,
2698                                 0, tdata->digest.len,
2699                                 RTE_CRYPTO_AUTH_OP_VERIFY,
2700                                 RTE_CRYPTO_AUTH_KASUMI_F9);
2701         if (retval < 0)
2702                 return retval;
2703         /* alloc mbuf and set payload */
2704         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2705
2706         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2707         rte_pktmbuf_tailroom(ut_params->ibuf));
2708
2709         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2710         /* Append data which is padded to a multiple */
2711         /* of the algorithms block size */
2712         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2713         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2714                                 plaintext_pad_len);
2715         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2716
2717         /* Create KASUMI operation */
2718         retval = create_wireless_algo_hash_operation(tdata->digest.data,
2719                         tdata->digest.len,
2720                         NULL, 0,
2721                         plaintext_pad_len,
2722                         RTE_CRYPTO_AUTH_OP_VERIFY,
2723                         tdata->plaintext.len,
2724                         0);
2725         if (retval < 0)
2726                 return retval;
2727
2728         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2729                                 ut_params->op);
2730         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2731         ut_params->obuf = ut_params->op->sym->m_src;
2732         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2733                                 + plaintext_pad_len;
2734
2735         /* Validate obuf */
2736         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
2737                 return 0;
2738         else
2739                 return -1;
2740
2741         return 0;
2742 }
2743
2744 static int
2745 test_snow3g_hash_generate_test_case_1(void)
2746 {
2747         return test_snow3g_authentication(&snow3g_hash_test_case_1);
2748 }
2749
2750 static int
2751 test_snow3g_hash_generate_test_case_2(void)
2752 {
2753         return test_snow3g_authentication(&snow3g_hash_test_case_2);
2754 }
2755
2756 static int
2757 test_snow3g_hash_generate_test_case_3(void)
2758 {
2759         return test_snow3g_authentication(&snow3g_hash_test_case_3);
2760 }
2761
2762 static int
2763 test_snow3g_hash_generate_test_case_4(void)
2764 {
2765         return test_snow3g_authentication(&snow3g_hash_test_case_4);
2766 }
2767
2768 static int
2769 test_snow3g_hash_generate_test_case_5(void)
2770 {
2771         return test_snow3g_authentication(&snow3g_hash_test_case_5);
2772 }
2773
2774 static int
2775 test_snow3g_hash_generate_test_case_6(void)
2776 {
2777         return test_snow3g_authentication(&snow3g_hash_test_case_6);
2778 }
2779
2780 static int
2781 test_snow3g_hash_verify_test_case_1(void)
2782 {
2783         return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
2784
2785 }
2786
2787 static int
2788 test_snow3g_hash_verify_test_case_2(void)
2789 {
2790         return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
2791 }
2792
2793 static int
2794 test_snow3g_hash_verify_test_case_3(void)
2795 {
2796         return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
2797 }
2798
2799 static int
2800 test_snow3g_hash_verify_test_case_4(void)
2801 {
2802         return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
2803 }
2804
2805 static int
2806 test_snow3g_hash_verify_test_case_5(void)
2807 {
2808         return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
2809 }
2810
2811 static int
2812 test_snow3g_hash_verify_test_case_6(void)
2813 {
2814         return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
2815 }
2816
2817 static int
2818 test_kasumi_hash_generate_test_case_1(void)
2819 {
2820         return test_kasumi_authentication(&kasumi_hash_test_case_1);
2821 }
2822
2823 static int
2824 test_kasumi_hash_generate_test_case_2(void)
2825 {
2826         return test_kasumi_authentication(&kasumi_hash_test_case_2);
2827 }
2828
2829 static int
2830 test_kasumi_hash_generate_test_case_3(void)
2831 {
2832         return test_kasumi_authentication(&kasumi_hash_test_case_3);
2833 }
2834
2835 static int
2836 test_kasumi_hash_generate_test_case_4(void)
2837 {
2838         return test_kasumi_authentication(&kasumi_hash_test_case_4);
2839 }
2840
2841 static int
2842 test_kasumi_hash_generate_test_case_5(void)
2843 {
2844         return test_kasumi_authentication(&kasumi_hash_test_case_5);
2845 }
2846
2847 static int
2848 test_kasumi_hash_generate_test_case_6(void)
2849 {
2850         return test_kasumi_authentication(&kasumi_hash_test_case_6);
2851 }
2852
2853 static int
2854 test_kasumi_hash_verify_test_case_1(void)
2855 {
2856         return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
2857 }
2858
2859 static int
2860 test_kasumi_hash_verify_test_case_2(void)
2861 {
2862         return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
2863 }
2864
2865 static int
2866 test_kasumi_hash_verify_test_case_3(void)
2867 {
2868         return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
2869 }
2870
2871 static int
2872 test_kasumi_hash_verify_test_case_4(void)
2873 {
2874         return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
2875 }
2876
2877 static int
2878 test_kasumi_hash_verify_test_case_5(void)
2879 {
2880         return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
2881 }
2882
2883 static int
2884 test_kasumi_encryption(const struct kasumi_test_data *tdata)
2885 {
2886         struct crypto_testsuite_params *ts_params = &testsuite_params;
2887         struct crypto_unittest_params *ut_params = &unittest_params;
2888
2889         int retval;
2890         uint8_t *plaintext, *ciphertext;
2891         unsigned plaintext_pad_len;
2892         unsigned plaintext_len;
2893
2894         /* Verify the capabilities */
2895         struct rte_cryptodev_sym_capability_idx cap_idx;
2896         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2897         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
2898         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2899                         &cap_idx) == NULL)
2900                 return -ENOTSUP;
2901
2902         /* Create KASUMI session */
2903         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
2904                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2905                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
2906                                         tdata->key.data, tdata->key.len,
2907                                         tdata->cipher_iv.len);
2908         if (retval < 0)
2909                 return retval;
2910
2911         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2912
2913         /* Clear mbuf payload */
2914         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2915                rte_pktmbuf_tailroom(ut_params->ibuf));
2916
2917         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2918         /* Append data which is padded to a multiple */
2919         /* of the algorithms block size */
2920         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2921         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2922                                 plaintext_pad_len);
2923         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2924
2925         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
2926
2927         /* Create KASUMI operation */
2928         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
2929                                 tdata->cipher_iv.len,
2930                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
2931                                 tdata->validCipherOffsetInBits.len);
2932         if (retval < 0)
2933                 return retval;
2934
2935         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2936                                                 ut_params->op);
2937         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2938
2939         ut_params->obuf = ut_params->op->sym->m_dst;
2940         if (ut_params->obuf)
2941                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
2942         else
2943                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
2944
2945         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
2946
2947         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
2948                                 (tdata->validCipherOffsetInBits.len >> 3);
2949         /* Validate obuf */
2950         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
2951                 ciphertext,
2952                 reference_ciphertext,
2953                 tdata->validCipherLenInBits.len,
2954                 "KASUMI Ciphertext data not as expected");
2955         return 0;
2956 }
2957
2958 static int
2959 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
2960 {
2961         struct crypto_testsuite_params *ts_params = &testsuite_params;
2962         struct crypto_unittest_params *ut_params = &unittest_params;
2963
2964         int retval;
2965
2966         unsigned int plaintext_pad_len;
2967         unsigned int plaintext_len;
2968
2969         uint8_t buffer[10000];
2970         const uint8_t *ciphertext;
2971
2972         struct rte_cryptodev_info dev_info;
2973
2974         /* Verify the capabilities */
2975         struct rte_cryptodev_sym_capability_idx cap_idx;
2976         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2977         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
2978         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2979                         &cap_idx) == NULL)
2980                 return -ENOTSUP;
2981
2982         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2983
2984         uint64_t feat_flags = dev_info.feature_flags;
2985
2986         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
2987                 printf("Device doesn't support in-place scatter-gather. "
2988                                 "Test Skipped.\n");
2989                 return -ENOTSUP;
2990         }
2991
2992         /* Create KASUMI session */
2993         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
2994                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2995                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
2996                                         tdata->key.data, tdata->key.len,
2997                                         tdata->cipher_iv.len);
2998         if (retval < 0)
2999                 return retval;
3000
3001         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3002
3003
3004         /* Append data which is padded to a multiple */
3005         /* of the algorithms block size */
3006         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3007
3008         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3009                         plaintext_pad_len, 10, 0);
3010
3011         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3012
3013         /* Create KASUMI operation */
3014         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3015                                 tdata->cipher_iv.len,
3016                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3017                                 tdata->validCipherOffsetInBits.len);
3018         if (retval < 0)
3019                 return retval;
3020
3021         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3022                                                 ut_params->op);
3023         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3024
3025         ut_params->obuf = ut_params->op->sym->m_dst;
3026
3027         if (ut_params->obuf)
3028                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3029                                 plaintext_len, buffer);
3030         else
3031                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3032                                 tdata->validCipherOffsetInBits.len >> 3,
3033                                 plaintext_len, buffer);
3034
3035         /* Validate obuf */
3036         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3037
3038         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3039                                 (tdata->validCipherOffsetInBits.len >> 3);
3040         /* Validate obuf */
3041         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3042                 ciphertext,
3043                 reference_ciphertext,
3044                 tdata->validCipherLenInBits.len,
3045                 "KASUMI Ciphertext data not as expected");
3046         return 0;
3047 }
3048
3049 static int
3050 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3051 {
3052         struct crypto_testsuite_params *ts_params = &testsuite_params;
3053         struct crypto_unittest_params *ut_params = &unittest_params;
3054
3055         int retval;
3056         uint8_t *plaintext, *ciphertext;
3057         unsigned plaintext_pad_len;
3058         unsigned plaintext_len;
3059
3060         /* Verify the capabilities */
3061         struct rte_cryptodev_sym_capability_idx cap_idx;
3062         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3063         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3064         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3065                         &cap_idx) == NULL)
3066                 return -ENOTSUP;
3067
3068         /* Create KASUMI session */
3069         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3070                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3071                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3072                                         tdata->key.data, tdata->key.len,
3073                                         tdata->cipher_iv.len);
3074         if (retval < 0)
3075                 return retval;
3076
3077         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3078         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3079
3080         /* Clear mbuf payload */
3081         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3082                rte_pktmbuf_tailroom(ut_params->ibuf));
3083
3084         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3085         /* Append data which is padded to a multiple */
3086         /* of the algorithms block size */
3087         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3088         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3089                                 plaintext_pad_len);
3090         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3091         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3092
3093         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3094
3095         /* Create KASUMI operation */
3096         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3097                                 tdata->cipher_iv.len,
3098                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3099                                 tdata->validCipherOffsetInBits.len);
3100         if (retval < 0)
3101                 return retval;
3102
3103         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3104                                                 ut_params->op);
3105         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3106
3107         ut_params->obuf = ut_params->op->sym->m_dst;
3108         if (ut_params->obuf)
3109                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3110         else
3111                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3112
3113         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3114
3115         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3116                                 (tdata->validCipherOffsetInBits.len >> 3);
3117         /* Validate obuf */
3118         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3119                 ciphertext,
3120                 reference_ciphertext,
3121                 tdata->validCipherLenInBits.len,
3122                 "KASUMI Ciphertext data not as expected");
3123         return 0;
3124 }
3125
3126 static int
3127 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3128 {
3129         struct crypto_testsuite_params *ts_params = &testsuite_params;
3130         struct crypto_unittest_params *ut_params = &unittest_params;
3131
3132         int retval;
3133         unsigned int plaintext_pad_len;
3134         unsigned int plaintext_len;
3135
3136         const uint8_t *ciphertext;
3137         uint8_t buffer[2048];
3138
3139         struct rte_cryptodev_info dev_info;
3140
3141         /* Verify the capabilities */
3142         struct rte_cryptodev_sym_capability_idx cap_idx;
3143         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3144         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3145         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3146                         &cap_idx) == NULL)
3147                 return -ENOTSUP;
3148
3149         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3150
3151         uint64_t feat_flags = dev_info.feature_flags;
3152         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3153                 printf("Device doesn't support out-of-place scatter-gather "
3154                                 "in both input and output mbufs. "
3155                                 "Test Skipped.\n");
3156                 return -ENOTSUP;
3157         }
3158
3159         /* Create KASUMI session */
3160         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3161                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3162                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3163                                         tdata->key.data, tdata->key.len,
3164                                         tdata->cipher_iv.len);
3165         if (retval < 0)
3166                 return retval;
3167
3168         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3169         /* Append data which is padded to a multiple */
3170         /* of the algorithms block size */
3171         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3172
3173         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3174                         plaintext_pad_len, 10, 0);
3175         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3176                         plaintext_pad_len, 3, 0);
3177
3178         /* Append data which is padded to a multiple */
3179         /* of the algorithms block size */
3180         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3181
3182         /* Create KASUMI operation */
3183         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3184                                 tdata->cipher_iv.len,
3185                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3186                                 tdata->validCipherOffsetInBits.len);
3187         if (retval < 0)
3188                 return retval;
3189
3190         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3191                                                 ut_params->op);
3192         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3193
3194         ut_params->obuf = ut_params->op->sym->m_dst;
3195         if (ut_params->obuf)
3196                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3197                                 plaintext_pad_len, buffer);
3198         else
3199                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3200                                 tdata->validCipherOffsetInBits.len >> 3,
3201                                 plaintext_pad_len, buffer);
3202
3203         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3204                                 (tdata->validCipherOffsetInBits.len >> 3);
3205         /* Validate obuf */
3206         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3207                 ciphertext,
3208                 reference_ciphertext,
3209                 tdata->validCipherLenInBits.len,
3210                 "KASUMI Ciphertext data not as expected");
3211         return 0;
3212 }
3213
3214
3215 static int
3216 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3217 {
3218         struct crypto_testsuite_params *ts_params = &testsuite_params;
3219         struct crypto_unittest_params *ut_params = &unittest_params;
3220
3221         int retval;
3222         uint8_t *ciphertext, *plaintext;
3223         unsigned ciphertext_pad_len;
3224         unsigned ciphertext_len;
3225
3226         /* Verify the capabilities */
3227         struct rte_cryptodev_sym_capability_idx cap_idx;
3228         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3229         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3230         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3231                         &cap_idx) == NULL)
3232                 return -ENOTSUP;
3233
3234         /* Create KASUMI session */
3235         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3236                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3237                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3238                                         tdata->key.data, tdata->key.len,
3239                                         tdata->cipher_iv.len);
3240         if (retval < 0)
3241                 return retval;
3242
3243         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3244         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3245
3246         /* Clear mbuf payload */
3247         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3248                rte_pktmbuf_tailroom(ut_params->ibuf));
3249
3250         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3251         /* Append data which is padded to a multiple */
3252         /* of the algorithms block size */
3253         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3254         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3255                                 ciphertext_pad_len);
3256         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3257         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3258
3259         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3260
3261         /* Create KASUMI operation */
3262         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3263                                 tdata->cipher_iv.len,
3264                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3265                                 tdata->validCipherOffsetInBits.len);
3266         if (retval < 0)
3267                 return retval;
3268
3269         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3270                                                 ut_params->op);
3271         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3272
3273         ut_params->obuf = ut_params->op->sym->m_dst;
3274         if (ut_params->obuf)
3275                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3276         else
3277                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3278
3279         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3280
3281         const uint8_t *reference_plaintext = tdata->plaintext.data +
3282                                 (tdata->validCipherOffsetInBits.len >> 3);
3283         /* Validate obuf */
3284         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3285                 plaintext,
3286                 reference_plaintext,
3287                 tdata->validCipherLenInBits.len,
3288                 "KASUMI Plaintext data not as expected");
3289         return 0;
3290 }
3291
3292 static int
3293 test_kasumi_decryption(const struct kasumi_test_data *tdata)
3294 {
3295         struct crypto_testsuite_params *ts_params = &testsuite_params;
3296         struct crypto_unittest_params *ut_params = &unittest_params;
3297
3298         int retval;
3299         uint8_t *ciphertext, *plaintext;
3300         unsigned ciphertext_pad_len;
3301         unsigned ciphertext_len;
3302
3303         /* Verify the capabilities */
3304         struct rte_cryptodev_sym_capability_idx cap_idx;
3305         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3306         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3307         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3308                         &cap_idx) == NULL)
3309                 return -ENOTSUP;
3310
3311         /* Create KASUMI session */
3312         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3313                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3314                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3315                                         tdata->key.data, tdata->key.len,
3316                                         tdata->cipher_iv.len);
3317         if (retval < 0)
3318                 return retval;
3319
3320         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3321
3322         /* Clear mbuf payload */
3323         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3324                rte_pktmbuf_tailroom(ut_params->ibuf));
3325
3326         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3327         /* Append data which is padded to a multiple */
3328         /* of the algorithms block size */
3329         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3330         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3331                                 ciphertext_pad_len);
3332         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3333
3334         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3335
3336         /* Create KASUMI operation */
3337         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3338                                         tdata->cipher_iv.len,
3339                                         tdata->ciphertext.len,
3340                                         tdata->validCipherOffsetInBits.len);
3341         if (retval < 0)
3342                 return retval;
3343
3344         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3345                                                 ut_params->op);
3346         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3347
3348         ut_params->obuf = ut_params->op->sym->m_dst;
3349         if (ut_params->obuf)
3350                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3351         else
3352                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3353
3354         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3355
3356         const uint8_t *reference_plaintext = tdata->plaintext.data +
3357                                 (tdata->validCipherOffsetInBits.len >> 3);
3358         /* Validate obuf */
3359         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3360                 plaintext,
3361                 reference_plaintext,
3362                 tdata->validCipherLenInBits.len,
3363                 "KASUMI Plaintext data not as expected");
3364         return 0;
3365 }
3366
3367 static int
3368 test_snow3g_encryption(const struct snow3g_test_data *tdata)
3369 {
3370         struct crypto_testsuite_params *ts_params = &testsuite_params;
3371         struct crypto_unittest_params *ut_params = &unittest_params;
3372
3373         int retval;
3374         uint8_t *plaintext, *ciphertext;
3375         unsigned plaintext_pad_len;
3376         unsigned plaintext_len;
3377
3378         /* Verify the capabilities */
3379         struct rte_cryptodev_sym_capability_idx cap_idx;
3380         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3381         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3382         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3383                         &cap_idx) == NULL)
3384                 return -ENOTSUP;
3385
3386         /* Create SNOW 3G session */
3387         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3388                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3389                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3390                                         tdata->key.data, tdata->key.len,
3391                                         tdata->cipher_iv.len);
3392         if (retval < 0)
3393                 return retval;
3394
3395         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3396
3397         /* Clear mbuf payload */
3398         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3399                rte_pktmbuf_tailroom(ut_params->ibuf));
3400
3401         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3402         /* Append data which is padded to a multiple of */
3403         /* the algorithms block size */
3404         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3405         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3406                                 plaintext_pad_len);
3407         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3408
3409         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3410
3411         /* Create SNOW 3G operation */
3412         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3413                                         tdata->cipher_iv.len,
3414                                         tdata->validCipherLenInBits.len,
3415                                         0);
3416         if (retval < 0)
3417                 return retval;
3418
3419         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3420                                                 ut_params->op);
3421         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3422
3423         ut_params->obuf = ut_params->op->sym->m_dst;
3424         if (ut_params->obuf)
3425                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3426         else
3427                 ciphertext = plaintext;
3428
3429         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3430
3431         /* Validate obuf */
3432         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3433                 ciphertext,
3434                 tdata->ciphertext.data,
3435                 tdata->validDataLenInBits.len,
3436                 "SNOW 3G Ciphertext data not as expected");
3437         return 0;
3438 }
3439
3440
3441 static int
3442 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
3443 {
3444         struct crypto_testsuite_params *ts_params = &testsuite_params;
3445         struct crypto_unittest_params *ut_params = &unittest_params;
3446         uint8_t *plaintext, *ciphertext;
3447
3448         int retval;
3449         unsigned plaintext_pad_len;
3450         unsigned plaintext_len;
3451
3452         /* Verify the capabilities */
3453         struct rte_cryptodev_sym_capability_idx cap_idx;
3454         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3455         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3456         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3457                         &cap_idx) == NULL)
3458                 return -ENOTSUP;
3459
3460         /* Create SNOW 3G session */
3461         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3462                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3463                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3464                                         tdata->key.data, tdata->key.len,
3465                                         tdata->cipher_iv.len);
3466         if (retval < 0)
3467                 return retval;
3468
3469         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3470         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3471
3472         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3473                         "Failed to allocate input buffer in mempool");
3474         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3475                         "Failed to allocate output buffer in mempool");
3476
3477         /* Clear mbuf payload */
3478         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3479                rte_pktmbuf_tailroom(ut_params->ibuf));
3480
3481         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3482         /* Append data which is padded to a multiple of */
3483         /* the algorithms block size */
3484         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3485         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3486                                 plaintext_pad_len);
3487         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3488         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3489
3490         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3491
3492         /* Create SNOW 3G operation */
3493         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3494                                         tdata->cipher_iv.len,
3495                                         tdata->validCipherLenInBits.len,
3496                                         0);
3497         if (retval < 0)
3498                 return retval;
3499
3500         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3501                                                 ut_params->op);
3502         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3503
3504         ut_params->obuf = ut_params->op->sym->m_dst;
3505         if (ut_params->obuf)
3506                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3507         else
3508                 ciphertext = plaintext;
3509
3510         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3511
3512         /* Validate obuf */
3513         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3514                 ciphertext,
3515                 tdata->ciphertext.data,
3516                 tdata->validDataLenInBits.len,
3517                 "SNOW 3G Ciphertext data not as expected");
3518         return 0;
3519 }
3520
3521 static int
3522 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
3523 {
3524         struct crypto_testsuite_params *ts_params = &testsuite_params;
3525         struct crypto_unittest_params *ut_params = &unittest_params;
3526
3527         int retval;
3528         unsigned int plaintext_pad_len;
3529         unsigned int plaintext_len;
3530         uint8_t buffer[10000];
3531         const uint8_t *ciphertext;
3532
3533         struct rte_cryptodev_info dev_info;
3534
3535         /* Verify the capabilities */
3536         struct rte_cryptodev_sym_capability_idx cap_idx;
3537         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3538         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3539         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3540                         &cap_idx) == NULL)
3541                 return -ENOTSUP;
3542
3543         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3544
3545         uint64_t feat_flags = dev_info.feature_flags;
3546
3547         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3548                 printf("Device doesn't support out-of-place scatter-gather "
3549                                 "in both input and output mbufs. "
3550                                 "Test Skipped.\n");
3551                 return -ENOTSUP;
3552         }
3553
3554         /* Create SNOW 3G session */
3555         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3556                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3557                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3558                                         tdata->key.data, tdata->key.len,
3559                                         tdata->cipher_iv.len);
3560         if (retval < 0)
3561                 return retval;
3562
3563         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3564         /* Append data which is padded to a multiple of */
3565         /* the algorithms block size */
3566         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3567
3568         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3569                         plaintext_pad_len, 10, 0);
3570         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3571                         plaintext_pad_len, 3, 0);
3572
3573         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3574                         "Failed to allocate input buffer in mempool");
3575         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3576                         "Failed to allocate output buffer in mempool");
3577
3578         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3579
3580         /* Create SNOW 3G operation */
3581         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3582                                         tdata->cipher_iv.len,
3583                                         tdata->validCipherLenInBits.len,
3584                                         0);
3585         if (retval < 0)
3586                 return retval;
3587
3588         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3589                                                 ut_params->op);
3590         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3591
3592         ut_params->obuf = ut_params->op->sym->m_dst;
3593         if (ut_params->obuf)
3594                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3595                                 plaintext_len, buffer);
3596         else
3597                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
3598                                 plaintext_len, buffer);
3599
3600         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3601
3602         /* Validate obuf */
3603         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3604                 ciphertext,
3605                 tdata->ciphertext.data,
3606                 tdata->validDataLenInBits.len,
3607                 "SNOW 3G Ciphertext data not as expected");
3608
3609         return 0;
3610 }
3611
3612 /* Shift right a buffer by "offset" bits, "offset" < 8 */
3613 static void
3614 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
3615 {
3616         uint8_t curr_byte, prev_byte;
3617         uint32_t length_in_bytes = ceil_byte_length(length + offset);
3618         uint8_t lower_byte_mask = (1 << offset) - 1;
3619         unsigned i;
3620
3621         prev_byte = buffer[0];
3622         buffer[0] >>= offset;
3623
3624         for (i = 1; i < length_in_bytes; i++) {
3625                 curr_byte = buffer[i];
3626                 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
3627                                 (curr_byte >> offset);
3628                 prev_byte = curr_byte;
3629         }
3630 }
3631
3632 static int
3633 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
3634 {
3635         struct crypto_testsuite_params *ts_params = &testsuite_params;
3636         struct crypto_unittest_params *ut_params = &unittest_params;
3637         uint8_t *plaintext, *ciphertext;
3638         int retval;
3639         uint32_t plaintext_len;
3640         uint32_t plaintext_pad_len;
3641         uint8_t extra_offset = 4;
3642         uint8_t *expected_ciphertext_shifted;
3643
3644         /* QAT PMD supports byte-aligned data only */
3645         if (gbl_driver_id == rte_cryptodev_driver_id_get(
3646                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)))
3647                 return -ENOTSUP;
3648
3649         /* Verify the capabilities */
3650         struct rte_cryptodev_sym_capability_idx cap_idx;
3651         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3652         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3653         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3654                         &cap_idx) == NULL)
3655                 return -ENOTSUP;
3656
3657         /* Create SNOW 3G session */
3658         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3659                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3660                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3661                                         tdata->key.data, tdata->key.len,
3662                                         tdata->cipher_iv.len);
3663         if (retval < 0)
3664                 return retval;
3665
3666         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3667         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3668
3669         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3670                         "Failed to allocate input buffer in mempool");
3671         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3672                         "Failed to allocate output buffer in mempool");
3673
3674         /* Clear mbuf payload */
3675         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3676                rte_pktmbuf_tailroom(ut_params->ibuf));
3677
3678         plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
3679         /*
3680          * Append data which is padded to a
3681          * multiple of the algorithms block size
3682          */
3683         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3684
3685         plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
3686                                                 plaintext_pad_len);
3687
3688         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3689
3690         memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
3691         buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
3692
3693 #ifdef RTE_APP_TEST_DEBUG
3694         rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
3695 #endif
3696         /* Create SNOW 3G operation */
3697         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3698                                         tdata->cipher_iv.len,
3699                                         tdata->validCipherLenInBits.len,
3700                                         extra_offset);
3701         if (retval < 0)
3702                 return retval;
3703
3704         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3705                                                 ut_params->op);
3706         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3707
3708         ut_params->obuf = ut_params->op->sym->m_dst;
3709         if (ut_params->obuf)
3710                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3711         else
3712                 ciphertext = plaintext;
3713
3714 #ifdef RTE_APP_TEST_DEBUG
3715         rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3716 #endif
3717
3718         expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
3719
3720         TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
3721                         "failed to reserve memory for ciphertext shifted\n");
3722
3723         memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
3724                         ceil_byte_length(tdata->ciphertext.len));
3725         buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
3726                         extra_offset);
3727         /* Validate obuf */
3728         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
3729                 ciphertext,
3730                 expected_ciphertext_shifted,
3731                 tdata->validDataLenInBits.len,
3732                 extra_offset,
3733                 "SNOW 3G Ciphertext data not as expected");
3734         return 0;
3735 }
3736
3737 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
3738 {
3739         struct crypto_testsuite_params *ts_params = &testsuite_params;
3740         struct crypto_unittest_params *ut_params = &unittest_params;
3741
3742         int retval;
3743
3744         uint8_t *plaintext, *ciphertext;
3745         unsigned ciphertext_pad_len;
3746         unsigned ciphertext_len;
3747
3748         /* Verify the capabilities */
3749         struct rte_cryptodev_sym_capability_idx cap_idx;
3750         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3751         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3752         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3753                         &cap_idx) == NULL)
3754                 return -ENOTSUP;
3755
3756         /* Create SNOW 3G session */
3757         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3758                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3759                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3760                                         tdata->key.data, tdata->key.len,
3761                                         tdata->cipher_iv.len);
3762         if (retval < 0)
3763                 return retval;
3764
3765         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3766
3767         /* Clear mbuf payload */
3768         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3769                rte_pktmbuf_tailroom(ut_params->ibuf));
3770
3771         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3772         /* Append data which is padded to a multiple of */
3773         /* the algorithms block size */
3774         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
3775         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3776                                 ciphertext_pad_len);
3777         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3778
3779         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3780
3781         /* Create SNOW 3G operation */
3782         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3783                                         tdata->cipher_iv.len,
3784                                         tdata->validCipherLenInBits.len,
3785                                         tdata->cipher.offset_bits);
3786         if (retval < 0)
3787                 return retval;
3788
3789         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3790                                                 ut_params->op);
3791         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3792         ut_params->obuf = ut_params->op->sym->m_dst;
3793         if (ut_params->obuf)
3794                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3795         else
3796                 plaintext = ciphertext;
3797
3798         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3799
3800         /* Validate obuf */
3801         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
3802                                 tdata->plaintext.data,
3803                                 tdata->validDataLenInBits.len,
3804                                 "SNOW 3G Plaintext data not as expected");
3805         return 0;
3806 }
3807
3808 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
3809 {
3810         struct crypto_testsuite_params *ts_params = &testsuite_params;
3811         struct crypto_unittest_params *ut_params = &unittest_params;
3812
3813         int retval;
3814
3815         uint8_t *plaintext, *ciphertext;
3816         unsigned ciphertext_pad_len;
3817         unsigned ciphertext_len;
3818
3819         /* Verify the capabilities */
3820         struct rte_cryptodev_sym_capability_idx cap_idx;
3821         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3822         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3823         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3824                         &cap_idx) == NULL)
3825                 return -ENOTSUP;
3826
3827         /* Create SNOW 3G session */
3828         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3829                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3830                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3831                                         tdata->key.data, tdata->key.len,
3832                                         tdata->cipher_iv.len);
3833         if (retval < 0)
3834                 return retval;
3835
3836         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3837         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3838
3839         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3840                         "Failed to allocate input buffer");
3841         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3842                         "Failed to allocate output buffer");
3843
3844         /* Clear mbuf payload */
3845         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3846                rte_pktmbuf_tailroom(ut_params->ibuf));
3847
3848         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
3849                        rte_pktmbuf_tailroom(ut_params->obuf));
3850
3851         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3852         /* Append data which is padded to a multiple of */
3853         /* the algorithms block size */
3854         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
3855         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3856                                 ciphertext_pad_len);
3857         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3858         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3859
3860         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3861
3862         /* Create SNOW 3G operation */
3863         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3864                                         tdata->cipher_iv.len,
3865                                         tdata->validCipherLenInBits.len,
3866                                         0);
3867         if (retval < 0)
3868                 return retval;
3869
3870         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3871                                                 ut_params->op);
3872         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3873         ut_params->obuf = ut_params->op->sym->m_dst;
3874         if (ut_params->obuf)
3875                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3876         else
3877                 plaintext = ciphertext;
3878
3879         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3880
3881         /* Validate obuf */
3882         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
3883                                 tdata->plaintext.data,
3884                                 tdata->validDataLenInBits.len,
3885                                 "SNOW 3G Plaintext data not as expected");
3886         return 0;
3887 }
3888
3889 static int
3890 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
3891 {
3892         struct crypto_testsuite_params *ts_params = &testsuite_params;
3893         struct crypto_unittest_params *ut_params = &unittest_params;
3894
3895         int retval;
3896
3897         uint8_t *plaintext, *ciphertext;
3898         unsigned int plaintext_pad_len;
3899         unsigned int plaintext_len;
3900
3901         struct rte_cryptodev_sym_capability_idx cap_idx;
3902
3903         /* Check if device supports ZUC EEA3 */
3904         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3905         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
3906
3907         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3908                         &cap_idx) == NULL)
3909                 return -ENOTSUP;
3910
3911         /* Check if device supports ZUC EIA3 */
3912         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3913         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
3914
3915         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3916                         &cap_idx) == NULL)
3917                 return -ENOTSUP;
3918
3919         /* Create ZUC session */
3920         retval = create_zuc_cipher_auth_encrypt_generate_session(
3921                         ts_params->valid_devs[0],
3922                         tdata);
3923         if (retval < 0)
3924                 return retval;
3925         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3926
3927         /* clear mbuf payload */
3928         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3929                         rte_pktmbuf_tailroom(ut_params->ibuf));
3930
3931         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3932         /* Append data which is padded to a multiple of */
3933         /* the algorithms block size */
3934         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3935         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3936                                 plaintext_pad_len);
3937         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3938
3939         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3940
3941         /* Create ZUC operation */
3942         retval = create_zuc_cipher_hash_generate_operation(tdata);
3943         if (retval < 0)
3944                 return retval;
3945
3946         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3947                         ut_params->op);
3948         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3949         ut_params->obuf = ut_params->op->sym->m_src;
3950         if (ut_params->obuf)
3951                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3952         else
3953                 ciphertext = plaintext;
3954
3955         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3956         /* Validate obuf */
3957         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3958                         ciphertext,
3959                         tdata->ciphertext.data,
3960                         tdata->validDataLenInBits.len,
3961                         "ZUC Ciphertext data not as expected");
3962
3963         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3964             + plaintext_pad_len;
3965
3966         /* Validate obuf */
3967         TEST_ASSERT_BUFFERS_ARE_EQUAL(
3968                         ut_params->digest,
3969                         tdata->digest.data,
3970                         4,
3971                         "ZUC Generated auth tag not as expected");
3972         return 0;
3973 }
3974
3975 static int
3976 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
3977 {
3978         struct crypto_testsuite_params *ts_params = &testsuite_params;
3979         struct crypto_unittest_params *ut_params = &unittest_params;
3980
3981         int retval;
3982
3983         uint8_t *plaintext, *ciphertext;
3984         unsigned plaintext_pad_len;
3985         unsigned plaintext_len;
3986
3987         /* Verify the capabilities */
3988         struct rte_cryptodev_sym_capability_idx cap_idx;
3989         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3990         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3991         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3992                         &cap_idx) == NULL)
3993                 return -ENOTSUP;
3994         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3995         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3996         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3997                         &cap_idx) == NULL)
3998                 return -ENOTSUP;
3999
4000         /* Create SNOW 3G session */
4001         retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4002                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4003                         RTE_CRYPTO_AUTH_OP_GENERATE,
4004                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4005                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4006                         tdata->key.data, tdata->key.len,
4007                         tdata->auth_iv.len, tdata->digest.len,
4008                         tdata->cipher_iv.len);
4009         if (retval < 0)
4010                 return retval;
4011         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4012
4013         /* clear mbuf payload */
4014         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4015                         rte_pktmbuf_tailroom(ut_params->ibuf));
4016
4017         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4018         /* Append data which is padded to a multiple of */
4019         /* the algorithms block size */
4020         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4021         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4022                                 plaintext_pad_len);
4023         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4024
4025         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4026
4027         /* Create SNOW 3G operation */
4028         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4029                         tdata->digest.len, tdata->auth_iv.data,
4030                         tdata->auth_iv.len,
4031                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4032                         tdata->cipher_iv.data, tdata->cipher_iv.len,
4033                         tdata->validCipherLenInBits.len,
4034                         0,
4035                         tdata->validAuthLenInBits.len,
4036                         0
4037                         );
4038         if (retval < 0)
4039                 return retval;
4040
4041         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4042                         ut_params->op);
4043         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4044         ut_params->obuf = ut_params->op->sym->m_src;
4045         if (ut_params->obuf)
4046                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4047         else
4048                 ciphertext = plaintext;
4049
4050         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4051         /* Validate obuf */
4052         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4053                         ciphertext,
4054                         tdata->ciphertext.data,
4055                         tdata->validDataLenInBits.len,
4056                         "SNOW 3G Ciphertext data not as expected");
4057
4058         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4059             + plaintext_pad_len;
4060
4061         /* Validate obuf */
4062         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4063                         ut_params->digest,
4064                         tdata->digest.data,
4065                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4066                         "SNOW 3G Generated auth tag not as expected");
4067         return 0;
4068 }
4069
4070 static int
4071 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4072         uint8_t op_mode, uint8_t verify)
4073 {
4074         struct crypto_testsuite_params *ts_params = &testsuite_params;
4075         struct crypto_unittest_params *ut_params = &unittest_params;
4076
4077         int retval;
4078
4079         uint8_t *plaintext = NULL, *ciphertext = NULL;
4080         unsigned int plaintext_pad_len;
4081         unsigned int plaintext_len;
4082         unsigned int ciphertext_pad_len;
4083         unsigned int ciphertext_len;
4084
4085         struct rte_cryptodev_info dev_info;
4086
4087         /* Verify the capabilities */
4088         struct rte_cryptodev_sym_capability_idx cap_idx;
4089         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4090         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4091         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4092                         &cap_idx) == NULL)
4093                 return -ENOTSUP;
4094         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4095         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4096         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4097                         &cap_idx) == NULL)
4098                 return -ENOTSUP;
4099
4100         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4101
4102         uint64_t feat_flags = dev_info.feature_flags;
4103
4104         if (op_mode == OUT_OF_PLACE) {
4105                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4106                         printf("Device doesn't support digest encrypted.\n");
4107                         return -ENOTSUP;
4108                 }
4109         }
4110
4111         /* Create SNOW 3G session */
4112         retval = create_wireless_algo_auth_cipher_session(
4113                         ts_params->valid_devs[0],
4114                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4115                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4116                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4117                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4118                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4119                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4120                         tdata->key.data, tdata->key.len,
4121                         tdata->auth_iv.len, tdata->digest.len,
4122                         tdata->cipher_iv.len);
4123
4124         if (retval < 0)
4125                 return retval;
4126
4127         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4128         if (op_mode == OUT_OF_PLACE)
4129                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4130
4131         /* clear mbuf payload */
4132         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4133                 rte_pktmbuf_tailroom(ut_params->ibuf));
4134         if (op_mode == OUT_OF_PLACE)
4135                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4136                         rte_pktmbuf_tailroom(ut_params->obuf));
4137
4138         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4139         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4140         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4141         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4142
4143         if (verify) {
4144                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4145                                         ciphertext_pad_len);
4146                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4147                 if (op_mode == OUT_OF_PLACE)
4148                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4149                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4150                         ciphertext_len);
4151         } else {
4152                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4153                                         plaintext_pad_len);
4154                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4155                 if (op_mode == OUT_OF_PLACE)
4156                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4157                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4158         }
4159
4160         /* Create SNOW 3G operation */
4161         retval = create_wireless_algo_auth_cipher_operation(
4162                 tdata->digest.data, tdata->digest.len,
4163                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4164                 tdata->auth_iv.data, tdata->auth_iv.len,
4165                 (tdata->digest.offset_bytes == 0 ?
4166                 (verify ? ciphertext_pad_len : plaintext_pad_len)
4167                         : tdata->digest.offset_bytes),
4168                 tdata->validCipherLenInBits.len,
4169                 tdata->cipher.offset_bits,
4170                 tdata->validAuthLenInBits.len,
4171                 tdata->auth.offset_bits,
4172                 op_mode, 0, verify);
4173
4174         if (retval < 0)
4175                 return retval;
4176
4177         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4178                         ut_params->op);
4179
4180         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4181
4182         ut_params->obuf = (op_mode == IN_PLACE ?
4183                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4184
4185         if (verify) {
4186                 if (ut_params->obuf)
4187                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
4188                                                         uint8_t *);
4189                 else
4190                         plaintext = ciphertext +
4191                                 (tdata->cipher.offset_bits >> 3);
4192
4193                 debug_hexdump(stdout, "plaintext:", plaintext,
4194                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4195                 debug_hexdump(stdout, "plaintext expected:",
4196                         tdata->plaintext.data,
4197                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4198         } else {
4199                 if (ut_params->obuf)
4200                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
4201                                                         uint8_t *);
4202                 else
4203                         ciphertext = plaintext;
4204
4205                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4206                         ciphertext_len);
4207                 debug_hexdump(stdout, "ciphertext expected:",
4208                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4209
4210                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4211                         + (tdata->digest.offset_bytes == 0 ?
4212                 plaintext_pad_len : tdata->digest.offset_bytes);
4213
4214                 debug_hexdump(stdout, "digest:", ut_params->digest,
4215                         tdata->digest.len);
4216                 debug_hexdump(stdout, "digest expected:", tdata->digest.data,
4217                                 tdata->digest.len);
4218         }
4219
4220         /* Validate obuf */
4221         if (verify) {
4222                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4223                         plaintext,
4224                         tdata->plaintext.data,
4225                         tdata->plaintext.len >> 3,
4226                         "SNOW 3G Plaintext data not as expected");
4227         } else {
4228                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4229                         ciphertext,
4230                         tdata->ciphertext.data,
4231                         tdata->validDataLenInBits.len,
4232                         "SNOW 3G Ciphertext data not as expected");
4233
4234                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4235                         ut_params->digest,
4236                         tdata->digest.data,
4237                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4238                         "SNOW 3G Generated auth tag not as expected");
4239         }
4240         return 0;
4241 }
4242
4243 static int
4244 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
4245         uint8_t op_mode, uint8_t verify)
4246 {
4247         struct crypto_testsuite_params *ts_params = &testsuite_params;
4248         struct crypto_unittest_params *ut_params = &unittest_params;
4249
4250         int retval;
4251
4252         const uint8_t *plaintext = NULL;
4253         const uint8_t *ciphertext = NULL;
4254         const uint8_t *digest = NULL;
4255         unsigned int plaintext_pad_len;
4256         unsigned int plaintext_len;
4257         unsigned int ciphertext_pad_len;
4258         unsigned int ciphertext_len;
4259         uint8_t buffer[10000];
4260         uint8_t digest_buffer[10000];
4261
4262         struct rte_cryptodev_info dev_info;
4263
4264         /* Verify the capabilities */
4265         struct rte_cryptodev_sym_capability_idx cap_idx;
4266         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4267         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4268         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4269                         &cap_idx) == NULL)
4270                 return -ENOTSUP;
4271         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4272         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4273         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4274                         &cap_idx) == NULL)
4275                 return -ENOTSUP;
4276
4277         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4278
4279         uint64_t feat_flags = dev_info.feature_flags;
4280
4281         if (op_mode == IN_PLACE) {
4282                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
4283                         printf("Device doesn't support in-place scatter-gather "
4284                                         "in both input and output mbufs.\n");
4285                         return -ENOTSUP;
4286                 }
4287         } else {
4288                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4289                         printf("Device doesn't support out-of-place scatter-gather "
4290                                         "in both input and output mbufs.\n");
4291                         return -ENOTSUP;
4292                 }
4293                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4294                         printf("Device doesn't support digest encrypted.\n");
4295                         return -ENOTSUP;
4296                 }
4297         }
4298
4299         /* Create SNOW 3G session */
4300         retval = create_wireless_algo_auth_cipher_session(
4301                         ts_params->valid_devs[0],
4302                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4303                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4304                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4305                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4306                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4307                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4308                         tdata->key.data, tdata->key.len,
4309                         tdata->auth_iv.len, tdata->digest.len,
4310                         tdata->cipher_iv.len);
4311
4312         if (retval < 0)
4313                 return retval;
4314
4315         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4316         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4317         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4318         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4319
4320         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4321                         plaintext_pad_len, 15, 0);
4322         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4323                         "Failed to allocate input buffer in mempool");
4324
4325         if (op_mode == OUT_OF_PLACE) {
4326                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4327                                 plaintext_pad_len, 15, 0);
4328                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4329                                 "Failed to allocate output buffer in mempool");
4330         }
4331
4332         if (verify) {
4333                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
4334                         tdata->ciphertext.data);
4335                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4336                                         ciphertext_len, buffer);
4337                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4338                         ciphertext_len);
4339         } else {
4340                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
4341                         tdata->plaintext.data);
4342                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4343                                         plaintext_len, buffer);
4344                 debug_hexdump(stdout, "plaintext:", plaintext,
4345                         plaintext_len);
4346         }
4347         memset(buffer, 0, sizeof(buffer));
4348
4349         /* Create SNOW 3G operation */
4350         retval = create_wireless_algo_auth_cipher_operation(
4351                 tdata->digest.data, tdata->digest.len,
4352                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4353                 tdata->auth_iv.data, tdata->auth_iv.len,
4354                 (tdata->digest.offset_bytes == 0 ?
4355                 (verify ? ciphertext_pad_len : plaintext_pad_len)
4356                         : tdata->digest.offset_bytes),
4357                 tdata->validCipherLenInBits.len,
4358                 tdata->cipher.offset_bits,
4359                 tdata->validAuthLenInBits.len,
4360                 tdata->auth.offset_bits,
4361                 op_mode, 1, verify);
4362
4363         if (retval < 0)
4364                 return retval;
4365
4366         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4367                         ut_params->op);
4368
4369         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4370
4371         ut_params->obuf = (op_mode == IN_PLACE ?
4372                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4373
4374         if (verify) {
4375                 if (ut_params->obuf)
4376                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
4377                                         plaintext_len, buffer);
4378                 else
4379                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4380                                         plaintext_len, buffer);
4381
4382                 debug_hexdump(stdout, "plaintext:", plaintext,
4383                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4384                 debug_hexdump(stdout, "plaintext expected:",
4385                         tdata->plaintext.data,
4386                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4387         } else {
4388                 if (ut_params->obuf)
4389                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4390                                         ciphertext_len, buffer);
4391                 else
4392                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4393                                         ciphertext_len, buffer);
4394
4395                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4396                         ciphertext_len);
4397                 debug_hexdump(stdout, "ciphertext expected:",
4398                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4399
4400                 if (ut_params->obuf)
4401                         digest = rte_pktmbuf_read(ut_params->obuf,
4402                                 (tdata->digest.offset_bytes == 0 ?
4403                                 plaintext_pad_len : tdata->digest.offset_bytes),
4404                                 tdata->digest.len, digest_buffer);
4405                 else
4406                         digest = rte_pktmbuf_read(ut_params->ibuf,
4407                                 (tdata->digest.offset_bytes == 0 ?
4408                                 plaintext_pad_len : tdata->digest.offset_bytes),
4409                                 tdata->digest.len, digest_buffer);
4410
4411                 debug_hexdump(stdout, "digest:", digest,
4412                         tdata->digest.len);
4413                 debug_hexdump(stdout, "digest expected:",
4414                         tdata->digest.data, tdata->digest.len);
4415         }
4416
4417         /* Validate obuf */
4418         if (verify) {
4419                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4420                         plaintext,
4421                         tdata->plaintext.data,
4422                         tdata->plaintext.len >> 3,
4423                         "SNOW 3G Plaintext data not as expected");
4424         } else {
4425                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4426                         ciphertext,
4427                         tdata->ciphertext.data,
4428                         tdata->validDataLenInBits.len,
4429                         "SNOW 3G Ciphertext data not as expected");
4430
4431                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4432                         digest,
4433                         tdata->digest.data,
4434                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4435                         "SNOW 3G Generated auth tag not as expected");
4436         }
4437         return 0;
4438 }
4439
4440 static int
4441 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
4442         uint8_t op_mode, uint8_t verify)
4443 {
4444         struct crypto_testsuite_params *ts_params = &testsuite_params;
4445         struct crypto_unittest_params *ut_params = &unittest_params;
4446
4447         int retval;
4448
4449         uint8_t *plaintext = NULL, *ciphertext = NULL;
4450         unsigned int plaintext_pad_len;
4451         unsigned int plaintext_len;
4452         unsigned int ciphertext_pad_len;
4453         unsigned int ciphertext_len;
4454
4455         struct rte_cryptodev_info dev_info;
4456
4457         /* Verify the capabilities */
4458         struct rte_cryptodev_sym_capability_idx cap_idx;
4459         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4460         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
4461         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4462                         &cap_idx) == NULL)
4463                 return -ENOTSUP;
4464         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4465         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4466         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4467                         &cap_idx) == NULL)
4468                 return -ENOTSUP;
4469
4470         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4471
4472         uint64_t feat_flags = dev_info.feature_flags;
4473
4474         if (op_mode == OUT_OF_PLACE) {
4475                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4476                         printf("Device doesn't support digest encrypted.\n");
4477                         return -ENOTSUP;
4478                 }
4479         }
4480
4481         /* Create KASUMI session */
4482         retval = create_wireless_algo_auth_cipher_session(
4483                         ts_params->valid_devs[0],
4484                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4485                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4486                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4487                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4488                         RTE_CRYPTO_AUTH_KASUMI_F9,
4489                         RTE_CRYPTO_CIPHER_KASUMI_F8,
4490                         tdata->key.data, tdata->key.len,
4491                         0, tdata->digest.len,
4492                         tdata->cipher_iv.len);
4493
4494         if (retval < 0)
4495                 return retval;
4496
4497         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4498         if (op_mode == OUT_OF_PLACE)
4499                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4500
4501         /* clear mbuf payload */
4502         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4503                 rte_pktmbuf_tailroom(ut_params->ibuf));
4504         if (op_mode == OUT_OF_PLACE)
4505                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4506                         rte_pktmbuf_tailroom(ut_params->obuf));
4507
4508         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4509         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4510         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4511         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4512
4513         if (verify) {
4514                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4515                                         ciphertext_pad_len);
4516                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4517                 if (op_mode == OUT_OF_PLACE)
4518                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4519                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4520                         ciphertext_len);
4521         } else {
4522                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4523                                         plaintext_pad_len);
4524                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4525                 if (op_mode == OUT_OF_PLACE)
4526                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4527                 debug_hexdump(stdout, "plaintext:", plaintext,
4528                         plaintext_len);
4529         }
4530
4531         /* Create KASUMI operation */
4532         retval = create_wireless_algo_auth_cipher_operation(
4533                 tdata->digest.data, tdata->digest.len,
4534                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4535                 NULL, 0,
4536                 (tdata->digest.offset_bytes == 0 ?
4537                 (verify ? ciphertext_pad_len : plaintext_pad_len)
4538                         : tdata->digest.offset_bytes),
4539                 tdata->validCipherLenInBits.len,
4540                 tdata->validCipherOffsetInBits.len,
4541                 tdata->validAuthLenInBits.len,
4542                 0,
4543                 op_mode, 0, verify);
4544
4545         if (retval < 0)
4546                 return retval;
4547
4548         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4549                         ut_params->op);
4550
4551         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4552
4553         ut_params->obuf = (op_mode == IN_PLACE ?
4554                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4555
4556
4557         if (verify) {
4558                 if (ut_params->obuf)
4559                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
4560                                                         uint8_t *);
4561                 else
4562                         plaintext = ciphertext;
4563
4564                 debug_hexdump(stdout, "plaintext:", plaintext,
4565                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4566                 debug_hexdump(stdout, "plaintext expected:",
4567                         tdata->plaintext.data,
4568                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4569         } else {
4570                 if (ut_params->obuf)
4571                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
4572                                                         uint8_t *);
4573                 else
4574                         ciphertext = plaintext;
4575
4576                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4577                         ciphertext_len);
4578                 debug_hexdump(stdout, "ciphertext expected:",
4579                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4580
4581                 ut_params->digest = rte_pktmbuf_mtod(
4582                         ut_params->obuf, uint8_t *) +
4583                         (tdata->digest.offset_bytes == 0 ?
4584                         plaintext_pad_len : tdata->digest.offset_bytes);
4585
4586                 debug_hexdump(stdout, "digest:", ut_params->digest,
4587                         tdata->digest.len);
4588                 debug_hexdump(stdout, "digest expected:",
4589                         tdata->digest.data, tdata->digest.len);
4590         }
4591
4592         /* Validate obuf */
4593         if (verify) {
4594                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4595                         plaintext,
4596                         tdata->plaintext.data,
4597                         tdata->plaintext.len >> 3,
4598                         "KASUMI Plaintext data not as expected");
4599         } else {
4600                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4601                         ciphertext,
4602                         tdata->ciphertext.data,
4603                         tdata->ciphertext.len >> 3,
4604                         "KASUMI Ciphertext data not as expected");
4605
4606                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4607                         ut_params->digest,
4608                         tdata->digest.data,
4609                         DIGEST_BYTE_LENGTH_KASUMI_F9,
4610                         "KASUMI Generated auth tag not as expected");
4611         }
4612         return 0;
4613 }
4614
4615 static int
4616 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
4617         uint8_t op_mode, uint8_t verify)
4618 {
4619         struct crypto_testsuite_params *ts_params = &testsuite_params;
4620         struct crypto_unittest_params *ut_params = &unittest_params;
4621
4622         int retval;
4623
4624         const uint8_t *plaintext = NULL;
4625         const uint8_t *ciphertext = NULL;
4626         const uint8_t *digest = NULL;
4627         unsigned int plaintext_pad_len;
4628         unsigned int plaintext_len;
4629         unsigned int ciphertext_pad_len;
4630         unsigned int ciphertext_len;
4631         uint8_t buffer[10000];
4632         uint8_t digest_buffer[10000];
4633
4634         struct rte_cryptodev_info dev_info;
4635
4636         /* Verify the capabilities */
4637         struct rte_cryptodev_sym_capability_idx cap_idx;
4638         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4639         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
4640         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4641                         &cap_idx) == NULL)
4642                 return -ENOTSUP;
4643         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4644         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4645         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4646                         &cap_idx) == NULL)
4647                 return -ENOTSUP;
4648
4649         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4650
4651         uint64_t feat_flags = dev_info.feature_flags;
4652
4653         if (op_mode == IN_PLACE) {
4654                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
4655                         printf("Device doesn't support in-place scatter-gather "
4656                                         "in both input and output mbufs.\n");
4657                         return -ENOTSUP;
4658                 }
4659         } else {
4660                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4661                         printf("Device doesn't support out-of-place scatter-gather "
4662                                         "in both input and output mbufs.\n");
4663                         return -ENOTSUP;
4664                 }
4665                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4666                         printf("Device doesn't support digest encrypted.\n");
4667                         return -ENOTSUP;
4668                 }
4669         }
4670
4671         /* Create KASUMI session */
4672         retval = create_wireless_algo_auth_cipher_session(
4673                         ts_params->valid_devs[0],
4674                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4675                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4676                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4677                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4678                         RTE_CRYPTO_AUTH_KASUMI_F9,
4679                         RTE_CRYPTO_CIPHER_KASUMI_F8,
4680                         tdata->key.data, tdata->key.len,
4681                         0, tdata->digest.len,
4682                         tdata->cipher_iv.len);
4683
4684         if (retval < 0)
4685                 return retval;
4686
4687         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4688         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4689         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4690         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4691
4692         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4693                         plaintext_pad_len, 15, 0);
4694         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4695                         "Failed to allocate input buffer in mempool");
4696
4697         if (op_mode == OUT_OF_PLACE) {
4698                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4699                                 plaintext_pad_len, 15, 0);
4700                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4701                                 "Failed to allocate output buffer in mempool");
4702         }
4703
4704         if (verify) {
4705                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
4706                         tdata->ciphertext.data);
4707                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4708                                         ciphertext_len, buffer);
4709                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4710                         ciphertext_len);
4711         } else {
4712                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
4713                         tdata->plaintext.data);
4714                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4715                                         plaintext_len, buffer);
4716                 debug_hexdump(stdout, "plaintext:", plaintext,
4717                         plaintext_len);
4718         }
4719         memset(buffer, 0, sizeof(buffer));
4720
4721         /* Create KASUMI operation */
4722         retval = create_wireless_algo_auth_cipher_operation(
4723                 tdata->digest.data, tdata->digest.len,
4724                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4725                 NULL, 0,
4726                 (tdata->digest.offset_bytes == 0 ?
4727                 (verify ? ciphertext_pad_len : plaintext_pad_len)
4728                         : tdata->digest.offset_bytes),
4729                 tdata->validCipherLenInBits.len,
4730                 tdata->validCipherOffsetInBits.len,
4731                 tdata->validAuthLenInBits.len,
4732                 0,
4733                 op_mode, 1, verify);
4734
4735         if (retval < 0)
4736                 return retval;
4737
4738         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4739                         ut_params->op);
4740
4741         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4742
4743         ut_params->obuf = (op_mode == IN_PLACE ?
4744                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4745
4746         if (verify) {
4747                 if (ut_params->obuf)
4748                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
4749                                         plaintext_len, buffer);
4750                 else
4751                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4752                                         plaintext_len, buffer);
4753
4754                 debug_hexdump(stdout, "plaintext:", plaintext,
4755                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4756                 debug_hexdump(stdout, "plaintext expected:",
4757                         tdata->plaintext.data,
4758                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4759         } else {
4760                 if (ut_params->obuf)
4761                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4762                                         ciphertext_len, buffer);
4763                 else
4764                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4765                                         ciphertext_len, buffer);
4766
4767                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4768                         ciphertext_len);
4769                 debug_hexdump(stdout, "ciphertext expected:",
4770                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4771
4772                 if (ut_params->obuf)
4773                         digest = rte_pktmbuf_read(ut_params->obuf,
4774                                 (tdata->digest.offset_bytes == 0 ?
4775                                 plaintext_pad_len : tdata->digest.offset_bytes),
4776                                 tdata->digest.len, digest_buffer);
4777                 else
4778                         digest = rte_pktmbuf_read(ut_params->ibuf,
4779                                 (tdata->digest.offset_bytes == 0 ?
4780                                 plaintext_pad_len : tdata->digest.offset_bytes),
4781                                 tdata->digest.len, digest_buffer);
4782
4783                 debug_hexdump(stdout, "digest:", digest,
4784                         tdata->digest.len);
4785                 debug_hexdump(stdout, "digest expected:",
4786                         tdata->digest.data, tdata->digest.len);
4787         }
4788
4789         /* Validate obuf */
4790         if (verify) {
4791                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4792                         plaintext,
4793                         tdata->plaintext.data,
4794                         tdata->plaintext.len >> 3,
4795                         "KASUMI Plaintext data not as expected");
4796         } else {
4797                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4798                         ciphertext,
4799                         tdata->ciphertext.data,
4800                         tdata->validDataLenInBits.len,
4801                         "KASUMI Ciphertext data not as expected");
4802
4803                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4804                         digest,
4805                         tdata->digest.data,
4806                         DIGEST_BYTE_LENGTH_KASUMI_F9,
4807                         "KASUMI Generated auth tag not as expected");
4808         }
4809         return 0;
4810 }
4811
4812 static int
4813 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
4814 {
4815         struct crypto_testsuite_params *ts_params = &testsuite_params;
4816         struct crypto_unittest_params *ut_params = &unittest_params;
4817
4818         int retval;
4819
4820         uint8_t *plaintext, *ciphertext;
4821         unsigned plaintext_pad_len;
4822         unsigned plaintext_len;
4823
4824         /* Verify the capabilities */
4825         struct rte_cryptodev_sym_capability_idx cap_idx;
4826         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4827         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
4828         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4829                         &cap_idx) == NULL)
4830                 return -ENOTSUP;
4831         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4832         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4833         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4834                         &cap_idx) == NULL)
4835                 return -ENOTSUP;
4836
4837         /* Create KASUMI session */
4838         retval = create_wireless_algo_cipher_auth_session(
4839                         ts_params->valid_devs[0],
4840                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4841                         RTE_CRYPTO_AUTH_OP_GENERATE,
4842                         RTE_CRYPTO_AUTH_KASUMI_F9,
4843                         RTE_CRYPTO_CIPHER_KASUMI_F8,
4844                         tdata->key.data, tdata->key.len,
4845                         0, tdata->digest.len,
4846                         tdata->cipher_iv.len);
4847         if (retval < 0)
4848                 return retval;
4849
4850         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4851
4852         /* clear mbuf payload */
4853         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4854                         rte_pktmbuf_tailroom(ut_params->ibuf));
4855
4856         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4857         /* Append data which is padded to a multiple of */
4858         /* the algorithms block size */
4859         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4860         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4861                                 plaintext_pad_len);
4862         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4863
4864         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4865
4866         /* Create KASUMI operation */
4867         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4868                                 tdata->digest.len, NULL, 0,
4869                                 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4870                                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4871                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4872                                 tdata->validCipherOffsetInBits.len,
4873                                 tdata->validAuthLenInBits.len,
4874                                 0
4875                                 );
4876         if (retval < 0)
4877                 return retval;
4878
4879         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4880                         ut_params->op);
4881         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4882
4883         if (ut_params->op->sym->m_dst)
4884                 ut_params->obuf = ut_params->op->sym->m_dst;
4885         else
4886                 ut_params->obuf = ut_params->op->sym->m_src;
4887
4888         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
4889                                 tdata->validCipherOffsetInBits.len >> 3);
4890
4891         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4892                         + plaintext_pad_len;
4893
4894         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
4895                                 (tdata->validCipherOffsetInBits.len >> 3);
4896         /* Validate obuf */
4897         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4898                 ciphertext,
4899                 reference_ciphertext,
4900                 tdata->validCipherLenInBits.len,
4901                 "KASUMI Ciphertext data not as expected");
4902
4903         /* Validate obuf */
4904         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4905                 ut_params->digest,
4906                 tdata->digest.data,
4907                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4908                 "KASUMI Generated auth tag not as expected");
4909         return 0;
4910 }
4911
4912 static int
4913 test_zuc_encryption(const struct wireless_test_data *tdata)
4914 {
4915         struct crypto_testsuite_params *ts_params = &testsuite_params;
4916         struct crypto_unittest_params *ut_params = &unittest_params;
4917
4918         int retval;
4919         uint8_t *plaintext, *ciphertext;
4920         unsigned plaintext_pad_len;
4921         unsigned plaintext_len;
4922
4923         struct rte_cryptodev_sym_capability_idx cap_idx;
4924
4925         /* Check if device supports ZUC EEA3 */
4926         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4927         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4928
4929         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4930                         &cap_idx) == NULL)
4931                 return -ENOTSUP;
4932
4933         /* Create ZUC session */
4934         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4935                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4936                                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
4937                                         tdata->key.data, tdata->key.len,
4938                                         tdata->cipher_iv.len);
4939         if (retval < 0)
4940                 return retval;
4941
4942         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4943
4944         /* Clear mbuf payload */
4945         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4946                rte_pktmbuf_tailroom(ut_params->ibuf));
4947
4948         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4949         /* Append data which is padded to a multiple */
4950         /* of the algorithms block size */
4951         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
4952         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4953                                 plaintext_pad_len);
4954         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4955
4956         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4957
4958         /* Create ZUC operation */
4959         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4960                                         tdata->cipher_iv.len,
4961                                         tdata->plaintext.len,
4962                                         0);
4963         if (retval < 0)
4964                 return retval;
4965
4966         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4967                                                 ut_params->op);
4968         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4969
4970         ut_params->obuf = ut_params->op->sym->m_dst;
4971         if (ut_params->obuf)
4972                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4973         else
4974                 ciphertext = plaintext;
4975
4976         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4977
4978         /* Validate obuf */
4979         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4980                 ciphertext,
4981                 tdata->ciphertext.data,
4982                 tdata->validCipherLenInBits.len,
4983                 "ZUC Ciphertext data not as expected");
4984         return 0;
4985 }
4986
4987 static int
4988 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
4989 {
4990         struct crypto_testsuite_params *ts_params = &testsuite_params;
4991         struct crypto_unittest_params *ut_params = &unittest_params;
4992
4993         int retval;
4994
4995         unsigned int plaintext_pad_len;
4996         unsigned int plaintext_len;
4997         const uint8_t *ciphertext;
4998         uint8_t ciphertext_buffer[2048];
4999         struct rte_cryptodev_info dev_info;
5000
5001         struct rte_cryptodev_sym_capability_idx cap_idx;
5002
5003         /* Check if device supports ZUC EEA3 */
5004         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5005         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5006
5007         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5008                         &cap_idx) == NULL)
5009                 return -ENOTSUP;
5010
5011         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5012
5013         uint64_t feat_flags = dev_info.feature_flags;
5014
5015         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5016                 printf("Device doesn't support in-place scatter-gather. "
5017                                 "Test Skipped.\n");
5018                 return -ENOTSUP;
5019         }
5020
5021         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5022
5023         /* Append data which is padded to a multiple */
5024         /* of the algorithms block size */
5025         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5026
5027         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5028                         plaintext_pad_len, 10, 0);
5029
5030         pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5031                         tdata->plaintext.data);
5032
5033         /* Create ZUC session */
5034         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5035                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5036                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5037                         tdata->key.data, tdata->key.len,
5038                         tdata->cipher_iv.len);
5039         if (retval < 0)
5040                 return retval;
5041
5042         /* Clear mbuf payload */
5043
5044         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
5045
5046         /* Create ZUC operation */
5047         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5048                         tdata->cipher_iv.len, tdata->plaintext.len,
5049                         0);
5050         if (retval < 0)
5051                 return retval;
5052
5053         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5054                                                 ut_params->op);
5055         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5056
5057         ut_params->obuf = ut_params->op->sym->m_dst;
5058         if (ut_params->obuf)
5059                 ciphertext = rte_pktmbuf_read(ut_params->obuf,
5060                         0, plaintext_len, ciphertext_buffer);
5061         else
5062                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
5063                         0, plaintext_len, ciphertext_buffer);
5064
5065         /* Validate obuf */
5066         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5067
5068         /* Validate obuf */
5069         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5070                 ciphertext,
5071                 tdata->ciphertext.data,
5072                 tdata->validCipherLenInBits.len,
5073                 "ZUC Ciphertext data not as expected");
5074
5075         return 0;
5076 }
5077
5078 static int
5079 test_zuc_authentication(const struct wireless_test_data *tdata)
5080 {
5081         struct crypto_testsuite_params *ts_params = &testsuite_params;
5082         struct crypto_unittest_params *ut_params = &unittest_params;
5083
5084         int retval;
5085         unsigned plaintext_pad_len;
5086         unsigned plaintext_len;
5087         uint8_t *plaintext;
5088
5089         struct rte_cryptodev_sym_capability_idx cap_idx;
5090
5091         /* QAT PMD supports byte-aligned data only */
5092         if ((tdata->validAuthLenInBits.len % 8 != 0) &&
5093                         (gbl_driver_id == rte_cryptodev_driver_id_get(
5094                                 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD))))
5095                 return -ENOTSUP;
5096
5097         /* Check if device supports ZUC EIA3 */
5098         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5099         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5100
5101         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5102                         &cap_idx) == NULL)
5103                 return -ENOTSUP;
5104
5105         /* Create ZUC session */
5106         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
5107                         tdata->key.data, tdata->key.len,
5108                         tdata->auth_iv.len, tdata->digest.len,
5109                         RTE_CRYPTO_AUTH_OP_GENERATE,
5110                         RTE_CRYPTO_AUTH_ZUC_EIA3);
5111         if (retval < 0)
5112                 return retval;
5113
5114         /* alloc mbuf and set payload */
5115         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5116
5117         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5118         rte_pktmbuf_tailroom(ut_params->ibuf));
5119
5120         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5121         /* Append data which is padded to a multiple of */
5122         /* the algorithms block size */
5123         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5124         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5125                                 plaintext_pad_len);
5126         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5127
5128         /* Create ZUC operation */
5129         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
5130                         tdata->auth_iv.data, tdata->auth_iv.len,
5131                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5132                         tdata->validAuthLenInBits.len,
5133                         0);
5134         if (retval < 0)
5135                 return retval;
5136
5137         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5138                                 ut_params->op);
5139         ut_params->obuf = ut_params->op->sym->m_src;
5140         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5141         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5142                         + plaintext_pad_len;
5143
5144         /* Validate obuf */
5145         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5146         ut_params->digest,
5147         tdata->digest.data,
5148         tdata->digest.len,
5149         "ZUC Generated auth tag not as expected");
5150
5151         return 0;
5152 }
5153
5154 static int
5155 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
5156         uint8_t op_mode, uint8_t verify)
5157 {
5158         struct crypto_testsuite_params *ts_params = &testsuite_params;
5159         struct crypto_unittest_params *ut_params = &unittest_params;
5160
5161         int retval;
5162
5163         uint8_t *plaintext = NULL, *ciphertext = NULL;
5164         unsigned int plaintext_pad_len;
5165         unsigned int plaintext_len;
5166         unsigned int ciphertext_pad_len;
5167         unsigned int ciphertext_len;
5168
5169         struct rte_cryptodev_info dev_info;
5170         struct rte_cryptodev_sym_capability_idx cap_idx;
5171
5172         /* Check if device supports ZUC EIA3 */
5173         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5174         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5175
5176         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5177                         &cap_idx) == NULL)
5178                 return -ENOTSUP;
5179
5180         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5181
5182         uint64_t feat_flags = dev_info.feature_flags;
5183
5184         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5185                 printf("Device doesn't support digest encrypted.\n");
5186                 return -ENOTSUP;
5187         }
5188
5189         /* Create ZUC session */
5190         retval = create_wireless_algo_auth_cipher_session(
5191                         ts_params->valid_devs[0],
5192                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5193                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5194                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5195                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5196                         RTE_CRYPTO_AUTH_ZUC_EIA3,
5197                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5198                         tdata->key.data, tdata->key.len,
5199                         tdata->auth_iv.len, tdata->digest.len,
5200                         tdata->cipher_iv.len);
5201
5202         if (retval < 0)
5203                 return retval;
5204
5205         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5206         if (op_mode == OUT_OF_PLACE)
5207                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5208
5209         /* clear mbuf payload */
5210         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5211                 rte_pktmbuf_tailroom(ut_params->ibuf));
5212         if (op_mode == OUT_OF_PLACE)
5213                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5214                         rte_pktmbuf_tailroom(ut_params->obuf));
5215
5216         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5217         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5218         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5219         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5220
5221         if (verify) {
5222                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5223                                         ciphertext_pad_len);
5224                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5225                 if (op_mode == OUT_OF_PLACE)
5226                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5227                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5228                         ciphertext_len);
5229         } else {
5230                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5231                                         plaintext_pad_len);
5232                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5233                 if (op_mode == OUT_OF_PLACE)
5234                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5235                 debug_hexdump(stdout, "plaintext:", plaintext,
5236                         plaintext_len);
5237         }
5238
5239         /* Create ZUC operation */
5240         retval = create_wireless_algo_auth_cipher_operation(
5241                 tdata->digest.data, tdata->digest.len,
5242                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5243                 tdata->auth_iv.data, tdata->auth_iv.len,
5244                 (tdata->digest.offset_bytes == 0 ?
5245                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5246                         : tdata->digest.offset_bytes),
5247                 tdata->validCipherLenInBits.len,
5248                 tdata->validCipherOffsetInBits.len,
5249                 tdata->validAuthLenInBits.len,
5250                 0,
5251                 op_mode, 0, verify);
5252
5253         if (retval < 0)
5254                 return retval;
5255
5256         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5257                         ut_params->op);
5258
5259         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5260
5261         ut_params->obuf = (op_mode == IN_PLACE ?
5262                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5263
5264
5265         if (verify) {
5266                 if (ut_params->obuf)
5267                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5268                                                         uint8_t *);
5269                 else
5270                         plaintext = ciphertext;
5271
5272                 debug_hexdump(stdout, "plaintext:", plaintext,
5273                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5274                 debug_hexdump(stdout, "plaintext expected:",
5275                         tdata->plaintext.data,
5276                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5277         } else {
5278                 if (ut_params->obuf)
5279                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5280                                                         uint8_t *);
5281                 else
5282                         ciphertext = plaintext;
5283
5284                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5285                         ciphertext_len);
5286                 debug_hexdump(stdout, "ciphertext expected:",
5287                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5288
5289                 ut_params->digest = rte_pktmbuf_mtod(
5290                         ut_params->obuf, uint8_t *) +
5291                         (tdata->digest.offset_bytes == 0 ?
5292                         plaintext_pad_len : tdata->digest.offset_bytes);
5293
5294                 debug_hexdump(stdout, "digest:", ut_params->digest,
5295                         tdata->digest.len);
5296                 debug_hexdump(stdout, "digest expected:",
5297                         tdata->digest.data, tdata->digest.len);
5298         }
5299
5300         /* Validate obuf */
5301         if (verify) {
5302                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5303                         plaintext,
5304                         tdata->plaintext.data,
5305                         tdata->plaintext.len >> 3,
5306                         "ZUC Plaintext data not as expected");
5307         } else {
5308                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5309                         ciphertext,
5310                         tdata->ciphertext.data,
5311                         tdata->ciphertext.len >> 3,
5312                         "ZUC Ciphertext data not as expected");
5313
5314                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5315                         ut_params->digest,
5316                         tdata->digest.data,
5317                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5318                         "ZUC Generated auth tag not as expected");
5319         }
5320         return 0;
5321 }
5322
5323 static int
5324 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
5325         uint8_t op_mode, uint8_t verify)
5326 {
5327         struct crypto_testsuite_params *ts_params = &testsuite_params;
5328         struct crypto_unittest_params *ut_params = &unittest_params;
5329
5330         int retval;
5331
5332         const uint8_t *plaintext = NULL;
5333         const uint8_t *ciphertext = NULL;
5334         const uint8_t *digest = NULL;
5335         unsigned int plaintext_pad_len;
5336         unsigned int plaintext_len;
5337         unsigned int ciphertext_pad_len;
5338         unsigned int ciphertext_len;
5339         uint8_t buffer[10000];
5340         uint8_t digest_buffer[10000];
5341
5342         struct rte_cryptodev_info dev_info;
5343         struct rte_cryptodev_sym_capability_idx cap_idx;
5344
5345         /* Check if device supports ZUC EIA3 */
5346         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5347         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5348
5349         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5350                         &cap_idx) == NULL)
5351                 return -ENOTSUP;
5352
5353         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5354
5355         uint64_t feat_flags = dev_info.feature_flags;
5356
5357         if (op_mode == IN_PLACE) {
5358                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5359                         printf("Device doesn't support in-place scatter-gather "
5360                                         "in both input and output mbufs.\n");
5361                         return -ENOTSUP;
5362                 }
5363         } else {
5364                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5365                         printf("Device doesn't support out-of-place scatter-gather "
5366                                         "in both input and output mbufs.\n");
5367                         return -ENOTSUP;
5368                 }
5369                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5370                         printf("Device doesn't support digest encrypted.\n");
5371                         return -ENOTSUP;
5372                 }
5373         }
5374
5375         /* Create ZUC session */
5376         retval = create_wireless_algo_auth_cipher_session(
5377                         ts_params->valid_devs[0],
5378                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5379                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5380                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5381                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5382                         RTE_CRYPTO_AUTH_ZUC_EIA3,
5383                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5384                         tdata->key.data, tdata->key.len,
5385                         tdata->auth_iv.len, tdata->digest.len,
5386                         tdata->cipher_iv.len);
5387
5388         if (retval < 0)
5389                 return retval;
5390
5391         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5392         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5393         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5394         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5395
5396         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5397                         plaintext_pad_len, 15, 0);
5398         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5399                         "Failed to allocate input buffer in mempool");
5400
5401         if (op_mode == OUT_OF_PLACE) {
5402                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5403                                 plaintext_pad_len, 15, 0);
5404                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5405                                 "Failed to allocate output buffer in mempool");
5406         }
5407
5408         if (verify) {
5409                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5410                         tdata->ciphertext.data);
5411                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5412                                         ciphertext_len, buffer);
5413                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5414                         ciphertext_len);
5415         } else {
5416                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5417                         tdata->plaintext.data);
5418                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5419                                         plaintext_len, buffer);
5420                 debug_hexdump(stdout, "plaintext:", plaintext,
5421                         plaintext_len);
5422         }
5423         memset(buffer, 0, sizeof(buffer));
5424
5425         /* Create ZUC operation */
5426         retval = create_wireless_algo_auth_cipher_operation(
5427                 tdata->digest.data, tdata->digest.len,
5428                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5429                 NULL, 0,
5430                 (tdata->digest.offset_bytes == 0 ?
5431                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5432                         : tdata->digest.offset_bytes),
5433                 tdata->validCipherLenInBits.len,
5434                 tdata->validCipherOffsetInBits.len,
5435                 tdata->validAuthLenInBits.len,
5436                 0,
5437                 op_mode, 1, verify);
5438
5439         if (retval < 0)
5440                 return retval;
5441
5442         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5443                         ut_params->op);
5444
5445         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5446
5447         ut_params->obuf = (op_mode == IN_PLACE ?
5448                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5449
5450         if (verify) {
5451                 if (ut_params->obuf)
5452                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5453                                         plaintext_len, buffer);
5454                 else
5455                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5456                                         plaintext_len, buffer);
5457
5458                 debug_hexdump(stdout, "plaintext:", plaintext,
5459                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5460                 debug_hexdump(stdout, "plaintext expected:",
5461                         tdata->plaintext.data,
5462                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5463         } else {
5464                 if (ut_params->obuf)
5465                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5466                                         ciphertext_len, buffer);
5467                 else
5468                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5469                                         ciphertext_len, buffer);
5470
5471                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5472                         ciphertext_len);
5473                 debug_hexdump(stdout, "ciphertext expected:",
5474                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5475
5476                 if (ut_params->obuf)
5477                         digest = rte_pktmbuf_read(ut_params->obuf,
5478                                 (tdata->digest.offset_bytes == 0 ?
5479                                 plaintext_pad_len : tdata->digest.offset_bytes),
5480                                 tdata->digest.len, digest_buffer);
5481                 else
5482                         digest = rte_pktmbuf_read(ut_params->ibuf,
5483                                 (tdata->digest.offset_bytes == 0 ?
5484                                 plaintext_pad_len : tdata->digest.offset_bytes),
5485                                 tdata->digest.len, digest_buffer);
5486
5487                 debug_hexdump(stdout, "digest:", digest,
5488                         tdata->digest.len);
5489                 debug_hexdump(stdout, "digest expected:",
5490                         tdata->digest.data, tdata->digest.len);
5491         }
5492
5493         /* Validate obuf */
5494         if (verify) {
5495                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5496                         plaintext,
5497                         tdata->plaintext.data,
5498                         tdata->plaintext.len >> 3,
5499                         "ZUC Plaintext data not as expected");
5500         } else {
5501                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5502                         ciphertext,
5503                         tdata->ciphertext.data,
5504                         tdata->validDataLenInBits.len,
5505                         "ZUC Ciphertext data not as expected");
5506
5507                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5508                         digest,
5509                         tdata->digest.data,
5510                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5511                         "ZUC Generated auth tag not as expected");
5512         }
5513         return 0;
5514 }
5515
5516 static int
5517 test_kasumi_encryption_test_case_1(void)
5518 {
5519         return test_kasumi_encryption(&kasumi_test_case_1);
5520 }
5521
5522 static int
5523 test_kasumi_encryption_test_case_1_sgl(void)
5524 {
5525         return test_kasumi_encryption_sgl(&kasumi_test_case_1);
5526 }
5527
5528 static int
5529 test_kasumi_encryption_test_case_1_oop(void)
5530 {
5531         return test_kasumi_encryption_oop(&kasumi_test_case_1);
5532 }
5533
5534 static int
5535 test_kasumi_encryption_test_case_1_oop_sgl(void)
5536 {
5537         return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
5538 }
5539
5540 static int
5541 test_kasumi_encryption_test_case_2(void)
5542 {
5543         return test_kasumi_encryption(&kasumi_test_case_2);
5544 }
5545
5546 static int
5547 test_kasumi_encryption_test_case_3(void)
5548 {
5549         return test_kasumi_encryption(&kasumi_test_case_3);
5550 }
5551
5552 static int
5553 test_kasumi_encryption_test_case_4(void)
5554 {
5555         return test_kasumi_encryption(&kasumi_test_case_4);
5556 }
5557
5558 static int
5559 test_kasumi_encryption_test_case_5(void)
5560 {
5561         return test_kasumi_encryption(&kasumi_test_case_5);
5562 }
5563
5564 static int
5565 test_kasumi_decryption_test_case_1(void)
5566 {
5567         return test_kasumi_decryption(&kasumi_test_case_1);
5568 }
5569
5570 static int
5571 test_kasumi_decryption_test_case_1_oop(void)
5572 {
5573         return test_kasumi_decryption_oop(&kasumi_test_case_1);
5574 }
5575
5576 static int
5577 test_kasumi_decryption_test_case_2(void)
5578 {
5579         return test_kasumi_decryption(&kasumi_test_case_2);
5580 }
5581
5582 static int
5583 test_kasumi_decryption_test_case_3(void)
5584 {
5585         return test_kasumi_decryption(&kasumi_test_case_3);
5586 }
5587
5588 static int
5589 test_kasumi_decryption_test_case_4(void)
5590 {
5591         return test_kasumi_decryption(&kasumi_test_case_4);
5592 }
5593
5594 static int
5595 test_kasumi_decryption_test_case_5(void)
5596 {
5597         return test_kasumi_decryption(&kasumi_test_case_5);
5598 }
5599 static int
5600 test_snow3g_encryption_test_case_1(void)
5601 {
5602         return test_snow3g_encryption(&snow3g_test_case_1);
5603 }
5604
5605 static int
5606 test_snow3g_encryption_test_case_1_oop(void)
5607 {
5608         return test_snow3g_encryption_oop(&snow3g_test_case_1);
5609 }
5610
5611 static int
5612 test_snow3g_encryption_test_case_1_oop_sgl(void)
5613 {
5614         return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
5615 }
5616
5617
5618 static int
5619 test_snow3g_encryption_test_case_1_offset_oop(void)
5620 {
5621         return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
5622 }
5623
5624 static int
5625 test_snow3g_encryption_test_case_2(void)
5626 {
5627         return test_snow3g_encryption(&snow3g_test_case_2);
5628 }
5629
5630 static int
5631 test_snow3g_encryption_test_case_3(void)
5632 {
5633         return test_snow3g_encryption(&snow3g_test_case_3);
5634 }
5635
5636 static int
5637 test_snow3g_encryption_test_case_4(void)
5638 {
5639         return test_snow3g_encryption(&snow3g_test_case_4);
5640 }
5641
5642 static int
5643 test_snow3g_encryption_test_case_5(void)
5644 {
5645         return test_snow3g_encryption(&snow3g_test_case_5);
5646 }
5647
5648 static int
5649 test_snow3g_decryption_test_case_1(void)
5650 {
5651         return test_snow3g_decryption(&snow3g_test_case_1);
5652 }
5653
5654 static int
5655 test_snow3g_decryption_test_case_1_oop(void)
5656 {
5657         return test_snow3g_decryption_oop(&snow3g_test_case_1);
5658 }
5659
5660 static int
5661 test_snow3g_decryption_test_case_2(void)
5662 {
5663         return test_snow3g_decryption(&snow3g_test_case_2);
5664 }
5665
5666 static int
5667 test_snow3g_decryption_test_case_3(void)
5668 {
5669         return test_snow3g_decryption(&snow3g_test_case_3);
5670 }
5671
5672 static int
5673 test_snow3g_decryption_test_case_4(void)
5674 {
5675         return test_snow3g_decryption(&snow3g_test_case_4);
5676 }
5677
5678 static int
5679 test_snow3g_decryption_test_case_5(void)
5680 {
5681         return test_snow3g_decryption(&snow3g_test_case_5);
5682 }
5683
5684 /*
5685  * Function prepares snow3g_hash_test_data from snow3g_test_data.
5686  * Pattern digest from snow3g_test_data must be allocated as
5687  * 4 last bytes in plaintext.
5688  */
5689 static void
5690 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
5691                 struct snow3g_hash_test_data *output)
5692 {
5693         if ((pattern != NULL) && (output != NULL)) {
5694                 output->key.len = pattern->key.len;
5695
5696                 memcpy(output->key.data,
5697                 pattern->key.data, pattern->key.len);
5698
5699                 output->auth_iv.len = pattern->auth_iv.len;
5700
5701                 memcpy(output->auth_iv.data,
5702                 pattern->auth_iv.data, pattern->auth_iv.len);
5703
5704                 output->plaintext.len = pattern->plaintext.len;
5705
5706                 memcpy(output->plaintext.data,
5707                 pattern->plaintext.data, pattern->plaintext.len >> 3);
5708
5709                 output->digest.len = pattern->digest.len;
5710
5711                 memcpy(output->digest.data,
5712                 &pattern->plaintext.data[pattern->digest.offset_bytes],
5713                 pattern->digest.len);
5714
5715                 output->validAuthLenInBits.len =
5716                 pattern->validAuthLenInBits.len;
5717         }
5718 }
5719
5720 /*
5721  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
5722  */
5723 static int
5724 test_snow3g_decryption_with_digest_test_case_1(void)
5725 {
5726         struct snow3g_hash_test_data snow3g_hash_data;
5727
5728         /*
5729          * Function prepare data for hash veryfication test case.
5730          * Digest is allocated in 4 last bytes in plaintext, pattern.
5731          */
5732         snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
5733
5734         return test_snow3g_decryption(&snow3g_test_case_7) &
5735                         test_snow3g_authentication_verify(&snow3g_hash_data);
5736 }
5737
5738 static int
5739 test_snow3g_cipher_auth_test_case_1(void)
5740 {
5741         return test_snow3g_cipher_auth(&snow3g_test_case_3);
5742 }
5743
5744 static int
5745 test_snow3g_auth_cipher_test_case_1(void)
5746 {
5747         return test_snow3g_auth_cipher(
5748                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
5749 }
5750
5751 static int
5752 test_snow3g_auth_cipher_test_case_2(void)
5753 {
5754         return test_snow3g_auth_cipher(
5755                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
5756 }
5757
5758 static int
5759 test_snow3g_auth_cipher_test_case_2_oop(void)
5760 {
5761         return test_snow3g_auth_cipher(
5762                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
5763 }
5764
5765 static int
5766 test_snow3g_auth_cipher_part_digest_enc(void)
5767 {
5768         return test_snow3g_auth_cipher(
5769                 &snow3g_auth_cipher_partial_digest_encryption,
5770                         IN_PLACE, 0);
5771 }
5772
5773 static int
5774 test_snow3g_auth_cipher_part_digest_enc_oop(void)
5775 {
5776         return test_snow3g_auth_cipher(
5777                 &snow3g_auth_cipher_partial_digest_encryption,
5778                         OUT_OF_PLACE, 0);
5779 }
5780
5781 static int
5782 test_snow3g_auth_cipher_test_case_3_sgl(void)
5783 {
5784         return test_snow3g_auth_cipher_sgl(
5785                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
5786 }
5787
5788 static int
5789 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
5790 {
5791         return test_snow3g_auth_cipher_sgl(
5792                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
5793 }
5794
5795 static int
5796 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
5797 {
5798         return test_snow3g_auth_cipher_sgl(
5799                 &snow3g_auth_cipher_partial_digest_encryption,
5800                         IN_PLACE, 0);
5801 }
5802
5803 static int
5804 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
5805 {
5806         return test_snow3g_auth_cipher_sgl(
5807                 &snow3g_auth_cipher_partial_digest_encryption,
5808                         OUT_OF_PLACE, 0);
5809 }
5810
5811 static int
5812 test_snow3g_auth_cipher_verify_test_case_1(void)
5813 {
5814         return test_snow3g_auth_cipher(
5815                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
5816 }
5817
5818 static int
5819 test_snow3g_auth_cipher_verify_test_case_2(void)
5820 {
5821         return test_snow3g_auth_cipher(
5822                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
5823 }
5824
5825 static int
5826 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
5827 {
5828         return test_snow3g_auth_cipher(
5829                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
5830 }
5831
5832 static int
5833 test_snow3g_auth_cipher_verify_part_digest_enc(void)
5834 {
5835         return test_snow3g_auth_cipher(
5836                 &snow3g_auth_cipher_partial_digest_encryption,
5837                         IN_PLACE, 1);
5838 }
5839
5840 static int
5841 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
5842 {
5843         return test_snow3g_auth_cipher(
5844                 &snow3g_auth_cipher_partial_digest_encryption,
5845                         OUT_OF_PLACE, 1);
5846 }
5847
5848 static int
5849 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
5850 {
5851         return test_snow3g_auth_cipher_sgl(
5852                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
5853 }
5854
5855 static int
5856 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
5857 {
5858         return test_snow3g_auth_cipher_sgl(
5859                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
5860 }
5861
5862 static int
5863 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
5864 {
5865         return test_snow3g_auth_cipher_sgl(
5866                 &snow3g_auth_cipher_partial_digest_encryption,
5867                         IN_PLACE, 1);
5868 }
5869
5870 static int
5871 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
5872 {
5873         return test_snow3g_auth_cipher_sgl(
5874                 &snow3g_auth_cipher_partial_digest_encryption,
5875                         OUT_OF_PLACE, 1);
5876 }
5877
5878 static int
5879 test_snow3g_auth_cipher_with_digest_test_case_1(void)
5880 {
5881         return test_snow3g_auth_cipher(
5882                 &snow3g_test_case_7, IN_PLACE, 0);
5883 }
5884
5885 static int
5886 test_kasumi_auth_cipher_test_case_1(void)
5887 {
5888         return test_kasumi_auth_cipher(
5889                 &kasumi_test_case_3, IN_PLACE, 0);
5890 }
5891
5892 static int
5893 test_kasumi_auth_cipher_test_case_2(void)
5894 {
5895         return test_kasumi_auth_cipher(
5896                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
5897 }
5898
5899 static int
5900 test_kasumi_auth_cipher_test_case_2_oop(void)
5901 {
5902         return test_kasumi_auth_cipher(
5903                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
5904 }
5905
5906 static int
5907 test_kasumi_auth_cipher_test_case_2_sgl(void)
5908 {
5909         return test_kasumi_auth_cipher_sgl(
5910                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
5911 }
5912
5913 static int
5914 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
5915 {
5916         return test_kasumi_auth_cipher_sgl(
5917                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
5918 }
5919
5920 static int
5921 test_kasumi_auth_cipher_verify_test_case_1(void)
5922 {
5923         return test_kasumi_auth_cipher(
5924                 &kasumi_test_case_3, IN_PLACE, 1);
5925 }
5926
5927 static int
5928 test_kasumi_auth_cipher_verify_test_case_2(void)
5929 {
5930         return test_kasumi_auth_cipher(
5931                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
5932 }
5933
5934 static int
5935 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
5936 {
5937         return test_kasumi_auth_cipher(
5938                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
5939 }
5940
5941 static int
5942 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
5943 {
5944         return test_kasumi_auth_cipher_sgl(
5945                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
5946 }
5947
5948 static int
5949 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
5950 {
5951         return test_kasumi_auth_cipher_sgl(
5952                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
5953 }
5954
5955 static int
5956 test_kasumi_cipher_auth_test_case_1(void)
5957 {
5958         return test_kasumi_cipher_auth(&kasumi_test_case_6);
5959 }
5960
5961 static int
5962 test_zuc_encryption_test_case_1(void)
5963 {
5964         return test_zuc_encryption(&zuc_test_case_cipher_193b);
5965 }
5966
5967 static int
5968 test_zuc_encryption_test_case_2(void)
5969 {
5970         return test_zuc_encryption(&zuc_test_case_cipher_800b);
5971 }
5972
5973 static int
5974 test_zuc_encryption_test_case_3(void)
5975 {
5976         return test_zuc_encryption(&zuc_test_case_cipher_1570b);
5977 }
5978
5979 static int
5980 test_zuc_encryption_test_case_4(void)
5981 {
5982         return test_zuc_encryption(&zuc_test_case_cipher_2798b);
5983 }
5984
5985 static int
5986 test_zuc_encryption_test_case_5(void)
5987 {
5988         return test_zuc_encryption(&zuc_test_case_cipher_4019b);
5989 }
5990
5991 static int
5992 test_zuc_encryption_test_case_6_sgl(void)
5993 {
5994         return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
5995 }
5996
5997 static int
5998 test_zuc_hash_generate_test_case_1(void)
5999 {
6000         return test_zuc_authentication(&zuc_test_case_auth_1b);
6001 }
6002
6003 static int
6004 test_zuc_hash_generate_test_case_2(void)
6005 {
6006         return test_zuc_authentication(&zuc_test_case_auth_90b);
6007 }
6008
6009 static int
6010 test_zuc_hash_generate_test_case_3(void)
6011 {
6012         return test_zuc_authentication(&zuc_test_case_auth_577b);
6013 }
6014
6015 static int
6016 test_zuc_hash_generate_test_case_4(void)
6017 {
6018         return test_zuc_authentication(&zuc_test_case_auth_2079b);
6019 }
6020
6021 static int
6022 test_zuc_hash_generate_test_case_5(void)
6023 {
6024         return test_zuc_authentication(&zuc_test_auth_5670b);
6025 }
6026
6027 static int
6028 test_zuc_hash_generate_test_case_6(void)
6029 {
6030         return test_zuc_authentication(&zuc_test_case_auth_128b);
6031 }
6032
6033 static int
6034 test_zuc_hash_generate_test_case_7(void)
6035 {
6036         /* This test is not for SW ZUC PMD */
6037         if (gbl_driver_id == rte_cryptodev_driver_id_get(
6038                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD)))
6039                 return -ENOTSUP;
6040
6041         return test_zuc_authentication(&zuc_test_case_auth_2080b);
6042 }
6043
6044 static int
6045 test_zuc_hash_generate_test_case_8(void)
6046 {
6047         return test_zuc_authentication(&zuc_test_case_auth_584b);
6048 }
6049
6050 static int
6051 test_zuc_cipher_auth_test_case_1(void)
6052 {
6053         return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
6054 }
6055
6056 static int
6057 test_zuc_cipher_auth_test_case_2(void)
6058 {
6059         return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
6060 }
6061
6062 static int
6063 test_zuc_auth_cipher_test_case_1(void)
6064 {
6065         /* This test is not for SW ZUC PMD */
6066         if (gbl_driver_id == rte_cryptodev_driver_id_get(
6067                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD)))
6068                 return -ENOTSUP;
6069
6070         return test_zuc_auth_cipher(
6071                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6072 }
6073
6074 static int
6075 test_zuc_auth_cipher_test_case_1_oop(void)
6076 {
6077         return test_zuc_auth_cipher(
6078                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6079 }
6080
6081 static int
6082 test_zuc_auth_cipher_test_case_1_sgl(void)
6083 {
6084         return test_zuc_auth_cipher_sgl(
6085                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6086 }
6087
6088 static int
6089 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
6090 {
6091         return test_zuc_auth_cipher_sgl(
6092                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6093 }
6094
6095 static int
6096 test_zuc_auth_cipher_verify_test_case_1(void)
6097 {
6098         return test_zuc_auth_cipher(
6099                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6100 }
6101
6102 static int
6103 test_zuc_auth_cipher_verify_test_case_1_oop(void)
6104 {
6105         return test_zuc_auth_cipher(
6106                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6107 }
6108
6109 static int
6110 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
6111 {
6112         return test_zuc_auth_cipher_sgl(
6113                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6114 }
6115
6116 static int
6117 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
6118 {
6119         return test_zuc_auth_cipher_sgl(
6120                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6121 }
6122
6123 static int
6124 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
6125 {
6126         uint8_t dev_id = testsuite_params.valid_devs[0];
6127
6128         struct rte_cryptodev_sym_capability_idx cap_idx;
6129
6130         /* Check if device supports particular cipher algorithm */
6131         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6132         cap_idx.algo.cipher = tdata->cipher_algo;
6133         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6134                 return -ENOTSUP;
6135
6136         /* Check if device supports particular hash algorithm */
6137         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6138         cap_idx.algo.auth = tdata->auth_algo;
6139         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6140                 return -ENOTSUP;
6141
6142         return 0;
6143 }
6144
6145 static int
6146 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
6147         uint8_t op_mode, uint8_t verify)
6148 {
6149         struct crypto_testsuite_params *ts_params = &testsuite_params;
6150         struct crypto_unittest_params *ut_params = &unittest_params;
6151
6152         int retval;
6153
6154         uint8_t *plaintext = NULL, *ciphertext = NULL;
6155         unsigned int plaintext_pad_len;
6156         unsigned int plaintext_len;
6157         unsigned int ciphertext_pad_len;
6158         unsigned int ciphertext_len;
6159
6160         struct rte_cryptodev_info dev_info;
6161         struct rte_crypto_op *op;
6162
6163         /* Check if device supports particular algorithms separately */
6164         if (test_mixed_check_if_unsupported(tdata))
6165                 return -ENOTSUP;
6166
6167         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6168
6169         uint64_t feat_flags = dev_info.feature_flags;
6170
6171         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6172                 printf("Device doesn't support digest encrypted.\n");
6173                 return -ENOTSUP;
6174         }
6175
6176         /* Create the session */
6177         if (verify)
6178                 retval = create_wireless_algo_cipher_auth_session(
6179                                 ts_params->valid_devs[0],
6180                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
6181                                 RTE_CRYPTO_AUTH_OP_VERIFY,
6182                                 tdata->auth_algo,
6183                                 tdata->cipher_algo,
6184                                 tdata->auth_key.data, tdata->auth_key.len,
6185                                 tdata->auth_iv.len, tdata->digest_enc.len,
6186                                 tdata->cipher_iv.len);
6187         else
6188                 retval = create_wireless_algo_auth_cipher_session(
6189                                 ts_params->valid_devs[0],
6190                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6191                                 RTE_CRYPTO_AUTH_OP_GENERATE,
6192                                 tdata->auth_algo,
6193                                 tdata->cipher_algo,
6194                                 tdata->auth_key.data, tdata->auth_key.len,
6195                                 tdata->auth_iv.len, tdata->digest_enc.len,
6196                                 tdata->cipher_iv.len);
6197         if (retval < 0)
6198                 return retval;
6199
6200         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6201         if (op_mode == OUT_OF_PLACE)
6202                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6203
6204         /* clear mbuf payload */
6205         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6206                 rte_pktmbuf_tailroom(ut_params->ibuf));
6207         if (op_mode == OUT_OF_PLACE)
6208                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6209                                 rte_pktmbuf_tailroom(ut_params->obuf));
6210
6211         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
6212         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
6213         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6214         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6215
6216         if (verify) {
6217                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6218                                 ciphertext_pad_len);
6219                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6220                 if (op_mode == OUT_OF_PLACE)
6221                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6222                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6223                                 ciphertext_len);
6224         } else {
6225                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6226                                 plaintext_pad_len);
6227                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6228                 if (op_mode == OUT_OF_PLACE)
6229                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6230                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6231         }
6232
6233         /* Create the operation */
6234         retval = create_wireless_algo_auth_cipher_operation(
6235                         tdata->digest_enc.data, tdata->digest_enc.len,
6236                         tdata->cipher_iv.data, tdata->cipher_iv.len,
6237                         tdata->auth_iv.data, tdata->auth_iv.len,
6238                         (tdata->digest_enc.offset == 0 ?
6239                                 plaintext_pad_len
6240                                 : tdata->digest_enc.offset),
6241                         tdata->validCipherLen.len_bits,
6242                         tdata->cipher.offset_bits,
6243                         tdata->validAuthLen.len_bits,
6244                         tdata->auth.offset_bits,
6245                         op_mode, 0, verify);
6246
6247         if (retval < 0)
6248                 return retval;
6249
6250         op = process_crypto_request(ts_params->valid_devs[0],
6251                         ut_params->op);
6252
6253         /* Check if the op failed because the device doesn't */
6254         /* support this particular combination of algorithms */
6255         if (op == NULL && ut_params->op->status ==
6256                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
6257                 printf("Device doesn't support this mixed combination. "
6258                                 "Test Skipped.\n");
6259                 return -ENOTSUP;
6260         }
6261         ut_params->op = op;
6262
6263         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6264
6265         ut_params->obuf = (op_mode == IN_PLACE ?
6266                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6267
6268         if (verify) {
6269                 if (ut_params->obuf)
6270                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6271                                                         uint8_t *);
6272                 else
6273                         plaintext = ciphertext +
6274                                         (tdata->cipher.offset_bits >> 3);
6275
6276                 debug_hexdump(stdout, "plaintext:", plaintext,
6277                                 tdata->plaintext.len_bits >> 3);
6278                 debug_hexdump(stdout, "plaintext expected:",
6279                                 tdata->plaintext.data,
6280                                 tdata->plaintext.len_bits >> 3);
6281         } else {
6282                 if (ut_params->obuf)
6283                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6284                                         uint8_t *);
6285                 else
6286                         ciphertext = plaintext;
6287
6288                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6289                                 ciphertext_len);
6290                 debug_hexdump(stdout, "ciphertext expected:",
6291                                 tdata->ciphertext.data,
6292                                 tdata->ciphertext.len_bits >> 3);
6293
6294                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6295                                 + (tdata->digest_enc.offset == 0 ?
6296                 plaintext_pad_len : tdata->digest_enc.offset);
6297
6298                 debug_hexdump(stdout, "digest:", ut_params->digest,
6299                                 tdata->digest_enc.len);
6300                 debug_hexdump(stdout, "digest expected:",
6301                                 tdata->digest_enc.data,
6302                                 tdata->digest_enc.len);
6303         }
6304
6305         /* Validate obuf */
6306         if (verify) {
6307                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6308                                 plaintext,
6309                                 tdata->plaintext.data,
6310                                 tdata->plaintext.len_bits >> 3,
6311                                 "Plaintext data not as expected");
6312         } else {
6313                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6314                                 ciphertext,
6315                                 tdata->ciphertext.data,
6316                                 tdata->validDataLen.len_bits,
6317                                 "Ciphertext data not as expected");
6318
6319                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6320                                 ut_params->digest,
6321                                 tdata->digest_enc.data,
6322                                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
6323                                 "Generated auth tag not as expected");
6324         }
6325
6326         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6327                         "crypto op processing failed");
6328
6329         return 0;
6330 }
6331
6332 static int
6333 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
6334         uint8_t op_mode, uint8_t verify)
6335 {
6336         struct crypto_testsuite_params *ts_params = &testsuite_params;
6337         struct crypto_unittest_params *ut_params = &unittest_params;
6338
6339         int retval;
6340
6341         const uint8_t *plaintext = NULL;
6342         const uint8_t *ciphertext = NULL;
6343         const uint8_t *digest = NULL;
6344         unsigned int plaintext_pad_len;
6345         unsigned int plaintext_len;
6346         unsigned int ciphertext_pad_len;
6347         unsigned int ciphertext_len;
6348         uint8_t buffer[10000];
6349         uint8_t digest_buffer[10000];
6350
6351         struct rte_cryptodev_info dev_info;
6352         struct rte_crypto_op *op;
6353
6354         /* Check if device supports particular algorithms */
6355         if (test_mixed_check_if_unsupported(tdata))
6356                 return -ENOTSUP;
6357
6358         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6359
6360         uint64_t feat_flags = dev_info.feature_flags;
6361
6362         if (op_mode == IN_PLACE) {
6363                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6364                         printf("Device doesn't support in-place scatter-gather "
6365                                         "in both input and output mbufs.\n");
6366                         return -ENOTSUP;
6367                 }
6368         } else {
6369                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6370                         printf("Device doesn't support out-of-place scatter-gather "
6371                                         "in both input and output mbufs.\n");
6372                         return -ENOTSUP;
6373                 }
6374                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6375                         printf("Device doesn't support digest encrypted.\n");
6376                         return -ENOTSUP;
6377                 }
6378         }
6379
6380         /* Create the session */
6381         if (verify)
6382                 retval = create_wireless_algo_cipher_auth_session(
6383                                 ts_params->valid_devs[0],
6384                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
6385                                 RTE_CRYPTO_AUTH_OP_VERIFY,
6386                                 tdata->auth_algo,
6387                                 tdata->cipher_algo,
6388                                 tdata->auth_key.data, tdata->auth_key.len,
6389                                 tdata->auth_iv.len, tdata->digest_enc.len,
6390                                 tdata->cipher_iv.len);
6391         else
6392                 retval = create_wireless_algo_auth_cipher_session(
6393                                 ts_params->valid_devs[0],
6394                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6395                                 RTE_CRYPTO_AUTH_OP_GENERATE,
6396                                 tdata->auth_algo,
6397                                 tdata->cipher_algo,
6398                                 tdata->auth_key.data, tdata->auth_key.len,
6399                                 tdata->auth_iv.len, tdata->digest_enc.len,
6400                                 tdata->cipher_iv.len);
6401         if (retval < 0)
6402                 return retval;
6403
6404         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
6405         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
6406         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6407         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6408
6409         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6410                         ciphertext_pad_len, 15, 0);
6411         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6412                         "Failed to allocate input buffer in mempool");
6413
6414         if (op_mode == OUT_OF_PLACE) {
6415                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6416                                 plaintext_pad_len, 15, 0);
6417                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
6418                                 "Failed to allocate output buffer in mempool");
6419         }
6420
6421         if (verify) {
6422                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6423                         tdata->ciphertext.data);
6424                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6425                                         ciphertext_len, buffer);
6426                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6427                         ciphertext_len);
6428         } else {
6429                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6430                         tdata->plaintext.data);
6431                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6432                                         plaintext_len, buffer);
6433                 debug_hexdump(stdout, "plaintext:", plaintext,
6434                         plaintext_len);
6435         }
6436         memset(buffer, 0, sizeof(buffer));
6437
6438         /* Create the operation */
6439         retval = create_wireless_algo_auth_cipher_operation(
6440                         tdata->digest_enc.data, tdata->digest_enc.len,
6441                         tdata->cipher_iv.data, tdata->cipher_iv.len,
6442                         tdata->auth_iv.data, tdata->auth_iv.len,
6443                         (tdata->digest_enc.offset == 0 ?
6444                                 plaintext_pad_len
6445                                 : tdata->digest_enc.offset),
6446                         tdata->validCipherLen.len_bits,
6447                         tdata->cipher.offset_bits,
6448                         tdata->validAuthLen.len_bits,
6449                         tdata->auth.offset_bits,
6450                         op_mode, 1, verify);
6451
6452         if (retval < 0)
6453                 return retval;
6454
6455         op = process_crypto_request(ts_params->valid_devs[0],
6456                         ut_params->op);
6457
6458         /* Check if the op failed because the device doesn't */
6459         /* support this particular combination of algorithms */
6460         if (op == NULL && ut_params->op->status ==
6461                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
6462                 printf("Device doesn't support this mixed combination. "
6463                                 "Test Skipped.\n");
6464                 return -ENOTSUP;
6465         }
6466
6467         ut_params->op = op;
6468
6469         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6470
6471         ut_params->obuf = (op_mode == IN_PLACE ?
6472                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6473
6474         if (verify) {
6475                 if (ut_params->obuf)
6476                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6477                                         plaintext_len, buffer);
6478                 else
6479                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6480                                         plaintext_len, buffer);
6481
6482                 debug_hexdump(stdout, "plaintext:", plaintext,
6483                                 (tdata->plaintext.len_bits >> 3) -
6484                                 tdata->digest_enc.len);
6485                 debug_hexdump(stdout, "plaintext expected:",
6486                                 tdata->plaintext.data,
6487                                 (tdata->plaintext.len_bits >> 3) -
6488                                 tdata->digest_enc.len);
6489         } else {
6490                 if (ut_params->obuf)
6491                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6492                                         ciphertext_len, buffer);
6493                 else
6494                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6495                                         ciphertext_len, buffer);
6496
6497                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6498                         ciphertext_len);
6499                 debug_hexdump(stdout, "ciphertext expected:",
6500                         tdata->ciphertext.data,
6501                         tdata->ciphertext.len_bits >> 3);
6502
6503                 if (ut_params->obuf)
6504                         digest = rte_pktmbuf_read(ut_params->obuf,
6505                                         (tdata->digest_enc.offset == 0 ?
6506                                                 plaintext_pad_len :
6507                                                 tdata->digest_enc.offset),
6508                                         tdata->digest_enc.len, digest_buffer);
6509                 else
6510                         digest = rte_pktmbuf_read(ut_params->ibuf,
6511                                         (tdata->digest_enc.offset == 0 ?
6512                                                 plaintext_pad_len :
6513                                                 tdata->digest_enc.offset),
6514                                         tdata->digest_enc.len, digest_buffer);
6515
6516                 debug_hexdump(stdout, "digest:", digest,
6517                                 tdata->digest_enc.len);
6518                 debug_hexdump(stdout, "digest expected:",
6519                                 tdata->digest_enc.data, tdata->digest_enc.len);
6520         }
6521
6522         /* Validate obuf */
6523         if (verify) {
6524                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6525                                 plaintext,
6526                                 tdata->plaintext.data,
6527                                 tdata->plaintext.len_bits >> 3,
6528                                 "Plaintext data not as expected");
6529         } else {
6530                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6531                                 ciphertext,
6532                                 tdata->ciphertext.data,
6533                                 tdata->validDataLen.len_bits,
6534                                 "Ciphertext data not as expected");
6535                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6536                                 digest,
6537                                 tdata->digest_enc.data,
6538                                 tdata->digest_enc.len,
6539                                 "Generated auth tag not as expected");
6540         }
6541
6542         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6543                         "crypto op processing failed");
6544
6545         return 0;
6546 }
6547
6548 /** AUTH AES CMAC + CIPHER AES CTR */
6549
6550 static int
6551 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
6552 {
6553         return test_mixed_auth_cipher(
6554                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
6555 }
6556
6557 static int
6558 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
6559 {
6560         return test_mixed_auth_cipher(
6561                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
6562 }
6563
6564 static int
6565 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
6566 {
6567         return test_mixed_auth_cipher_sgl(
6568                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
6569 }
6570
6571 static int
6572 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
6573 {
6574         return test_mixed_auth_cipher_sgl(
6575                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
6576 }
6577
6578 static int
6579 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
6580 {
6581         return test_mixed_auth_cipher(
6582                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
6583 }
6584
6585 static int
6586 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
6587 {
6588         return test_mixed_auth_cipher(
6589                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
6590 }
6591
6592 static int
6593 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
6594 {
6595         return test_mixed_auth_cipher_sgl(
6596                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
6597 }
6598
6599 static int
6600 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
6601 {
6602         return test_mixed_auth_cipher_sgl(
6603                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
6604 }
6605
6606 /** MIXED AUTH + CIPHER */
6607
6608 static int
6609 test_auth_zuc_cipher_snow_test_case_1(void)
6610 {
6611         return test_mixed_auth_cipher(
6612                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
6613 }
6614
6615 static int
6616 test_verify_auth_zuc_cipher_snow_test_case_1(void)
6617 {
6618         return test_mixed_auth_cipher(
6619                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
6620 }
6621
6622 static int
6623 test_auth_aes_cmac_cipher_snow_test_case_1(void)
6624 {
6625         return test_mixed_auth_cipher(
6626                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
6627 }
6628
6629 static int
6630 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
6631 {
6632         return test_mixed_auth_cipher(
6633                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
6634 }
6635
6636 static int
6637 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
6638 {
6639         return test_mixed_auth_cipher(
6640                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
6641 }
6642
6643 static int
6644 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
6645 {
6646         return test_mixed_auth_cipher(
6647                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
6648 }
6649
6650 static int
6651 test_auth_snow_cipher_aes_ctr_test_case_1(void)
6652 {
6653         return test_mixed_auth_cipher(
6654                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
6655 }
6656
6657 static int
6658 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
6659 {
6660         return test_mixed_auth_cipher(
6661                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
6662 }
6663
6664 static int
6665 test_auth_snow_cipher_zuc_test_case_1(void)
6666 {
6667         return test_mixed_auth_cipher(
6668                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
6669 }
6670
6671 static int
6672 test_verify_auth_snow_cipher_zuc_test_case_1(void)
6673 {
6674         return test_mixed_auth_cipher(
6675                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
6676 }
6677
6678 static int
6679 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
6680 {
6681         return test_mixed_auth_cipher(
6682                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
6683 }
6684
6685 static int
6686 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
6687 {
6688         return test_mixed_auth_cipher(
6689                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
6690 }
6691
6692 static int
6693 test_auth_null_cipher_snow_test_case_1(void)
6694 {
6695         return test_mixed_auth_cipher(
6696                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
6697 }
6698
6699 static int
6700 test_verify_auth_null_cipher_snow_test_case_1(void)
6701 {
6702         return test_mixed_auth_cipher(
6703                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
6704 }
6705
6706 static int
6707 test_auth_null_cipher_zuc_test_case_1(void)
6708 {
6709         return test_mixed_auth_cipher(
6710                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
6711 }
6712
6713 static int
6714 test_verify_auth_null_cipher_zuc_test_case_1(void)
6715 {
6716         return test_mixed_auth_cipher(
6717                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
6718 }
6719
6720 static int
6721 test_auth_snow_cipher_null_test_case_1(void)
6722 {
6723         return test_mixed_auth_cipher(
6724                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
6725 }
6726
6727 static int
6728 test_verify_auth_snow_cipher_null_test_case_1(void)
6729 {
6730         return test_mixed_auth_cipher(
6731                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
6732 }
6733
6734 static int
6735 test_auth_zuc_cipher_null_test_case_1(void)
6736 {
6737         return test_mixed_auth_cipher(
6738                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
6739 }
6740
6741 static int
6742 test_verify_auth_zuc_cipher_null_test_case_1(void)
6743 {
6744         return test_mixed_auth_cipher(
6745                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
6746 }
6747
6748 static int
6749 test_auth_null_cipher_aes_ctr_test_case_1(void)
6750 {
6751         return test_mixed_auth_cipher(
6752                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
6753 }
6754
6755 static int
6756 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
6757 {
6758         return test_mixed_auth_cipher(
6759                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
6760 }
6761
6762 static int
6763 test_auth_aes_cmac_cipher_null_test_case_1(void)
6764 {
6765         return test_mixed_auth_cipher(
6766                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
6767 }
6768
6769 static int
6770 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
6771 {
6772         return test_mixed_auth_cipher(
6773                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
6774 }
6775
6776 /* ***** AEAD algorithm Tests ***** */
6777
6778 static int
6779 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
6780                 enum rte_crypto_aead_operation op,
6781                 const uint8_t *key, const uint8_t key_len,
6782                 const uint16_t aad_len, const uint8_t auth_len,
6783                 uint8_t iv_len)
6784 {
6785         uint8_t aead_key[key_len];
6786
6787         struct crypto_testsuite_params *ts_params = &testsuite_params;
6788         struct crypto_unittest_params *ut_params = &unittest_params;
6789
6790         memcpy(aead_key, key, key_len);
6791
6792         /* Setup AEAD Parameters */
6793         ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
6794         ut_params->aead_xform.next = NULL;
6795         ut_params->aead_xform.aead.algo = algo;
6796         ut_params->aead_xform.aead.op = op;
6797         ut_params->aead_xform.aead.key.data = aead_key;
6798         ut_params->aead_xform.aead.key.length = key_len;
6799         ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
6800         ut_params->aead_xform.aead.iv.length = iv_len;
6801         ut_params->aead_xform.aead.digest_length = auth_len;
6802         ut_params->aead_xform.aead.aad_length = aad_len;
6803
6804         debug_hexdump(stdout, "key:", key, key_len);
6805
6806         /* Create Crypto session*/
6807         ut_params->sess = rte_cryptodev_sym_session_create(
6808                         ts_params->session_mpool);
6809
6810         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
6811                         &ut_params->aead_xform,
6812                         ts_params->session_priv_mpool);
6813
6814         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6815
6816         return 0;
6817 }
6818
6819 static int
6820 create_aead_xform(struct rte_crypto_op *op,
6821                 enum rte_crypto_aead_algorithm algo,
6822                 enum rte_crypto_aead_operation aead_op,
6823                 uint8_t *key, const uint8_t key_len,
6824                 const uint8_t aad_len, const uint8_t auth_len,
6825                 uint8_t iv_len)
6826 {
6827         TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
6828                         "failed to allocate space for crypto transform");
6829
6830         struct rte_crypto_sym_op *sym_op = op->sym;
6831
6832         /* Setup AEAD Parameters */
6833         sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
6834         sym_op->xform->next = NULL;
6835         sym_op->xform->aead.algo = algo;
6836         sym_op->xform->aead.op = aead_op;
6837         sym_op->xform->aead.key.data = key;
6838         sym_op->xform->aead.key.length = key_len;
6839         sym_op->xform->aead.iv.offset = IV_OFFSET;
6840         sym_op->xform->aead.iv.length = iv_len;
6841         sym_op->xform->aead.digest_length = auth_len;
6842         sym_op->xform->aead.aad_length = aad_len;
6843
6844         debug_hexdump(stdout, "key:", key, key_len);
6845
6846         return 0;
6847 }
6848
6849 static int
6850 create_aead_operation(enum rte_crypto_aead_operation op,
6851                 const struct aead_test_data *tdata)
6852 {
6853         struct crypto_testsuite_params *ts_params = &testsuite_params;
6854         struct crypto_unittest_params *ut_params = &unittest_params;
6855
6856         uint8_t *plaintext, *ciphertext;
6857         unsigned int aad_pad_len, plaintext_pad_len;
6858
6859         /* Generate Crypto op data structure */
6860         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6861                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6862         TEST_ASSERT_NOT_NULL(ut_params->op,
6863                         "Failed to allocate symmetric crypto operation struct");
6864
6865         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6866
6867         /* Append aad data */
6868         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
6869                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
6870                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6871                                 aad_pad_len);
6872                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
6873                                 "no room to append aad");
6874
6875                 sym_op->aead.aad.phys_addr =
6876                                 rte_pktmbuf_iova(ut_params->ibuf);
6877                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
6878                 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
6879                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
6880                         tdata->aad.len);
6881
6882                 /* Append IV at the end of the crypto operation*/
6883                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
6884                                 uint8_t *, IV_OFFSET);
6885
6886                 /* Copy IV 1 byte after the IV pointer, according to the API */
6887                 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
6888                 debug_hexdump(stdout, "iv:", iv_ptr,
6889                         tdata->iv.len);
6890         } else {
6891                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
6892                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6893                                 aad_pad_len);
6894                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
6895                                 "no room to append aad");
6896
6897                 sym_op->aead.aad.phys_addr =
6898                                 rte_pktmbuf_iova(ut_params->ibuf);
6899                 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
6900                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
6901                         tdata->aad.len);
6902
6903                 /* Append IV at the end of the crypto operation*/
6904                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
6905                                 uint8_t *, IV_OFFSET);
6906
6907                 if (tdata->iv.len == 0) {
6908                         rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
6909                         debug_hexdump(stdout, "iv:", iv_ptr,
6910                                 AES_GCM_J0_LENGTH);
6911                 } else {
6912                         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
6913                         debug_hexdump(stdout, "iv:", iv_ptr,
6914                                 tdata->iv.len);
6915                 }
6916         }
6917
6918         /* Append plaintext/ciphertext */
6919         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
6920                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
6921                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6922                                 plaintext_pad_len);
6923                 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
6924
6925                 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
6926                 debug_hexdump(stdout, "plaintext:", plaintext,
6927                                 tdata->plaintext.len);
6928
6929                 if (ut_params->obuf) {
6930                         ciphertext = (uint8_t *)rte_pktmbuf_append(
6931                                         ut_params->obuf,
6932                                         plaintext_pad_len + aad_pad_len);
6933                         TEST_ASSERT_NOT_NULL(ciphertext,
6934                                         "no room to append ciphertext");
6935
6936                         memset(ciphertext + aad_pad_len, 0,
6937                                         tdata->ciphertext.len);
6938                 }
6939         } else {
6940                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
6941                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6942                                 plaintext_pad_len);
6943                 TEST_ASSERT_NOT_NULL(ciphertext,
6944                                 "no room to append ciphertext");
6945
6946                 memcpy(ciphertext, tdata->ciphertext.data,
6947                                 tdata->ciphertext.len);
6948                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6949                                 tdata->ciphertext.len);
6950
6951                 if (ut_params->obuf) {
6952                         plaintext = (uint8_t *)rte_pktmbuf_append(
6953                                         ut_params->obuf,
6954                                         plaintext_pad_len + aad_pad_len);
6955                         TEST_ASSERT_NOT_NULL(plaintext,
6956                                         "no room to append plaintext");
6957
6958                         memset(plaintext + aad_pad_len, 0,
6959                                         tdata->plaintext.len);
6960                 }
6961         }
6962
6963         /* Append digest data */
6964         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
6965                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
6966                                 ut_params->obuf ? ut_params->obuf :
6967                                                 ut_params->ibuf,
6968                                                 tdata->auth_tag.len);
6969                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
6970                                 "no room to append digest");
6971                 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
6972                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
6973                                 ut_params->obuf ? ut_params->obuf :
6974                                                 ut_params->ibuf,
6975                                                 plaintext_pad_len +
6976                                                 aad_pad_len);
6977         } else {
6978                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
6979                                 ut_params->ibuf, tdata->auth_tag.len);
6980                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
6981                                 "no room to append digest");
6982                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
6983                                 ut_params->ibuf,
6984                                 plaintext_pad_len + aad_pad_len);
6985
6986                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
6987                         tdata->auth_tag.len);
6988                 debug_hexdump(stdout, "digest:",
6989                         sym_op->aead.digest.data,
6990                         tdata->auth_tag.len);
6991         }
6992
6993         sym_op->aead.data.length = tdata->plaintext.len;
6994         sym_op->aead.data.offset = aad_pad_len;
6995
6996         return 0;
6997 }
6998
6999 static int
7000 test_authenticated_encryption(const struct aead_test_data *tdata)
7001 {
7002         struct crypto_testsuite_params *ts_params = &testsuite_params;
7003         struct crypto_unittest_params *ut_params = &unittest_params;
7004
7005         int retval;
7006         uint8_t *ciphertext, *auth_tag;
7007         uint16_t plaintext_pad_len;
7008         uint32_t i;
7009
7010         /* Verify the capabilities */
7011         struct rte_cryptodev_sym_capability_idx cap_idx;
7012         const struct rte_cryptodev_symmetric_capability *capability;
7013         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7014         cap_idx.algo.aead = tdata->algo;
7015         capability = rte_cryptodev_sym_capability_get(
7016                         ts_params->valid_devs[0], &cap_idx);
7017         if (capability == NULL)
7018                 return -ENOTSUP;
7019         if (rte_cryptodev_sym_capability_check_aead(
7020                         capability, tdata->key.len, tdata->auth_tag.len,
7021                         tdata->aad.len, tdata->iv.len))
7022                 return -ENOTSUP;
7023
7024         /* Create AEAD session */
7025         retval = create_aead_session(ts_params->valid_devs[0],
7026                         tdata->algo,
7027                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
7028                         tdata->key.data, tdata->key.len,
7029                         tdata->aad.len, tdata->auth_tag.len,
7030                         tdata->iv.len);
7031         if (retval < 0)
7032                 return retval;
7033
7034         if (tdata->aad.len > MBUF_SIZE) {
7035                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
7036                 /* Populate full size of add data */
7037                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
7038                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
7039         } else
7040                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7041
7042         /* clear mbuf payload */
7043         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7044                         rte_pktmbuf_tailroom(ut_params->ibuf));
7045
7046         /* Create AEAD operation */
7047         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
7048         if (retval < 0)
7049                 return retval;
7050
7051         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7052
7053         ut_params->op->sym->m_src = ut_params->ibuf;
7054
7055         /* Process crypto operation */
7056         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
7057                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
7058         else
7059                 TEST_ASSERT_NOT_NULL(
7060                         process_crypto_request(ts_params->valid_devs[0],
7061                         ut_params->op), "failed to process sym crypto op");
7062
7063         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7064                         "crypto op processing failed");
7065
7066         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7067
7068         if (ut_params->op->sym->m_dst) {
7069                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7070                                 uint8_t *);
7071                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
7072                                 uint8_t *, plaintext_pad_len);
7073         } else {
7074                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
7075                                 uint8_t *,
7076                                 ut_params->op->sym->cipher.data.offset);
7077                 auth_tag = ciphertext + plaintext_pad_len;
7078         }
7079
7080         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
7081         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
7082
7083         /* Validate obuf */
7084         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7085                         ciphertext,
7086                         tdata->ciphertext.data,
7087                         tdata->ciphertext.len,
7088                         "Ciphertext data not as expected");
7089
7090         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7091                         auth_tag,
7092                         tdata->auth_tag.data,
7093                         tdata->auth_tag.len,
7094                         "Generated auth tag not as expected");
7095
7096         return 0;
7097
7098 }
7099
7100 #ifdef RTE_LIBRTE_SECURITY
7101 /* Basic algorithm run function for async inplace mode.
7102  * Creates a session from input parameters and runs one operation
7103  * on input_vec. Checks the output of the crypto operation against
7104  * output_vec.
7105  */
7106 static int
7107 test_pdcp_proto(int i, int oop,
7108         enum rte_crypto_cipher_operation opc,
7109         enum rte_crypto_auth_operation opa,
7110         uint8_t *input_vec,
7111         unsigned int input_vec_len,
7112         uint8_t *output_vec,
7113         unsigned int output_vec_len)
7114 {
7115         struct crypto_testsuite_params *ts_params = &testsuite_params;
7116         struct crypto_unittest_params *ut_params = &unittest_params;
7117         uint8_t *plaintext;
7118         int ret = TEST_SUCCESS;
7119         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7120                                 rte_cryptodev_get_sec_ctx(
7121                                 ts_params->valid_devs[0]);
7122
7123         /* Verify the capabilities */
7124         struct rte_security_capability_idx sec_cap_idx;
7125
7126         sec_cap_idx.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
7127         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7128         sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
7129         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7130                 return -ENOTSUP;
7131
7132         /* Generate test mbuf data */
7133         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7134
7135         /* clear mbuf payload */
7136         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7137                         rte_pktmbuf_tailroom(ut_params->ibuf));
7138
7139         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7140                                                   input_vec_len);
7141         memcpy(plaintext, input_vec, input_vec_len);
7142
7143         /* Out of place support */
7144         if (oop) {
7145                 /*
7146                  * For out-op-place we need to alloc another mbuf
7147                  */
7148                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7149                 rte_pktmbuf_append(ut_params->obuf, output_vec_len);
7150         }
7151
7152         /* Set crypto type as IPSEC */
7153         ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
7154
7155         /* Setup Cipher Parameters */
7156         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7157         ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
7158         ut_params->cipher_xform.cipher.op = opc;
7159         ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
7160         ut_params->cipher_xform.cipher.key.length =
7161                                         pdcp_test_params[i].cipher_key_len;
7162         ut_params->cipher_xform.cipher.iv.length = 0;
7163
7164         /* Setup HMAC Parameters if ICV header is required */
7165         if (pdcp_test_params[i].auth_alg != 0) {
7166                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7167                 ut_params->auth_xform.next = NULL;
7168                 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
7169                 ut_params->auth_xform.auth.op = opa;
7170                 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
7171                 ut_params->auth_xform.auth.key.length =
7172                                         pdcp_test_params[i].auth_key_len;
7173
7174                 ut_params->cipher_xform.next = &ut_params->auth_xform;
7175         } else {
7176                 ut_params->cipher_xform.next = NULL;
7177         }
7178
7179         struct rte_security_session_conf sess_conf = {
7180                 .action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
7181                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
7182                 {.pdcp = {
7183                         .bearer = pdcp_test_bearer[i],
7184                         .domain = pdcp_test_params[i].domain,
7185                         .pkt_dir = pdcp_test_packet_direction[i],
7186                         .sn_size = pdcp_test_data_sn_size[i],
7187                         .hfn = pdcp_test_hfn[i],
7188                         .hfn_threshold = pdcp_test_hfn_threshold[i],
7189                 } },
7190                 .crypto_xform = &ut_params->cipher_xform
7191         };
7192
7193         /* Create security session */
7194         ut_params->sec_session = rte_security_session_create(ctx,
7195                                 &sess_conf, ts_params->session_priv_mpool);
7196
7197         if (!ut_params->sec_session) {
7198                 printf("TestCase %s()-%d line %d failed %s: ",
7199                         __func__, i, __LINE__, "Failed to allocate session");
7200                 ret = TEST_FAILED;
7201                 goto on_err;
7202         }
7203
7204         /* Generate crypto op data structure */
7205         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7206                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7207         if (!ut_params->op) {
7208                 printf("TestCase %s()-%d line %d failed %s: ",
7209                         __func__, i, __LINE__,
7210                         "Failed to allocate symmetric crypto operation struct");
7211                 ret = TEST_FAILED;
7212                 goto on_err;
7213         }
7214
7215         rte_security_attach_session(ut_params->op, ut_params->sec_session);
7216
7217         /* set crypto operation source mbuf */
7218         ut_params->op->sym->m_src = ut_params->ibuf;
7219         if (oop)
7220                 ut_params->op->sym->m_dst = ut_params->obuf;
7221
7222         /* Process crypto operation */
7223         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
7224                 == NULL) {
7225                 printf("TestCase %s()-%d line %d failed %s: ",
7226                         __func__, i, __LINE__,
7227                         "failed to process sym crypto op");
7228                 ret = TEST_FAILED;
7229                 goto on_err;
7230         }
7231
7232         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
7233                 printf("TestCase %s()-%d line %d failed %s: ",
7234                         __func__, i, __LINE__, "crypto op processing failed");
7235                 ret = TEST_FAILED;
7236                 goto on_err;
7237         }
7238
7239         /* Validate obuf */
7240         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
7241                         uint8_t *);
7242         if (oop) {
7243                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7244                                 uint8_t *);
7245         }
7246
7247         if (memcmp(ciphertext, output_vec, output_vec_len)) {
7248                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
7249                 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
7250                 rte_hexdump(stdout, "reference", output_vec, output_vec_len);
7251                 ret = TEST_FAILED;
7252                 goto on_err;
7253         }
7254
7255 on_err:
7256         rte_crypto_op_free(ut_params->op);
7257         ut_params->op = NULL;
7258
7259         if (ut_params->sec_session)
7260                 rte_security_session_destroy(ctx, ut_params->sec_session);
7261         ut_params->sec_session = NULL;
7262
7263         rte_pktmbuf_free(ut_params->ibuf);
7264         ut_params->ibuf = NULL;
7265         if (oop) {
7266                 rte_pktmbuf_free(ut_params->obuf);
7267                 ut_params->obuf = NULL;
7268         }
7269
7270         return ret;
7271 }
7272
7273 static int
7274 test_pdcp_proto_SGL(int i, int oop,
7275         enum rte_crypto_cipher_operation opc,
7276         enum rte_crypto_auth_operation opa,
7277         uint8_t *input_vec,
7278         unsigned int input_vec_len,
7279         uint8_t *output_vec,
7280         unsigned int output_vec_len,
7281         uint32_t fragsz,
7282         uint32_t fragsz_oop)
7283 {
7284         struct crypto_testsuite_params *ts_params = &testsuite_params;
7285         struct crypto_unittest_params *ut_params = &unittest_params;
7286         uint8_t *plaintext;
7287         struct rte_mbuf *buf, *buf_oop = NULL;
7288         int ret = TEST_SUCCESS;
7289         int to_trn = 0;
7290         int to_trn_tbl[16];
7291         int segs = 1;
7292         unsigned int trn_data = 0;
7293         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7294                                 rte_cryptodev_get_sec_ctx(
7295                                 ts_params->valid_devs[0]);
7296
7297         /* Verify the capabilities */
7298         struct rte_security_capability_idx sec_cap_idx;
7299
7300         sec_cap_idx.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
7301         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7302         sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
7303         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7304                 return -ENOTSUP;
7305
7306         if (fragsz > input_vec_len)
7307                 fragsz = input_vec_len;
7308
7309         uint16_t plaintext_len = fragsz;
7310         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
7311
7312         if (fragsz_oop > output_vec_len)
7313                 frag_size_oop = output_vec_len;
7314
7315         int ecx = 0;
7316         if (input_vec_len % fragsz != 0) {
7317                 if (input_vec_len / fragsz + 1 > 16)
7318                         return 1;
7319         } else if (input_vec_len / fragsz > 16)
7320                 return 1;
7321
7322         /* Out of place support */
7323         if (oop) {
7324                 /*
7325                  * For out-op-place we need to alloc another mbuf
7326                  */
7327                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7328                 rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
7329                 buf_oop = ut_params->obuf;
7330         }
7331
7332         /* Generate test mbuf data */
7333         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7334
7335         /* clear mbuf payload */
7336         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7337                         rte_pktmbuf_tailroom(ut_params->ibuf));
7338
7339         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7340                                                   plaintext_len);
7341         memcpy(plaintext, input_vec, plaintext_len);
7342         trn_data += plaintext_len;
7343
7344         buf = ut_params->ibuf;
7345
7346         /*
7347          * Loop until no more fragments
7348          */
7349
7350         while (trn_data < input_vec_len) {
7351                 ++segs;
7352                 to_trn = (input_vec_len - trn_data < fragsz) ?
7353                                 (input_vec_len - trn_data) : fragsz;
7354
7355                 to_trn_tbl[ecx++] = to_trn;
7356
7357                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7358                 buf = buf->next;
7359
7360                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
7361                                 rte_pktmbuf_tailroom(buf));
7362
7363                 /* OOP */
7364                 if (oop && !fragsz_oop) {
7365                         buf_oop->next =
7366                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
7367                         buf_oop = buf_oop->next;
7368                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
7369                                         0, rte_pktmbuf_tailroom(buf_oop));
7370                         rte_pktmbuf_append(buf_oop, to_trn);
7371                 }
7372
7373                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
7374                                 to_trn);
7375
7376                 memcpy(plaintext, input_vec + trn_data, to_trn);
7377                 trn_data += to_trn;
7378         }
7379
7380         ut_params->ibuf->nb_segs = segs;
7381
7382         segs = 1;
7383         if (fragsz_oop && oop) {
7384                 to_trn = 0;
7385                 ecx = 0;
7386
7387                 trn_data = frag_size_oop;
7388                 while (trn_data < output_vec_len) {
7389                         ++segs;
7390                         to_trn =
7391                                 (output_vec_len - trn_data <
7392                                                 frag_size_oop) ?
7393                                 (output_vec_len - trn_data) :
7394                                                 frag_size_oop;
7395
7396                         to_trn_tbl[ecx++] = to_trn;
7397
7398                         buf_oop->next =
7399                                 rte_pktmbuf_alloc(ts_params->mbuf_pool);
7400                         buf_oop = buf_oop->next;
7401                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
7402                                         0, rte_pktmbuf_tailroom(buf_oop));
7403                         rte_pktmbuf_append(buf_oop, to_trn);
7404
7405                         trn_data += to_trn;
7406                 }
7407                 ut_params->obuf->nb_segs = segs;
7408         }
7409
7410         ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
7411
7412         /* Setup Cipher Parameters */
7413         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7414         ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
7415         ut_params->cipher_xform.cipher.op = opc;
7416         ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
7417         ut_params->cipher_xform.cipher.key.length =
7418                                         pdcp_test_params[i].cipher_key_len;
7419         ut_params->cipher_xform.cipher.iv.length = 0;
7420
7421         /* Setup HMAC Parameters if ICV header is required */
7422         if (pdcp_test_params[i].auth_alg != 0) {
7423                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7424                 ut_params->auth_xform.next = NULL;
7425                 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
7426                 ut_params->auth_xform.auth.op = opa;
7427                 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
7428                 ut_params->auth_xform.auth.key.length =
7429                                         pdcp_test_params[i].auth_key_len;
7430
7431                 ut_params->cipher_xform.next = &ut_params->auth_xform;
7432         } else {
7433                 ut_params->cipher_xform.next = NULL;
7434         }
7435
7436         struct rte_security_session_conf sess_conf = {
7437                 .action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
7438                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
7439                 {.pdcp = {
7440                         .bearer = pdcp_test_bearer[i],
7441                         .domain = pdcp_test_params[i].domain,
7442                         .pkt_dir = pdcp_test_packet_direction[i],
7443                         .sn_size = pdcp_test_data_sn_size[i],
7444                         .hfn = pdcp_test_hfn[i],
7445                         .hfn_threshold = pdcp_test_hfn_threshold[i],
7446                 } },
7447                 .crypto_xform = &ut_params->cipher_xform
7448         };
7449
7450         /* Create security session */
7451         ut_params->sec_session = rte_security_session_create(ctx,
7452                                 &sess_conf, ts_params->session_priv_mpool);
7453
7454         if (!ut_params->sec_session) {
7455                 printf("TestCase %s()-%d line %d failed %s: ",
7456                         __func__, i, __LINE__, "Failed to allocate session");
7457                 ret = TEST_FAILED;
7458                 goto on_err;
7459         }
7460
7461         /* Generate crypto op data structure */
7462         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7463                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7464         if (!ut_params->op) {
7465                 printf("TestCase %s()-%d line %d failed %s: ",
7466                         __func__, i, __LINE__,
7467                         "Failed to allocate symmetric crypto operation struct");
7468                 ret = TEST_FAILED;
7469                 goto on_err;
7470         }
7471
7472         rte_security_attach_session(ut_params->op, ut_params->sec_session);
7473
7474         /* set crypto operation source mbuf */
7475         ut_params->op->sym->m_src = ut_params->ibuf;
7476         if (oop)
7477                 ut_params->op->sym->m_dst = ut_params->obuf;
7478
7479         /* Process crypto operation */
7480         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
7481                 == NULL) {
7482                 printf("TestCase %s()-%d line %d failed %s: ",
7483                         __func__, i, __LINE__,
7484                         "failed to process sym crypto op");
7485                 ret = TEST_FAILED;
7486                 goto on_err;
7487         }
7488
7489         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
7490                 printf("TestCase %s()-%d line %d failed %s: ",
7491                         __func__, i, __LINE__, "crypto op processing failed");
7492                 ret = TEST_FAILED;
7493                 goto on_err;
7494         }
7495
7496         /* Validate obuf */
7497         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
7498                         uint8_t *);
7499         if (oop) {
7500                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7501                                 uint8_t *);
7502         }
7503         if (fragsz_oop)
7504                 fragsz = frag_size_oop;
7505         if (memcmp(ciphertext, output_vec, fragsz)) {
7506                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
7507                 rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
7508                 rte_hexdump(stdout, "reference", output_vec, fragsz);
7509                 ret = TEST_FAILED;
7510                 goto on_err;
7511         }
7512
7513         buf = ut_params->op->sym->m_src->next;
7514         if (oop)
7515                 buf = ut_params->op->sym->m_dst->next;
7516
7517         unsigned int off = fragsz;
7518
7519         ecx = 0;
7520         while (buf) {
7521                 ciphertext = rte_pktmbuf_mtod(buf,
7522                                 uint8_t *);
7523                 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
7524                         printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
7525                         rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
7526                         rte_hexdump(stdout, "reference", output_vec + off,
7527                                         to_trn_tbl[ecx]);
7528                         ret = TEST_FAILED;
7529                         goto on_err;
7530                 }
7531                 off += to_trn_tbl[ecx++];
7532                 buf = buf->next;
7533         }
7534 on_err:
7535         rte_crypto_op_free(ut_params->op);
7536         ut_params->op = NULL;
7537
7538         if (ut_params->sec_session)
7539                 rte_security_session_destroy(ctx, ut_params->sec_session);
7540         ut_params->sec_session = NULL;
7541
7542         rte_pktmbuf_free(ut_params->ibuf);
7543         ut_params->ibuf = NULL;
7544         if (oop) {
7545                 rte_pktmbuf_free(ut_params->obuf);
7546                 ut_params->obuf = NULL;
7547         }
7548
7549         return ret;
7550 }
7551
7552 int
7553 test_pdcp_proto_cplane_encap(int i)
7554 {
7555         return test_pdcp_proto(i, 0,
7556                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7557                 RTE_CRYPTO_AUTH_OP_GENERATE,
7558                 pdcp_test_data_in[i],
7559                 pdcp_test_data_in_len[i],
7560                 pdcp_test_data_out[i],
7561                 pdcp_test_data_in_len[i]+4);
7562 }
7563
7564 int
7565 test_pdcp_proto_uplane_encap(int i)
7566 {
7567         return test_pdcp_proto(i, 0,
7568                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7569                 RTE_CRYPTO_AUTH_OP_GENERATE,
7570                 pdcp_test_data_in[i],
7571                 pdcp_test_data_in_len[i],
7572                 pdcp_test_data_out[i],
7573                 pdcp_test_data_in_len[i]);
7574
7575 }
7576
7577 int
7578 test_pdcp_proto_uplane_encap_with_int(int i)
7579 {
7580         return test_pdcp_proto(i, 0,
7581                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7582                 RTE_CRYPTO_AUTH_OP_GENERATE,
7583                 pdcp_test_data_in[i],
7584                 pdcp_test_data_in_len[i],
7585                 pdcp_test_data_out[i],
7586                 pdcp_test_data_in_len[i] + 4);
7587 }
7588
7589 int
7590 test_pdcp_proto_cplane_decap(int i)
7591 {
7592         return test_pdcp_proto(i, 0,
7593                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7594                 RTE_CRYPTO_AUTH_OP_VERIFY,
7595                 pdcp_test_data_out[i],
7596                 pdcp_test_data_in_len[i] + 4,
7597                 pdcp_test_data_in[i],
7598                 pdcp_test_data_in_len[i]);
7599 }
7600
7601 int
7602 test_pdcp_proto_uplane_decap(int i)
7603 {
7604         return test_pdcp_proto(i, 0,
7605                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7606                 RTE_CRYPTO_AUTH_OP_VERIFY,
7607                 pdcp_test_data_out[i],
7608                 pdcp_test_data_in_len[i],
7609                 pdcp_test_data_in[i],
7610                 pdcp_test_data_in_len[i]);
7611 }
7612
7613 int
7614 test_pdcp_proto_uplane_decap_with_int(int i)
7615 {
7616         return test_pdcp_proto(i, 0,
7617                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7618                 RTE_CRYPTO_AUTH_OP_VERIFY,
7619                 pdcp_test_data_out[i],
7620                 pdcp_test_data_in_len[i] + 4,
7621                 pdcp_test_data_in[i],
7622                 pdcp_test_data_in_len[i]);
7623 }
7624
7625 static int
7626 test_PDCP_PROTO_SGL_in_place_32B(void)
7627 {
7628         /* i can be used for running any PDCP case
7629          * In this case it is uplane 12-bit AES-SNOW DL encap
7630          */
7631         int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
7632         return test_pdcp_proto_SGL(i, IN_PLACE,
7633                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7634                         RTE_CRYPTO_AUTH_OP_GENERATE,
7635                         pdcp_test_data_in[i],
7636                         pdcp_test_data_in_len[i],
7637                         pdcp_test_data_out[i],
7638                         pdcp_test_data_in_len[i]+4,
7639                         32, 0);
7640 }
7641 static int
7642 test_PDCP_PROTO_SGL_oop_32B_128B(void)
7643 {
7644         /* i can be used for running any PDCP case
7645          * In this case it is uplane 18-bit NULL-NULL DL encap
7646          */
7647         int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
7648         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
7649                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7650                         RTE_CRYPTO_AUTH_OP_GENERATE,
7651                         pdcp_test_data_in[i],
7652                         pdcp_test_data_in_len[i],
7653                         pdcp_test_data_out[i],
7654                         pdcp_test_data_in_len[i]+4,
7655                         32, 128);
7656 }
7657 static int
7658 test_PDCP_PROTO_SGL_oop_32B_40B(void)
7659 {
7660         /* i can be used for running any PDCP case
7661          * In this case it is uplane 18-bit AES DL encap
7662          */
7663         int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
7664                         + DOWNLINK;
7665         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
7666                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7667                         RTE_CRYPTO_AUTH_OP_GENERATE,
7668                         pdcp_test_data_in[i],
7669                         pdcp_test_data_in_len[i],
7670                         pdcp_test_data_out[i],
7671                         pdcp_test_data_in_len[i],
7672                         32, 40);
7673 }
7674 static int
7675 test_PDCP_PROTO_SGL_oop_128B_32B(void)
7676 {
7677         /* i can be used for running any PDCP case
7678          * In this case it is cplane 12-bit AES-ZUC DL encap
7679          */
7680         int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
7681         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
7682                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7683                         RTE_CRYPTO_AUTH_OP_GENERATE,
7684                         pdcp_test_data_in[i],
7685                         pdcp_test_data_in_len[i],
7686                         pdcp_test_data_out[i],
7687                         pdcp_test_data_in_len[i]+4,
7688                         128, 32);
7689 }
7690 #endif
7691
7692 static int
7693 test_AES_GCM_authenticated_encryption_test_case_1(void)
7694 {
7695         return test_authenticated_encryption(&gcm_test_case_1);
7696 }
7697
7698 static int
7699 test_AES_GCM_authenticated_encryption_test_case_2(void)
7700 {
7701         return test_authenticated_encryption(&gcm_test_case_2);
7702 }
7703
7704 static int
7705 test_AES_GCM_authenticated_encryption_test_case_3(void)
7706 {
7707         return test_authenticated_encryption(&gcm_test_case_3);
7708 }
7709
7710 static int
7711 test_AES_GCM_authenticated_encryption_test_case_4(void)
7712 {
7713         return test_authenticated_encryption(&gcm_test_case_4);
7714 }
7715
7716 static int
7717 test_AES_GCM_authenticated_encryption_test_case_5(void)
7718 {
7719         return test_authenticated_encryption(&gcm_test_case_5);
7720 }
7721
7722 static int
7723 test_AES_GCM_authenticated_encryption_test_case_6(void)
7724 {
7725         return test_authenticated_encryption(&gcm_test_case_6);
7726 }
7727
7728 static int
7729 test_AES_GCM_authenticated_encryption_test_case_7(void)
7730 {
7731         return test_authenticated_encryption(&gcm_test_case_7);
7732 }
7733
7734 static int
7735 test_AES_GCM_authenticated_encryption_test_case_8(void)
7736 {
7737         return test_authenticated_encryption(&gcm_test_case_8);
7738 }
7739
7740 static int
7741 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
7742 {
7743         return test_authenticated_encryption(&gcm_J0_test_case_1);
7744 }
7745
7746 static int
7747 test_AES_GCM_auth_encryption_test_case_192_1(void)
7748 {
7749         return test_authenticated_encryption(&gcm_test_case_192_1);
7750 }
7751
7752 static int
7753 test_AES_GCM_auth_encryption_test_case_192_2(void)
7754 {
7755         return test_authenticated_encryption(&gcm_test_case_192_2);
7756 }
7757
7758 static int
7759 test_AES_GCM_auth_encryption_test_case_192_3(void)
7760 {
7761         return test_authenticated_encryption(&gcm_test_case_192_3);
7762 }
7763
7764 static int
7765 test_AES_GCM_auth_encryption_test_case_192_4(void)
7766 {
7767         return test_authenticated_encryption(&gcm_test_case_192_4);
7768 }
7769
7770 static int
7771 test_AES_GCM_auth_encryption_test_case_192_5(void)
7772 {
7773         return test_authenticated_encryption(&gcm_test_case_192_5);
7774 }
7775
7776 static int
7777 test_AES_GCM_auth_encryption_test_case_192_6(void)
7778 {
7779         return test_authenticated_encryption(&gcm_test_case_192_6);
7780 }
7781
7782 static int
7783 test_AES_GCM_auth_encryption_test_case_192_7(void)
7784 {
7785         return test_authenticated_encryption(&gcm_test_case_192_7);
7786 }
7787
7788 static int
7789 test_AES_GCM_auth_encryption_test_case_256_1(void)
7790 {
7791         return test_authenticated_encryption(&gcm_test_case_256_1);
7792 }
7793
7794 static int
7795 test_AES_GCM_auth_encryption_test_case_256_2(void)
7796 {
7797         return test_authenticated_encryption(&gcm_test_case_256_2);
7798 }
7799
7800 static int
7801 test_AES_GCM_auth_encryption_test_case_256_3(void)
7802 {
7803         return test_authenticated_encryption(&gcm_test_case_256_3);
7804 }
7805
7806 static int
7807 test_AES_GCM_auth_encryption_test_case_256_4(void)
7808 {
7809         return test_authenticated_encryption(&gcm_test_case_256_4);
7810 }
7811
7812 static int
7813 test_AES_GCM_auth_encryption_test_case_256_5(void)
7814 {
7815         return test_authenticated_encryption(&gcm_test_case_256_5);
7816 }
7817
7818 static int
7819 test_AES_GCM_auth_encryption_test_case_256_6(void)
7820 {
7821         return test_authenticated_encryption(&gcm_test_case_256_6);
7822 }
7823
7824 static int
7825 test_AES_GCM_auth_encryption_test_case_256_7(void)
7826 {
7827         return test_authenticated_encryption(&gcm_test_case_256_7);
7828 }
7829
7830 static int
7831 test_AES_GCM_auth_encryption_test_case_aad_1(void)
7832 {
7833         return test_authenticated_encryption(&gcm_test_case_aad_1);
7834 }
7835
7836 static int
7837 test_AES_GCM_auth_encryption_test_case_aad_2(void)
7838 {
7839         return test_authenticated_encryption(&gcm_test_case_aad_2);
7840 }
7841
7842 static int
7843 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
7844 {
7845         struct aead_test_data tdata;
7846         int res;
7847
7848         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
7849         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
7850         tdata.iv.data[0] += 1;
7851         res = test_authenticated_encryption(&tdata);
7852         if (res == -ENOTSUP)
7853                 return res;
7854         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
7855         return TEST_SUCCESS;
7856 }
7857
7858 static int
7859 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
7860 {
7861         struct aead_test_data tdata;
7862         int res;
7863
7864         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
7865         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
7866         tdata.plaintext.data[0] += 1;
7867         res = test_authenticated_encryption(&tdata);
7868         if (res == -ENOTSUP)
7869                 return res;
7870         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
7871         return TEST_SUCCESS;
7872 }
7873
7874 static int
7875 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
7876 {
7877         struct aead_test_data tdata;
7878         int res;
7879
7880         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
7881         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
7882         tdata.ciphertext.data[0] += 1;
7883         res = test_authenticated_encryption(&tdata);
7884         if (res == -ENOTSUP)
7885                 return res;
7886         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
7887         return TEST_SUCCESS;
7888 }
7889
7890 static int
7891 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
7892 {
7893         struct aead_test_data tdata;
7894         int res;
7895
7896         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
7897         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
7898         tdata.aad.len += 1;
7899         res = test_authenticated_encryption(&tdata);
7900         if (res == -ENOTSUP)
7901                 return res;
7902         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
7903         return TEST_SUCCESS;
7904 }
7905
7906 static int
7907 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
7908 {
7909         struct aead_test_data tdata;
7910         uint8_t aad[gcm_test_case_7.aad.len];
7911         int res;
7912
7913         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
7914         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
7915         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
7916         aad[0] += 1;
7917         tdata.aad.data = aad;
7918         res = test_authenticated_encryption(&tdata);
7919         if (res == -ENOTSUP)
7920                 return res;
7921         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
7922         return TEST_SUCCESS;
7923 }
7924
7925 static int
7926 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
7927 {
7928         struct aead_test_data tdata;
7929         int res;
7930
7931         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
7932         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
7933         tdata.auth_tag.data[0] += 1;
7934         res = test_authenticated_encryption(&tdata);
7935         if (res == -ENOTSUP)
7936                 return res;
7937         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
7938         return TEST_SUCCESS;
7939 }
7940
7941 static int
7942 test_authenticated_decryption(const struct aead_test_data *tdata)
7943 {
7944         struct crypto_testsuite_params *ts_params = &testsuite_params;
7945         struct crypto_unittest_params *ut_params = &unittest_params;
7946
7947         int retval;
7948         uint8_t *plaintext;
7949         uint32_t i;
7950
7951         /* Verify the capabilities */
7952         struct rte_cryptodev_sym_capability_idx cap_idx;
7953         const struct rte_cryptodev_symmetric_capability *capability;
7954         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7955         cap_idx.algo.aead = tdata->algo;
7956         capability = rte_cryptodev_sym_capability_get(
7957                         ts_params->valid_devs[0], &cap_idx);
7958         if (capability == NULL)
7959                 return -ENOTSUP;
7960         if (rte_cryptodev_sym_capability_check_aead(
7961                         capability, tdata->key.len, tdata->auth_tag.len,
7962                         tdata->aad.len, tdata->iv.len))
7963                 return -ENOTSUP;
7964
7965         /* Create AEAD session */
7966         retval = create_aead_session(ts_params->valid_devs[0],
7967                         tdata->algo,
7968                         RTE_CRYPTO_AEAD_OP_DECRYPT,
7969                         tdata->key.data, tdata->key.len,
7970                         tdata->aad.len, tdata->auth_tag.len,
7971                         tdata->iv.len);
7972         if (retval < 0)
7973                 return retval;
7974
7975         /* alloc mbuf and set payload */
7976         if (tdata->aad.len > MBUF_SIZE) {
7977                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
7978                 /* Populate full size of add data */
7979                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
7980                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
7981         } else
7982                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7983
7984         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7985                         rte_pktmbuf_tailroom(ut_params->ibuf));
7986
7987         /* Create AEAD operation */
7988         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
7989         if (retval < 0)
7990                 return retval;
7991
7992         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7993
7994         ut_params->op->sym->m_src = ut_params->ibuf;
7995
7996         /* Process crypto operation */
7997         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
7998                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
7999         else
8000                 TEST_ASSERT_NOT_NULL(
8001                         process_crypto_request(ts_params->valid_devs[0],
8002                         ut_params->op), "failed to process sym crypto op");
8003
8004         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8005                         "crypto op processing failed");
8006
8007         if (ut_params->op->sym->m_dst)
8008                 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8009                                 uint8_t *);
8010         else
8011                 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8012                                 uint8_t *,
8013                                 ut_params->op->sym->cipher.data.offset);
8014
8015         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
8016
8017         /* Validate obuf */
8018         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8019                         plaintext,
8020                         tdata->plaintext.data,
8021                         tdata->plaintext.len,
8022                         "Plaintext data not as expected");
8023
8024         TEST_ASSERT_EQUAL(ut_params->op->status,
8025                         RTE_CRYPTO_OP_STATUS_SUCCESS,
8026                         "Authentication failed");
8027
8028         return 0;
8029 }
8030
8031 static int
8032 test_AES_GCM_authenticated_decryption_test_case_1(void)
8033 {
8034         return test_authenticated_decryption(&gcm_test_case_1);
8035 }
8036
8037 static int
8038 test_AES_GCM_authenticated_decryption_test_case_2(void)
8039 {
8040         return test_authenticated_decryption(&gcm_test_case_2);
8041 }
8042
8043 static int
8044 test_AES_GCM_authenticated_decryption_test_case_3(void)
8045 {
8046         return test_authenticated_decryption(&gcm_test_case_3);
8047 }
8048
8049 static int
8050 test_AES_GCM_authenticated_decryption_test_case_4(void)
8051 {
8052         return test_authenticated_decryption(&gcm_test_case_4);
8053 }
8054
8055 static int
8056 test_AES_GCM_authenticated_decryption_test_case_5(void)
8057 {
8058         return test_authenticated_decryption(&gcm_test_case_5);
8059 }
8060
8061 static int
8062 test_AES_GCM_authenticated_decryption_test_case_6(void)
8063 {
8064         return test_authenticated_decryption(&gcm_test_case_6);
8065 }
8066
8067 static int
8068 test_AES_GCM_authenticated_decryption_test_case_7(void)
8069 {
8070         return test_authenticated_decryption(&gcm_test_case_7);
8071 }
8072
8073 static int
8074 test_AES_GCM_authenticated_decryption_test_case_8(void)
8075 {
8076         return test_authenticated_decryption(&gcm_test_case_8);
8077 }
8078
8079 static int
8080 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
8081 {
8082         return test_authenticated_decryption(&gcm_J0_test_case_1);
8083 }
8084
8085 static int
8086 test_AES_GCM_auth_decryption_test_case_192_1(void)
8087 {
8088         return test_authenticated_decryption(&gcm_test_case_192_1);
8089 }
8090
8091 static int
8092 test_AES_GCM_auth_decryption_test_case_192_2(void)
8093 {
8094         return test_authenticated_decryption(&gcm_test_case_192_2);
8095 }
8096
8097 static int
8098 test_AES_GCM_auth_decryption_test_case_192_3(void)
8099 {
8100         return test_authenticated_decryption(&gcm_test_case_192_3);
8101 }
8102
8103 static int
8104 test_AES_GCM_auth_decryption_test_case_192_4(void)
8105 {
8106         return test_authenticated_decryption(&gcm_test_case_192_4);
8107 }
8108
8109 static int
8110 test_AES_GCM_auth_decryption_test_case_192_5(void)
8111 {
8112         return test_authenticated_decryption(&gcm_test_case_192_5);
8113 }
8114
8115 static int
8116 test_AES_GCM_auth_decryption_test_case_192_6(void)
8117 {
8118         return test_authenticated_decryption(&gcm_test_case_192_6);
8119 }
8120
8121 static int
8122 test_AES_GCM_auth_decryption_test_case_192_7(void)
8123 {
8124         return test_authenticated_decryption(&gcm_test_case_192_7);
8125 }
8126
8127 static int
8128 test_AES_GCM_auth_decryption_test_case_256_1(void)
8129 {
8130         return test_authenticated_decryption(&gcm_test_case_256_1);
8131 }
8132
8133 static int
8134 test_AES_GCM_auth_decryption_test_case_256_2(void)
8135 {
8136         return test_authenticated_decryption(&gcm_test_case_256_2);
8137 }
8138
8139 static int
8140 test_AES_GCM_auth_decryption_test_case_256_3(void)
8141 {
8142         return test_authenticated_decryption(&gcm_test_case_256_3);
8143 }
8144
8145 static int
8146 test_AES_GCM_auth_decryption_test_case_256_4(void)
8147 {
8148         return test_authenticated_decryption(&gcm_test_case_256_4);
8149 }
8150
8151 static int
8152 test_AES_GCM_auth_decryption_test_case_256_5(void)
8153 {
8154         return test_authenticated_decryption(&gcm_test_case_256_5);
8155 }
8156
8157 static int
8158 test_AES_GCM_auth_decryption_test_case_256_6(void)
8159 {
8160         return test_authenticated_decryption(&gcm_test_case_256_6);
8161 }
8162
8163 static int
8164 test_AES_GCM_auth_decryption_test_case_256_7(void)
8165 {
8166         return test_authenticated_decryption(&gcm_test_case_256_7);
8167 }
8168
8169 static int
8170 test_AES_GCM_auth_decryption_test_case_aad_1(void)
8171 {
8172         return test_authenticated_decryption(&gcm_test_case_aad_1);
8173 }
8174
8175 static int
8176 test_AES_GCM_auth_decryption_test_case_aad_2(void)
8177 {
8178         return test_authenticated_decryption(&gcm_test_case_aad_2);
8179 }
8180
8181 static int
8182 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
8183 {
8184         struct aead_test_data tdata;
8185         int res;
8186
8187         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8188         tdata.iv.data[0] += 1;
8189         res = test_authenticated_decryption(&tdata);
8190         if (res == -ENOTSUP)
8191                 return res;
8192         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
8193         return TEST_SUCCESS;
8194 }
8195
8196 static int
8197 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
8198 {
8199         struct aead_test_data tdata;
8200         int res;
8201
8202         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
8203         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8204         tdata.plaintext.data[0] += 1;
8205         res = test_authenticated_decryption(&tdata);
8206         if (res == -ENOTSUP)
8207                 return res;
8208         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
8209         return TEST_SUCCESS;
8210 }
8211
8212 static int
8213 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
8214 {
8215         struct aead_test_data tdata;
8216         int res;
8217
8218         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8219         tdata.ciphertext.data[0] += 1;
8220         res = test_authenticated_decryption(&tdata);
8221         if (res == -ENOTSUP)
8222                 return res;
8223         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
8224         return TEST_SUCCESS;
8225 }
8226
8227 static int
8228 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
8229 {
8230         struct aead_test_data tdata;
8231         int res;
8232
8233         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8234         tdata.aad.len += 1;
8235         res = test_authenticated_decryption(&tdata);
8236         if (res == -ENOTSUP)
8237                 return res;
8238         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
8239         return TEST_SUCCESS;
8240 }
8241
8242 static int
8243 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
8244 {
8245         struct aead_test_data tdata;
8246         uint8_t aad[gcm_test_case_7.aad.len];
8247         int res;
8248
8249         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8250         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
8251         aad[0] += 1;
8252         tdata.aad.data = aad;
8253         res = test_authenticated_decryption(&tdata);
8254         if (res == -ENOTSUP)
8255                 return res;
8256         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
8257         return TEST_SUCCESS;
8258 }
8259
8260 static int
8261 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
8262 {
8263         struct aead_test_data tdata;
8264         int res;
8265
8266         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8267         tdata.auth_tag.data[0] += 1;
8268         res = test_authenticated_decryption(&tdata);
8269         if (res == -ENOTSUP)
8270                 return res;
8271         TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
8272         return TEST_SUCCESS;
8273 }
8274
8275 static int
8276 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
8277 {
8278         struct crypto_testsuite_params *ts_params = &testsuite_params;
8279         struct crypto_unittest_params *ut_params = &unittest_params;
8280
8281         int retval;
8282         uint8_t *ciphertext, *auth_tag;
8283         uint16_t plaintext_pad_len;
8284
8285         /* Verify the capabilities */
8286         struct rte_cryptodev_sym_capability_idx cap_idx;
8287         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8288         cap_idx.algo.aead = tdata->algo;
8289         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
8290                         &cap_idx) == NULL)
8291                 return -ENOTSUP;
8292
8293         /* not supported with CPU crypto */
8294         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8295                 return -ENOTSUP;
8296
8297         /* Create AEAD session */
8298         retval = create_aead_session(ts_params->valid_devs[0],
8299                         tdata->algo,
8300                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
8301                         tdata->key.data, tdata->key.len,
8302                         tdata->aad.len, tdata->auth_tag.len,
8303                         tdata->iv.len);
8304         if (retval < 0)
8305                 return retval;
8306
8307         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8308         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8309
8310         /* clear mbuf payload */
8311         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8312                         rte_pktmbuf_tailroom(ut_params->ibuf));
8313         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
8314                         rte_pktmbuf_tailroom(ut_params->obuf));
8315
8316         /* Create AEAD operation */
8317         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8318         if (retval < 0)
8319                 return retval;
8320
8321         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8322
8323         ut_params->op->sym->m_src = ut_params->ibuf;
8324         ut_params->op->sym->m_dst = ut_params->obuf;
8325
8326         /* Process crypto operation */
8327         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
8328                         ut_params->op), "failed to process sym crypto op");
8329
8330         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8331                         "crypto op processing failed");
8332
8333         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8334
8335         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
8336                         ut_params->op->sym->cipher.data.offset);
8337         auth_tag = ciphertext + plaintext_pad_len;
8338
8339         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8340         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8341
8342         /* Validate obuf */
8343         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8344                         ciphertext,
8345                         tdata->ciphertext.data,
8346                         tdata->ciphertext.len,
8347                         "Ciphertext data not as expected");
8348
8349         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8350                         auth_tag,
8351                         tdata->auth_tag.data,
8352                         tdata->auth_tag.len,
8353                         "Generated auth tag not as expected");
8354
8355         return 0;
8356
8357 }
8358
8359 static int
8360 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
8361 {
8362         return test_authenticated_encryption_oop(&gcm_test_case_5);
8363 }
8364
8365 static int
8366 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
8367 {
8368         struct crypto_testsuite_params *ts_params = &testsuite_params;
8369         struct crypto_unittest_params *ut_params = &unittest_params;
8370
8371         int retval;
8372         uint8_t *plaintext;
8373
8374         /* Verify the capabilities */
8375         struct rte_cryptodev_sym_capability_idx cap_idx;
8376         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8377         cap_idx.algo.aead = tdata->algo;
8378         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
8379                         &cap_idx) == NULL)
8380                 return -ENOTSUP;
8381
8382         /* not supported with CPU crypto */
8383         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8384                 return -ENOTSUP;
8385
8386         /* Create AEAD session */
8387         retval = create_aead_session(ts_params->valid_devs[0],
8388                         tdata->algo,
8389                         RTE_CRYPTO_AEAD_OP_DECRYPT,
8390                         tdata->key.data, tdata->key.len,
8391                         tdata->aad.len, tdata->auth_tag.len,
8392                         tdata->iv.len);
8393         if (retval < 0)
8394                 return retval;
8395
8396         /* alloc mbuf and set payload */
8397         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8398         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8399
8400         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8401                         rte_pktmbuf_tailroom(ut_params->ibuf));
8402         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
8403                         rte_pktmbuf_tailroom(ut_params->obuf));
8404
8405         /* Create AEAD operation */
8406         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
8407         if (retval < 0)
8408                 return retval;
8409
8410         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8411
8412         ut_params->op->sym->m_src = ut_params->ibuf;
8413         ut_params->op->sym->m_dst = ut_params->obuf;
8414
8415         /* Process crypto operation */
8416         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
8417                         ut_params->op), "failed to process sym crypto op");
8418
8419         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8420                         "crypto op processing failed");
8421
8422         plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
8423                         ut_params->op->sym->cipher.data.offset);
8424
8425         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
8426
8427         /* Validate obuf */
8428         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8429                         plaintext,
8430                         tdata->plaintext.data,
8431                         tdata->plaintext.len,
8432                         "Plaintext data not as expected");
8433
8434         TEST_ASSERT_EQUAL(ut_params->op->status,
8435                         RTE_CRYPTO_OP_STATUS_SUCCESS,
8436                         "Authentication failed");
8437         return 0;
8438 }
8439
8440 static int
8441 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
8442 {
8443         return test_authenticated_decryption_oop(&gcm_test_case_5);
8444 }
8445
8446 static int
8447 test_authenticated_encryption_sessionless(
8448                 const struct aead_test_data *tdata)
8449 {
8450         struct crypto_testsuite_params *ts_params = &testsuite_params;
8451         struct crypto_unittest_params *ut_params = &unittest_params;
8452
8453         int retval;
8454         uint8_t *ciphertext, *auth_tag;
8455         uint16_t plaintext_pad_len;
8456         uint8_t key[tdata->key.len + 1];
8457
8458         /* This test is for AESNI MB and AESNI GCM PMDs only */
8459         if ((gbl_driver_id != rte_cryptodev_driver_id_get(
8460                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) &&
8461                         (gbl_driver_id != rte_cryptodev_driver_id_get(
8462                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))))
8463                 return -ENOTSUP;
8464
8465         /* not supported with CPU crypto */
8466         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8467                 return -ENOTSUP;
8468
8469         /* Verify the capabilities */
8470         struct rte_cryptodev_sym_capability_idx cap_idx;
8471         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8472         cap_idx.algo.aead = tdata->algo;
8473         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
8474                         &cap_idx) == NULL)
8475                 return -ENOTSUP;
8476
8477         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8478
8479         /* clear mbuf payload */
8480         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8481                         rte_pktmbuf_tailroom(ut_params->ibuf));
8482
8483         /* Create AEAD operation */
8484         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8485         if (retval < 0)
8486                 return retval;
8487
8488         /* Create GCM xform */
8489         memcpy(key, tdata->key.data, tdata->key.len);
8490         retval = create_aead_xform(ut_params->op,
8491                         tdata->algo,
8492                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
8493                         key, tdata->key.len,
8494                         tdata->aad.len, tdata->auth_tag.len,
8495                         tdata->iv.len);
8496         if (retval < 0)
8497                 return retval;
8498
8499         ut_params->op->sym->m_src = ut_params->ibuf;
8500
8501         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
8502                         RTE_CRYPTO_OP_SESSIONLESS,
8503                         "crypto op session type not sessionless");
8504
8505         /* Process crypto operation */
8506         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
8507                         ut_params->op), "failed to process sym crypto op");
8508
8509         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
8510
8511         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8512                         "crypto op status not success");
8513
8514         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8515
8516         ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
8517                         ut_params->op->sym->cipher.data.offset);
8518         auth_tag = ciphertext + plaintext_pad_len;
8519
8520         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8521         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8522
8523         /* Validate obuf */
8524         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8525                         ciphertext,
8526                         tdata->ciphertext.data,
8527                         tdata->ciphertext.len,
8528                         "Ciphertext data not as expected");
8529
8530         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8531                         auth_tag,
8532                         tdata->auth_tag.data,
8533                         tdata->auth_tag.len,
8534                         "Generated auth tag not as expected");
8535
8536         return 0;
8537
8538 }
8539
8540 static int
8541 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
8542 {
8543         return test_authenticated_encryption_sessionless(
8544                         &gcm_test_case_5);
8545 }
8546
8547 static int
8548 test_authenticated_decryption_sessionless(
8549                 const struct aead_test_data *tdata)
8550 {
8551         struct crypto_testsuite_params *ts_params = &testsuite_params;
8552         struct crypto_unittest_params *ut_params = &unittest_params;
8553
8554         int retval;
8555         uint8_t *plaintext;
8556         uint8_t key[tdata->key.len + 1];
8557
8558         /* This test is for AESNI MB and AESNI GCM PMDs only */
8559         if ((gbl_driver_id != rte_cryptodev_driver_id_get(
8560                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) &&
8561                         (gbl_driver_id != rte_cryptodev_driver_id_get(
8562                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))))
8563                 return -ENOTSUP;
8564
8565         /* not supported with CPU crypto */
8566         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8567                 return -ENOTSUP;
8568
8569         /* Verify the capabilities */
8570         struct rte_cryptodev_sym_capability_idx cap_idx;
8571         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8572         cap_idx.algo.aead = tdata->algo;
8573         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
8574                         &cap_idx) == NULL)
8575                 return -ENOTSUP;
8576
8577         /* alloc mbuf and set payload */
8578         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8579
8580         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8581                         rte_pktmbuf_tailroom(ut_params->ibuf));
8582
8583         /* Create AEAD operation */
8584         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
8585         if (retval < 0)
8586                 return retval;
8587
8588         /* Create AEAD xform */
8589         memcpy(key, tdata->key.data, tdata->key.len);
8590         retval = create_aead_xform(ut_params->op,
8591                         tdata->algo,
8592                         RTE_CRYPTO_AEAD_OP_DECRYPT,
8593                         key, tdata->key.len,
8594                         tdata->aad.len, tdata->auth_tag.len,
8595                         tdata->iv.len);
8596         if (retval < 0)
8597                 return retval;
8598
8599         ut_params->op->sym->m_src = ut_params->ibuf;
8600
8601         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
8602                         RTE_CRYPTO_OP_SESSIONLESS,
8603                         "crypto op session type not sessionless");
8604
8605         /* Process crypto operation */
8606         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
8607                         ut_params->op), "failed to process sym crypto op");
8608
8609         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
8610
8611         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8612                         "crypto op status not success");
8613
8614         plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
8615                         ut_params->op->sym->cipher.data.offset);
8616
8617         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
8618
8619         /* Validate obuf */
8620         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8621                         plaintext,
8622                         tdata->plaintext.data,
8623                         tdata->plaintext.len,
8624                         "Plaintext data not as expected");
8625
8626         TEST_ASSERT_EQUAL(ut_params->op->status,
8627                         RTE_CRYPTO_OP_STATUS_SUCCESS,
8628                         "Authentication failed");
8629         return 0;
8630 }
8631
8632 static int
8633 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
8634 {
8635         return test_authenticated_decryption_sessionless(
8636                         &gcm_test_case_5);
8637 }
8638
8639 static int
8640 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
8641 {
8642         return test_authenticated_encryption(&ccm_test_case_128_1);
8643 }
8644
8645 static int
8646 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
8647 {
8648         return test_authenticated_encryption(&ccm_test_case_128_2);
8649 }
8650
8651 static int
8652 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
8653 {
8654         return test_authenticated_encryption(&ccm_test_case_128_3);
8655 }
8656
8657 static int
8658 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
8659 {
8660         return test_authenticated_decryption(&ccm_test_case_128_1);
8661 }
8662
8663 static int
8664 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
8665 {
8666         return test_authenticated_decryption(&ccm_test_case_128_2);
8667 }
8668
8669 static int
8670 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
8671 {
8672         return test_authenticated_decryption(&ccm_test_case_128_3);
8673 }
8674
8675 static int
8676 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
8677 {
8678         return test_authenticated_encryption(&ccm_test_case_192_1);
8679 }
8680
8681 static int
8682 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
8683 {
8684         return test_authenticated_encryption(&ccm_test_case_192_2);
8685 }
8686
8687 static int
8688 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
8689 {
8690         return test_authenticated_encryption(&ccm_test_case_192_3);
8691 }
8692
8693 static int
8694 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
8695 {
8696         return test_authenticated_decryption(&ccm_test_case_192_1);
8697 }
8698
8699 static int
8700 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
8701 {
8702         return test_authenticated_decryption(&ccm_test_case_192_2);
8703 }
8704
8705 static int
8706 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
8707 {
8708         return test_authenticated_decryption(&ccm_test_case_192_3);
8709 }
8710
8711 static int
8712 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
8713 {
8714         return test_authenticated_encryption(&ccm_test_case_256_1);
8715 }
8716
8717 static int
8718 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
8719 {
8720         return test_authenticated_encryption(&ccm_test_case_256_2);
8721 }
8722
8723 static int
8724 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
8725 {
8726         return test_authenticated_encryption(&ccm_test_case_256_3);
8727 }
8728
8729 static int
8730 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
8731 {
8732         return test_authenticated_decryption(&ccm_test_case_256_1);
8733 }
8734
8735 static int
8736 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
8737 {
8738         return test_authenticated_decryption(&ccm_test_case_256_2);
8739 }
8740
8741 static int
8742 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
8743 {
8744         return test_authenticated_decryption(&ccm_test_case_256_3);
8745 }
8746
8747 static int
8748 test_stats(void)
8749 {
8750         struct crypto_testsuite_params *ts_params = &testsuite_params;
8751         struct rte_cryptodev_stats stats;
8752         struct rte_cryptodev *dev;
8753         cryptodev_stats_get_t temp_pfn;
8754
8755         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8756                 return -ENOTSUP;
8757
8758         /* Verify the capabilities */
8759         struct rte_cryptodev_sym_capability_idx cap_idx;
8760         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8761         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
8762         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
8763                         &cap_idx) == NULL)
8764                 return -ENOTSUP;
8765         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8766         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
8767         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
8768                         &cap_idx) == NULL)
8769                 return -ENOTSUP;
8770
8771         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
8772         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
8773                         &stats) == -ENODEV),
8774                 "rte_cryptodev_stats_get invalid dev failed");
8775         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
8776                 "rte_cryptodev_stats_get invalid Param failed");
8777         dev = &rte_cryptodevs[ts_params->valid_devs[0]];
8778         temp_pfn = dev->dev_ops->stats_get;
8779         dev->dev_ops->stats_get = (cryptodev_stats_get_t)0;
8780         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
8781                         == -ENOTSUP),
8782                 "rte_cryptodev_stats_get invalid Param failed");
8783         dev->dev_ops->stats_get = temp_pfn;
8784
8785         /* Test expected values */
8786         ut_setup();
8787         test_AES_CBC_HMAC_SHA1_encrypt_digest();
8788         ut_teardown();
8789         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
8790                         &stats),
8791                 "rte_cryptodev_stats_get failed");
8792         TEST_ASSERT((stats.enqueued_count == 1),
8793                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
8794         TEST_ASSERT((stats.dequeued_count == 1),
8795                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
8796         TEST_ASSERT((stats.enqueue_err_count == 0),
8797                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
8798         TEST_ASSERT((stats.dequeue_err_count == 0),
8799                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
8800
8801         /* invalid device but should ignore and not reset device stats*/
8802         rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
8803         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
8804                         &stats),
8805                 "rte_cryptodev_stats_get failed");
8806         TEST_ASSERT((stats.enqueued_count == 1),
8807                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
8808
8809         /* check that a valid reset clears stats */
8810         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
8811         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
8812                         &stats),
8813                                           "rte_cryptodev_stats_get failed");
8814         TEST_ASSERT((stats.enqueued_count == 0),
8815                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
8816         TEST_ASSERT((stats.dequeued_count == 0),
8817                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
8818
8819         return TEST_SUCCESS;
8820 }
8821
8822 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
8823                                    struct crypto_unittest_params *ut_params,
8824                                    enum rte_crypto_auth_operation op,
8825                                    const struct HMAC_MD5_vector *test_case)
8826 {
8827         uint8_t key[64];
8828
8829         memcpy(key, test_case->key.data, test_case->key.len);
8830
8831         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8832         ut_params->auth_xform.next = NULL;
8833         ut_params->auth_xform.auth.op = op;
8834
8835         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
8836
8837         ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
8838         ut_params->auth_xform.auth.key.length = test_case->key.len;
8839         ut_params->auth_xform.auth.key.data = key;
8840
8841         ut_params->sess = rte_cryptodev_sym_session_create(
8842                         ts_params->session_mpool);
8843
8844         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
8845                         ut_params->sess, &ut_params->auth_xform,
8846                         ts_params->session_priv_mpool);
8847
8848         if (ut_params->sess == NULL)
8849                 return TEST_FAILED;
8850
8851         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8852
8853         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8854                         rte_pktmbuf_tailroom(ut_params->ibuf));
8855
8856         return 0;
8857 }
8858
8859 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
8860                               const struct HMAC_MD5_vector *test_case,
8861                               uint8_t **plaintext)
8862 {
8863         uint16_t plaintext_pad_len;
8864
8865         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
8866
8867         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
8868                                 16);
8869
8870         *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8871                         plaintext_pad_len);
8872         memcpy(*plaintext, test_case->plaintext.data,
8873                         test_case->plaintext.len);
8874
8875         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
8876                         ut_params->ibuf, MD5_DIGEST_LEN);
8877         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
8878                         "no room to append digest");
8879         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
8880                         ut_params->ibuf, plaintext_pad_len);
8881
8882         if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
8883                 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
8884                            test_case->auth_tag.len);
8885         }
8886
8887         sym_op->auth.data.offset = 0;
8888         sym_op->auth.data.length = test_case->plaintext.len;
8889
8890         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8891         ut_params->op->sym->m_src = ut_params->ibuf;
8892
8893         return 0;
8894 }
8895
8896 static int
8897 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
8898 {
8899         uint16_t plaintext_pad_len;
8900         uint8_t *plaintext, *auth_tag;
8901
8902         struct crypto_testsuite_params *ts_params = &testsuite_params;
8903         struct crypto_unittest_params *ut_params = &unittest_params;
8904
8905         /* Verify the capabilities */
8906         struct rte_cryptodev_sym_capability_idx cap_idx;
8907         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8908         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
8909         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
8910                         &cap_idx) == NULL)
8911                 return -ENOTSUP;
8912
8913         if (MD5_HMAC_create_session(ts_params, ut_params,
8914                         RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
8915                 return TEST_FAILED;
8916
8917         /* Generate Crypto op data structure */
8918         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8919                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8920         TEST_ASSERT_NOT_NULL(ut_params->op,
8921                         "Failed to allocate symmetric crypto operation struct");
8922
8923         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
8924                                 16);
8925
8926         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
8927                 return TEST_FAILED;
8928
8929         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8930                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
8931                         ut_params->op);
8932         else
8933                 TEST_ASSERT_NOT_NULL(
8934                         process_crypto_request(ts_params->valid_devs[0],
8935                                 ut_params->op),
8936                                 "failed to process sym crypto op");
8937
8938         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8939                         "crypto op processing failed");
8940
8941         if (ut_params->op->sym->m_dst) {
8942                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8943                                 uint8_t *, plaintext_pad_len);
8944         } else {
8945                 auth_tag = plaintext + plaintext_pad_len;
8946         }
8947
8948         TEST_ASSERT_BUFFERS_ARE_EQUAL(
8949                         auth_tag,
8950                         test_case->auth_tag.data,
8951                         test_case->auth_tag.len,
8952                         "HMAC_MD5 generated tag not as expected");
8953
8954         return TEST_SUCCESS;
8955 }
8956
8957 static int
8958 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
8959 {
8960         uint8_t *plaintext;
8961
8962         struct crypto_testsuite_params *ts_params = &testsuite_params;
8963         struct crypto_unittest_params *ut_params = &unittest_params;
8964
8965         /* Verify the capabilities */
8966         struct rte_cryptodev_sym_capability_idx cap_idx;
8967         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8968         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
8969         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
8970                         &cap_idx) == NULL)
8971                 return -ENOTSUP;
8972
8973         if (MD5_HMAC_create_session(ts_params, ut_params,
8974                         RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
8975                 return TEST_FAILED;
8976         }
8977
8978         /* Generate Crypto op data structure */
8979         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8980                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8981         TEST_ASSERT_NOT_NULL(ut_params->op,
8982                         "Failed to allocate symmetric crypto operation struct");
8983
8984         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
8985                 return TEST_FAILED;
8986
8987         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8988                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
8989                         ut_params->op);
8990         else
8991                 TEST_ASSERT_NOT_NULL(
8992                         process_crypto_request(ts_params->valid_devs[0],
8993                                 ut_params->op),
8994                                 "failed to process sym crypto op");
8995
8996         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8997                         "HMAC_MD5 crypto op processing failed");
8998
8999         return TEST_SUCCESS;
9000 }
9001
9002 static int
9003 test_MD5_HMAC_generate_case_1(void)
9004 {
9005         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
9006 }
9007
9008 static int
9009 test_MD5_HMAC_verify_case_1(void)
9010 {
9011         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
9012 }
9013
9014 static int
9015 test_MD5_HMAC_generate_case_2(void)
9016 {
9017         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
9018 }
9019
9020 static int
9021 test_MD5_HMAC_verify_case_2(void)
9022 {
9023         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
9024 }
9025
9026 static int
9027 test_multi_session(void)
9028 {
9029         struct crypto_testsuite_params *ts_params = &testsuite_params;
9030         struct crypto_unittest_params *ut_params = &unittest_params;
9031
9032         struct rte_cryptodev_info dev_info;
9033         struct rte_cryptodev_sym_session **sessions;
9034
9035         uint16_t i;
9036
9037         /* Verify the capabilities */
9038         struct rte_cryptodev_sym_capability_idx cap_idx;
9039         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9040         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
9041         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9042                         &cap_idx) == NULL)
9043                 return -ENOTSUP;
9044         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9045         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
9046         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9047                         &cap_idx) == NULL)
9048                 return -ENOTSUP;
9049
9050         test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
9051                         aes_cbc_key, hmac_sha512_key);
9052
9053
9054         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9055
9056         sessions = rte_malloc(NULL,
9057                         (sizeof(struct rte_cryptodev_sym_session *) *
9058                         MAX_NB_SESSIONS) + 1, 0);
9059
9060         /* Create multiple crypto sessions*/
9061         for (i = 0; i < MAX_NB_SESSIONS; i++) {
9062
9063                 sessions[i] = rte_cryptodev_sym_session_create(
9064                                 ts_params->session_mpool);
9065
9066                 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9067                                 sessions[i], &ut_params->auth_xform,
9068                                 ts_params->session_priv_mpool);
9069                 TEST_ASSERT_NOT_NULL(sessions[i],
9070                                 "Session creation failed at session number %u",
9071                                 i);
9072
9073                 /* Attempt to send a request on each session */
9074                 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
9075                         sessions[i],
9076                         ut_params,
9077                         ts_params,
9078                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
9079                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
9080                         aes_cbc_iv),
9081                         "Failed to perform decrypt on request number %u.", i);
9082                 /* free crypto operation structure */
9083                 if (ut_params->op)
9084                         rte_crypto_op_free(ut_params->op);
9085
9086                 /*
9087                  * free mbuf - both obuf and ibuf are usually the same,
9088                  * so check if they point at the same address is necessary,
9089                  * to avoid freeing the mbuf twice.
9090                  */
9091                 if (ut_params->obuf) {
9092                         rte_pktmbuf_free(ut_params->obuf);
9093                         if (ut_params->ibuf == ut_params->obuf)
9094                                 ut_params->ibuf = 0;
9095                         ut_params->obuf = 0;
9096                 }
9097                 if (ut_params->ibuf) {
9098                         rte_pktmbuf_free(ut_params->ibuf);
9099                         ut_params->ibuf = 0;
9100                 }
9101         }
9102
9103         /* Next session create should fail */
9104         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9105                         sessions[i], &ut_params->auth_xform,
9106                         ts_params->session_priv_mpool);
9107         TEST_ASSERT_NULL(sessions[i],
9108                         "Session creation succeeded unexpectedly!");
9109
9110         for (i = 0; i < MAX_NB_SESSIONS; i++) {
9111                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
9112                                 sessions[i]);
9113                 rte_cryptodev_sym_session_free(sessions[i]);
9114         }
9115
9116         rte_free(sessions);
9117
9118         return TEST_SUCCESS;
9119 }
9120
9121 struct multi_session_params {
9122         struct crypto_unittest_params ut_params;
9123         uint8_t *cipher_key;
9124         uint8_t *hmac_key;
9125         const uint8_t *cipher;
9126         const uint8_t *digest;
9127         uint8_t *iv;
9128 };
9129
9130 #define MB_SESSION_NUMBER 3
9131
9132 static int
9133 test_multi_session_random_usage(void)
9134 {
9135         struct crypto_testsuite_params *ts_params = &testsuite_params;
9136         struct rte_cryptodev_info dev_info;
9137         struct rte_cryptodev_sym_session **sessions;
9138         uint32_t i, j;
9139         struct multi_session_params ut_paramz[] = {
9140
9141                 {
9142                         .cipher_key = ms_aes_cbc_key0,
9143                         .hmac_key = ms_hmac_key0,
9144                         .cipher = ms_aes_cbc_cipher0,
9145                         .digest = ms_hmac_digest0,
9146                         .iv = ms_aes_cbc_iv0
9147                 },
9148                 {
9149                         .cipher_key = ms_aes_cbc_key1,
9150                         .hmac_key = ms_hmac_key1,
9151                         .cipher = ms_aes_cbc_cipher1,
9152                         .digest = ms_hmac_digest1,
9153                         .iv = ms_aes_cbc_iv1
9154                 },
9155                 {
9156                         .cipher_key = ms_aes_cbc_key2,
9157                         .hmac_key = ms_hmac_key2,
9158                         .cipher = ms_aes_cbc_cipher2,
9159                         .digest = ms_hmac_digest2,
9160                         .iv = ms_aes_cbc_iv2
9161                 },
9162
9163         };
9164
9165         /* Verify the capabilities */
9166         struct rte_cryptodev_sym_capability_idx cap_idx;
9167         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9168         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
9169         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9170                         &cap_idx) == NULL)
9171                 return -ENOTSUP;
9172         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9173         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
9174         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9175                         &cap_idx) == NULL)
9176                 return -ENOTSUP;
9177
9178         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9179
9180         sessions = rte_malloc(NULL,
9181                         (sizeof(struct rte_cryptodev_sym_session *)
9182                                         * MAX_NB_SESSIONS) + 1, 0);
9183
9184         for (i = 0; i < MB_SESSION_NUMBER; i++) {
9185                 sessions[i] = rte_cryptodev_sym_session_create(
9186                                 ts_params->session_mpool);
9187
9188                 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
9189                                 sizeof(struct crypto_unittest_params));
9190
9191                 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
9192                                 &ut_paramz[i].ut_params,
9193                                 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
9194
9195                 /* Create multiple crypto sessions*/
9196                 rte_cryptodev_sym_session_init(
9197                                 ts_params->valid_devs[0],
9198                                 sessions[i],
9199                                 &ut_paramz[i].ut_params.auth_xform,
9200                                 ts_params->session_priv_mpool);
9201
9202                 TEST_ASSERT_NOT_NULL(sessions[i],
9203                                 "Session creation failed at session number %u",
9204                                 i);
9205
9206         }
9207
9208         srand(time(NULL));
9209         for (i = 0; i < 40000; i++) {
9210
9211                 j = rand() % MB_SESSION_NUMBER;
9212
9213                 TEST_ASSERT_SUCCESS(
9214                         test_AES_CBC_HMAC_SHA512_decrypt_perform(
9215                                         sessions[j],
9216                                         &ut_paramz[j].ut_params,
9217                                         ts_params, ut_paramz[j].cipher,
9218                                         ut_paramz[j].digest,
9219                                         ut_paramz[j].iv),
9220                         "Failed to perform decrypt on request number %u.", i);
9221
9222                 if (ut_paramz[j].ut_params.op)
9223                         rte_crypto_op_free(ut_paramz[j].ut_params.op);
9224
9225                 /*
9226                  * free mbuf - both obuf and ibuf are usually the same,
9227                  * so check if they point at the same address is necessary,
9228                  * to avoid freeing the mbuf twice.
9229                  */
9230                 if (ut_paramz[j].ut_params.obuf) {
9231                         rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
9232                         if (ut_paramz[j].ut_params.ibuf
9233                                         == ut_paramz[j].ut_params.obuf)
9234                                 ut_paramz[j].ut_params.ibuf = 0;
9235                         ut_paramz[j].ut_params.obuf = 0;
9236                 }
9237                 if (ut_paramz[j].ut_params.ibuf) {
9238                         rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
9239                         ut_paramz[j].ut_params.ibuf = 0;
9240                 }
9241         }
9242
9243         for (i = 0; i < MB_SESSION_NUMBER; i++) {
9244                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
9245                                 sessions[i]);
9246                 rte_cryptodev_sym_session_free(sessions[i]);
9247         }
9248
9249         rte_free(sessions);
9250
9251         return TEST_SUCCESS;
9252 }
9253
9254 static int
9255 test_null_cipher_only_operation(void)
9256 {
9257         struct crypto_testsuite_params *ts_params = &testsuite_params;
9258         struct crypto_unittest_params *ut_params = &unittest_params;
9259
9260         /* Verify the capabilities */
9261         struct rte_cryptodev_sym_capability_idx cap_idx;
9262         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9263         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL;
9264         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9265                         &cap_idx) == NULL)
9266                 return -ENOTSUP;
9267
9268         /* Generate test mbuf data and space for digest */
9269         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
9270                         catch_22_quote, QUOTE_512_BYTES, 0);
9271
9272         /* Setup Cipher Parameters */
9273         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9274         ut_params->cipher_xform.next = NULL;
9275
9276         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
9277         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9278
9279         ut_params->sess = rte_cryptodev_sym_session_create(
9280                         ts_params->session_mpool);
9281
9282         /* Create Crypto session*/
9283         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9284                                 ut_params->sess,
9285                                 &ut_params->cipher_xform,
9286                                 ts_params->session_priv_mpool);
9287         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
9288
9289         /* Generate Crypto op data structure */
9290         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9291                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9292         TEST_ASSERT_NOT_NULL(ut_params->op,
9293                         "Failed to allocate symmetric crypto operation struct");
9294
9295         /* Set crypto operation data parameters */
9296         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9297
9298         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
9299
9300         /* set crypto operation source mbuf */
9301         sym_op->m_src = ut_params->ibuf;
9302
9303         sym_op->cipher.data.offset = 0;
9304         sym_op->cipher.data.length = QUOTE_512_BYTES;
9305
9306         /* Process crypto operation */
9307         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
9308                         ut_params->op);
9309         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
9310
9311         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9312                         "crypto operation processing failed");
9313
9314         /* Validate obuf */
9315         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9316                         rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
9317                         catch_22_quote,
9318                         QUOTE_512_BYTES,
9319                         "Ciphertext data not as expected");
9320
9321         return TEST_SUCCESS;
9322 }
9323 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
9324                         0xab, 0xab, 0xab, 0xab,
9325                         0xab, 0xab, 0xab, 0xab,
9326                         0xab, 0xab, 0xab, 0xab};
9327 static int
9328 test_null_auth_only_operation(void)
9329 {
9330         struct crypto_testsuite_params *ts_params = &testsuite_params;
9331         struct crypto_unittest_params *ut_params = &unittest_params;
9332         uint8_t *digest;
9333
9334         /* Verify the capabilities */
9335         struct rte_cryptodev_sym_capability_idx cap_idx;
9336         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9337         cap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL;
9338         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9339                         &cap_idx) == NULL)
9340                 return -ENOTSUP;
9341
9342         /* Generate test mbuf data and space for digest */
9343         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
9344                         catch_22_quote, QUOTE_512_BYTES, 0);
9345
9346         /* create a pointer for digest, but don't expect anything to be written
9347          * here in a NULL auth algo so no mbuf append done.
9348          */
9349         digest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9350                         QUOTE_512_BYTES);
9351         /* prefill the memory pointed to by digest */
9352         memcpy(digest, orig_data, sizeof(orig_data));
9353
9354         /* Setup HMAC Parameters */
9355         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9356         ut_params->auth_xform.next = NULL;
9357
9358         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
9359         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
9360
9361         ut_params->sess = rte_cryptodev_sym_session_create(
9362                         ts_params->session_mpool);
9363
9364         /* Create Crypto session*/
9365         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9366                         ut_params->sess, &ut_params->auth_xform,
9367                         ts_params->session_priv_mpool);
9368         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
9369
9370         /* Generate Crypto op data structure */
9371         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9372                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9373         TEST_ASSERT_NOT_NULL(ut_params->op,
9374                         "Failed to allocate symmetric crypto operation struct");
9375
9376         /* Set crypto operation data parameters */
9377         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9378
9379         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
9380
9381         sym_op->m_src = ut_params->ibuf;
9382
9383         sym_op->auth.data.offset = 0;
9384         sym_op->auth.data.length = QUOTE_512_BYTES;
9385         sym_op->auth.digest.data = digest;
9386         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,
9387                         QUOTE_512_BYTES);
9388
9389         /* Process crypto operation */
9390         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
9391                         ut_params->op);
9392         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
9393
9394         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9395                         "crypto operation processing failed");
9396         /* Make sure memory pointed to by digest hasn't been overwritten */
9397         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9398                         orig_data,
9399                         digest,
9400                         sizeof(orig_data),
9401                         "Memory at digest ptr overwritten unexpectedly");
9402
9403         return TEST_SUCCESS;
9404 }
9405
9406
9407 static int
9408 test_null_cipher_auth_operation(void)
9409 {
9410         struct crypto_testsuite_params *ts_params = &testsuite_params;
9411         struct crypto_unittest_params *ut_params = &unittest_params;
9412         uint8_t *digest;
9413
9414         /* Verify the capabilities */
9415         struct rte_cryptodev_sym_capability_idx cap_idx;
9416         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9417         cap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL;
9418         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9419                         &cap_idx) == NULL)
9420                 return -ENOTSUP;
9421         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9422         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL;
9423         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9424                         &cap_idx) == NULL)
9425                 return -ENOTSUP;
9426
9427         /* Generate test mbuf data and space for digest */
9428         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
9429                         catch_22_quote, QUOTE_512_BYTES, 0);
9430
9431         /* create a pointer for digest, but don't expect anything to be written
9432          * here in a NULL auth algo so no mbuf append done.
9433          */
9434         digest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9435                         QUOTE_512_BYTES);
9436         /* prefill the memory pointed to by digest */
9437         memcpy(digest, orig_data, sizeof(orig_data));
9438
9439         /* Setup Cipher Parameters */
9440         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9441         ut_params->cipher_xform.next = &ut_params->auth_xform;
9442
9443         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
9444         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9445
9446         /* Setup HMAC Parameters */
9447         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9448         ut_params->auth_xform.next = NULL;
9449
9450         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
9451         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
9452
9453         ut_params->sess = rte_cryptodev_sym_session_create(
9454                         ts_params->session_mpool);
9455
9456         /* Create Crypto session*/
9457         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9458                         ut_params->sess, &ut_params->cipher_xform,
9459                         ts_params->session_priv_mpool);
9460         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
9461
9462         /* Generate Crypto op data structure */
9463         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9464                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9465         TEST_ASSERT_NOT_NULL(ut_params->op,
9466                         "Failed to allocate symmetric crypto operation struct");
9467
9468         /* Set crypto operation data parameters */
9469         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9470
9471         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
9472
9473         sym_op->m_src = ut_params->ibuf;
9474
9475         sym_op->cipher.data.offset = 0;
9476         sym_op->cipher.data.length = QUOTE_512_BYTES;
9477
9478         sym_op->auth.data.offset = 0;
9479         sym_op->auth.data.length = QUOTE_512_BYTES;
9480         sym_op->auth.digest.data = digest;
9481         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,
9482                         QUOTE_512_BYTES);
9483
9484         /* Process crypto operation */
9485         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
9486                         ut_params->op);
9487         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
9488
9489         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9490                         "crypto operation processing failed");
9491
9492         /* Validate obuf */
9493         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9494                         rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
9495                         catch_22_quote,
9496                         QUOTE_512_BYTES,
9497                         "Ciphertext data not as expected");
9498         /* Make sure memory pointed to by digest hasn't been overwritten */
9499         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9500                         orig_data,
9501                         digest,
9502                         sizeof(orig_data),
9503                         "Memory at digest ptr overwritten unexpectedly");
9504
9505         return TEST_SUCCESS;
9506 }
9507
9508 static int
9509 test_null_auth_cipher_operation(void)
9510 {
9511         struct crypto_testsuite_params *ts_params = &testsuite_params;
9512         struct crypto_unittest_params *ut_params = &unittest_params;
9513         uint8_t *digest;
9514
9515         /* Verify the capabilities */
9516         struct rte_cryptodev_sym_capability_idx cap_idx;
9517         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9518         cap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL;
9519         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9520                         &cap_idx) == NULL)
9521                 return -ENOTSUP;
9522         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9523         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL;
9524         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9525                         &cap_idx) == NULL)
9526                 return -ENOTSUP;
9527
9528         /* Generate test mbuf data */
9529         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
9530                         catch_22_quote, QUOTE_512_BYTES, 0);
9531
9532         /* create a pointer for digest, but don't expect anything to be written
9533          * here in a NULL auth algo so no mbuf append done.
9534          */
9535         digest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9536                                 QUOTE_512_BYTES);
9537         /* prefill the memory pointed to by digest */
9538         memcpy(digest, orig_data, sizeof(orig_data));
9539
9540         /* Setup Cipher Parameters */
9541         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9542         ut_params->cipher_xform.next = NULL;
9543
9544         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
9545         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9546
9547         /* Setup HMAC Parameters */
9548         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9549         ut_params->auth_xform.next = &ut_params->cipher_xform;
9550
9551         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
9552         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
9553
9554         ut_params->sess = rte_cryptodev_sym_session_create(
9555                         ts_params->session_mpool);
9556
9557         /* Create Crypto session*/
9558         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9559                         ut_params->sess, &ut_params->cipher_xform,
9560                         ts_params->session_priv_mpool);
9561         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
9562
9563         /* Generate Crypto op data structure */
9564         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9565                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9566         TEST_ASSERT_NOT_NULL(ut_params->op,
9567                         "Failed to allocate symmetric crypto operation struct");
9568
9569         /* Set crypto operation data parameters */
9570         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9571
9572         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
9573
9574         sym_op->m_src = ut_params->ibuf;
9575
9576         sym_op->cipher.data.offset = 0;
9577         sym_op->cipher.data.length = QUOTE_512_BYTES;
9578
9579         sym_op->auth.data.offset = 0;
9580         sym_op->auth.data.length = QUOTE_512_BYTES;
9581         sym_op->auth.digest.data = digest;
9582         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,
9583                                         QUOTE_512_BYTES);
9584
9585         /* Process crypto operation */
9586         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
9587                         ut_params->op);
9588         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
9589
9590         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9591                         "crypto operation processing failed");
9592
9593         /* Validate obuf */
9594         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9595                         rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
9596                         catch_22_quote,
9597                         QUOTE_512_BYTES,
9598                         "Ciphertext data not as expected");
9599         /* Make sure memory pointed to by digest hasn't been overwritten */
9600         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9601                         orig_data,
9602                         digest,
9603                         sizeof(orig_data),
9604                         "Memory at digest ptr overwritten unexpectedly");
9605
9606         return TEST_SUCCESS;
9607 }
9608
9609
9610 static int
9611 test_null_invalid_operation(void)
9612 {
9613         struct crypto_testsuite_params *ts_params = &testsuite_params;
9614         struct crypto_unittest_params *ut_params = &unittest_params;
9615         int ret;
9616
9617         /* This test is for NULL PMD only */
9618         if (gbl_driver_id != rte_cryptodev_driver_id_get(
9619                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
9620                 return -ENOTSUP;
9621
9622         /* Setup Cipher Parameters */
9623         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9624         ut_params->cipher_xform.next = NULL;
9625
9626         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
9627         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9628
9629         ut_params->sess = rte_cryptodev_sym_session_create(
9630                         ts_params->session_mpool);
9631
9632         /* Create Crypto session*/
9633         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9634                         ut_params->sess, &ut_params->cipher_xform,
9635                         ts_params->session_priv_mpool);
9636         TEST_ASSERT(ret < 0,
9637                         "Session creation succeeded unexpectedly");
9638
9639
9640         /* Setup HMAC Parameters */
9641         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9642         ut_params->auth_xform.next = NULL;
9643
9644         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
9645         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
9646
9647         ut_params->sess = rte_cryptodev_sym_session_create(
9648                         ts_params->session_mpool);
9649
9650         /* Create Crypto session*/
9651         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9652                         ut_params->sess, &ut_params->auth_xform,
9653                         ts_params->session_priv_mpool);
9654         TEST_ASSERT(ret < 0,
9655                         "Session creation succeeded unexpectedly");
9656
9657         return TEST_SUCCESS;
9658 }
9659
9660
9661 #define NULL_BURST_LENGTH (32)
9662
9663 static int
9664 test_null_burst_operation(void)
9665 {
9666         struct crypto_testsuite_params *ts_params = &testsuite_params;
9667         struct crypto_unittest_params *ut_params = &unittest_params;
9668
9669         unsigned i, burst_len = NULL_BURST_LENGTH;
9670
9671         struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
9672         struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
9673
9674         /* This test is for NULL PMD only */
9675         if (gbl_driver_id != rte_cryptodev_driver_id_get(
9676                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
9677                 return -ENOTSUP;
9678
9679         /* Setup Cipher Parameters */
9680         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9681         ut_params->cipher_xform.next = &ut_params->auth_xform;
9682
9683         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
9684         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9685
9686         /* Setup HMAC Parameters */
9687         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9688         ut_params->auth_xform.next = NULL;
9689
9690         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
9691         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
9692
9693         ut_params->sess = rte_cryptodev_sym_session_create(
9694                         ts_params->session_mpool);
9695
9696         /* Create Crypto session*/
9697         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9698                         ut_params->sess, &ut_params->cipher_xform,
9699                         ts_params->session_priv_mpool);
9700         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
9701
9702         TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
9703                         RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
9704                         burst_len, "failed to generate burst of crypto ops");
9705
9706         /* Generate an operation for each mbuf in burst */
9707         for (i = 0; i < burst_len; i++) {
9708                 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9709
9710                 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
9711
9712                 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
9713                                 sizeof(unsigned));
9714                 *data = i;
9715
9716                 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
9717
9718                 burst[i]->sym->m_src = m;
9719         }
9720
9721         /* Process crypto operation */
9722         TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
9723                         0, burst, burst_len),
9724                         burst_len,
9725                         "Error enqueuing burst");
9726
9727         TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
9728                         0, burst_dequeued, burst_len),
9729                         burst_len,
9730                         "Error dequeuing burst");
9731
9732
9733         for (i = 0; i < burst_len; i++) {
9734                 TEST_ASSERT_EQUAL(
9735                         *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
9736                         *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
9737                                         uint32_t *),
9738                         "data not as expected");
9739
9740                 rte_pktmbuf_free(burst[i]->sym->m_src);
9741                 rte_crypto_op_free(burst[i]);
9742         }
9743
9744         return TEST_SUCCESS;
9745 }
9746
9747 static void
9748 generate_gmac_large_plaintext(uint8_t *data)
9749 {
9750         uint16_t i;
9751
9752         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
9753                 memcpy(&data[i], &data[0], 32);
9754 }
9755
9756 static int
9757 create_gmac_operation(enum rte_crypto_auth_operation op,
9758                 const struct gmac_test_data *tdata)
9759 {
9760         struct crypto_testsuite_params *ts_params = &testsuite_params;
9761         struct crypto_unittest_params *ut_params = &unittest_params;
9762         struct rte_crypto_sym_op *sym_op;
9763
9764         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9765
9766         /* Generate Crypto op data structure */
9767         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9768                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9769         TEST_ASSERT_NOT_NULL(ut_params->op,
9770                         "Failed to allocate symmetric crypto operation struct");
9771
9772         sym_op = ut_params->op->sym;
9773
9774         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
9775                         ut_params->ibuf, tdata->gmac_tag.len);
9776         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
9777                         "no room to append digest");
9778
9779         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
9780                         ut_params->ibuf, plaintext_pad_len);
9781
9782         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
9783                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
9784                                 tdata->gmac_tag.len);
9785                 debug_hexdump(stdout, "digest:",
9786                                 sym_op->auth.digest.data,
9787                                 tdata->gmac_tag.len);
9788         }
9789
9790         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
9791                         uint8_t *, IV_OFFSET);
9792
9793         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
9794
9795         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
9796
9797         sym_op->cipher.data.length = 0;
9798         sym_op->cipher.data.offset = 0;
9799
9800         sym_op->auth.data.offset = 0;
9801         sym_op->auth.data.length = tdata->plaintext.len;
9802
9803         return 0;
9804 }
9805
9806 static int create_gmac_session(uint8_t dev_id,
9807                 const struct gmac_test_data *tdata,
9808                 enum rte_crypto_auth_operation auth_op)
9809 {
9810         uint8_t auth_key[tdata->key.len];
9811
9812         struct crypto_testsuite_params *ts_params = &testsuite_params;
9813         struct crypto_unittest_params *ut_params = &unittest_params;
9814
9815         memcpy(auth_key, tdata->key.data, tdata->key.len);
9816
9817         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9818         ut_params->auth_xform.next = NULL;
9819
9820         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
9821         ut_params->auth_xform.auth.op = auth_op;
9822         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
9823         ut_params->auth_xform.auth.key.length = tdata->key.len;
9824         ut_params->auth_xform.auth.key.data = auth_key;
9825         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
9826         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
9827
9828
9829         ut_params->sess = rte_cryptodev_sym_session_create(
9830                         ts_params->session_mpool);
9831
9832         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
9833                         &ut_params->auth_xform,
9834                         ts_params->session_priv_mpool);
9835
9836         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
9837
9838         return 0;
9839 }
9840
9841 static int
9842 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
9843 {
9844         struct crypto_testsuite_params *ts_params = &testsuite_params;
9845         struct crypto_unittest_params *ut_params = &unittest_params;
9846
9847         int retval;
9848
9849         uint8_t *auth_tag, *plaintext;
9850         uint16_t plaintext_pad_len;
9851
9852         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
9853                               "No GMAC length in the source data");
9854
9855         /* Verify the capabilities */
9856         struct rte_cryptodev_sym_capability_idx cap_idx;
9857         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9858         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
9859         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9860                         &cap_idx) == NULL)
9861                 return -ENOTSUP;
9862
9863         retval = create_gmac_session(ts_params->valid_devs[0],
9864                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
9865
9866         if (retval < 0)
9867                 return retval;
9868
9869         if (tdata->plaintext.len > MBUF_SIZE)
9870                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
9871         else
9872                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9873         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
9874                         "Failed to allocate input buffer in mempool");
9875
9876         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9877                         rte_pktmbuf_tailroom(ut_params->ibuf));
9878
9879         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9880         /*
9881          * Runtime generate the large plain text instead of use hard code
9882          * plain text vector. It is done to avoid create huge source file
9883          * with the test vector.
9884          */
9885         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
9886                 generate_gmac_large_plaintext(tdata->plaintext.data);
9887
9888         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9889                                 plaintext_pad_len);
9890         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
9891
9892         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
9893         debug_hexdump(stdout, "plaintext:", plaintext,
9894                         tdata->plaintext.len);
9895
9896         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
9897                         tdata);
9898
9899         if (retval < 0)
9900                 return retval;
9901
9902         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9903
9904         ut_params->op->sym->m_src = ut_params->ibuf;
9905
9906         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9907                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
9908                         ut_params->op);
9909         else
9910                 TEST_ASSERT_NOT_NULL(
9911                         process_crypto_request(ts_params->valid_devs[0],
9912                         ut_params->op), "failed to process sym crypto op");
9913
9914         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9915                         "crypto op processing failed");
9916
9917         if (ut_params->op->sym->m_dst) {
9918                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
9919                                 uint8_t *, plaintext_pad_len);
9920         } else {
9921                 auth_tag = plaintext + plaintext_pad_len;
9922         }
9923
9924         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
9925
9926         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9927                         auth_tag,
9928                         tdata->gmac_tag.data,
9929                         tdata->gmac_tag.len,
9930                         "GMAC Generated auth tag not as expected");
9931
9932         return 0;
9933 }
9934
9935 static int
9936 test_AES_GMAC_authentication_test_case_1(void)
9937 {
9938         return test_AES_GMAC_authentication(&gmac_test_case_1);
9939 }
9940
9941 static int
9942 test_AES_GMAC_authentication_test_case_2(void)
9943 {
9944         return test_AES_GMAC_authentication(&gmac_test_case_2);
9945 }
9946
9947 static int
9948 test_AES_GMAC_authentication_test_case_3(void)
9949 {
9950         return test_AES_GMAC_authentication(&gmac_test_case_3);
9951 }
9952
9953 static int
9954 test_AES_GMAC_authentication_test_case_4(void)
9955 {
9956         return test_AES_GMAC_authentication(&gmac_test_case_4);
9957 }
9958
9959 static int
9960 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
9961 {
9962         struct crypto_testsuite_params *ts_params = &testsuite_params;
9963         struct crypto_unittest_params *ut_params = &unittest_params;
9964         int retval;
9965         uint32_t plaintext_pad_len;
9966         uint8_t *plaintext;
9967
9968         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
9969                               "No GMAC length in the source data");
9970
9971         /* Verify the capabilities */
9972         struct rte_cryptodev_sym_capability_idx cap_idx;
9973         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9974         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
9975         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9976                         &cap_idx) == NULL)
9977                 return -ENOTSUP;
9978
9979         retval = create_gmac_session(ts_params->valid_devs[0],
9980                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
9981
9982         if (retval < 0)
9983                 return retval;
9984
9985         if (tdata->plaintext.len > MBUF_SIZE)
9986                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
9987         else
9988                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9989         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
9990                         "Failed to allocate input buffer in mempool");
9991
9992         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9993                         rte_pktmbuf_tailroom(ut_params->ibuf));
9994
9995         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9996
9997         /*
9998          * Runtime generate the large plain text instead of use hard code
9999          * plain text vector. It is done to avoid create huge source file
10000          * with the test vector.
10001          */
10002         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
10003                 generate_gmac_large_plaintext(tdata->plaintext.data);
10004
10005         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10006                                 plaintext_pad_len);
10007         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
10008
10009         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
10010         debug_hexdump(stdout, "plaintext:", plaintext,
10011                         tdata->plaintext.len);
10012
10013         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
10014                         tdata);
10015
10016         if (retval < 0)
10017                 return retval;
10018
10019         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10020
10021         ut_params->op->sym->m_src = ut_params->ibuf;
10022
10023         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10024                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10025                         ut_params->op);
10026         else
10027                 TEST_ASSERT_NOT_NULL(
10028                         process_crypto_request(ts_params->valid_devs[0],
10029                         ut_params->op), "failed to process sym crypto op");
10030
10031         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10032                         "crypto op processing failed");
10033
10034         return 0;
10035
10036 }
10037
10038 static int
10039 test_AES_GMAC_authentication_verify_test_case_1(void)
10040 {
10041         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
10042 }
10043
10044 static int
10045 test_AES_GMAC_authentication_verify_test_case_2(void)
10046 {
10047         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
10048 }
10049
10050 static int
10051 test_AES_GMAC_authentication_verify_test_case_3(void)
10052 {
10053         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
10054 }
10055
10056 static int
10057 test_AES_GMAC_authentication_verify_test_case_4(void)
10058 {
10059         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
10060 }
10061
10062 struct test_crypto_vector {
10063         enum rte_crypto_cipher_algorithm crypto_algo;
10064         unsigned int cipher_offset;
10065         unsigned int cipher_len;
10066
10067         struct {
10068                 uint8_t data[64];
10069                 unsigned int len;
10070         } cipher_key;
10071
10072         struct {
10073                 uint8_t data[64];
10074                 unsigned int len;
10075         } iv;
10076
10077         struct {
10078                 const uint8_t *data;
10079                 unsigned int len;
10080         } plaintext;
10081
10082         struct {
10083                 const uint8_t *data;
10084                 unsigned int len;
10085         } ciphertext;
10086
10087         enum rte_crypto_auth_algorithm auth_algo;
10088         unsigned int auth_offset;
10089
10090         struct {
10091                 uint8_t data[128];
10092                 unsigned int len;
10093         } auth_key;
10094
10095         struct {
10096                 const uint8_t *data;
10097                 unsigned int len;
10098         } aad;
10099
10100         struct {
10101                 uint8_t data[128];
10102                 unsigned int len;
10103         } digest;
10104 };
10105
10106 static const struct test_crypto_vector
10107 hmac_sha1_test_crypto_vector = {
10108         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
10109         .plaintext = {
10110                 .data = plaintext_hash,
10111                 .len = 512
10112         },
10113         .auth_key = {
10114                 .data = {
10115                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
10116                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
10117                         0xDE, 0xF4, 0xDE, 0xAD
10118                 },
10119                 .len = 20
10120         },
10121         .digest = {
10122                 .data = {
10123                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
10124                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
10125                         0x3F, 0x91, 0x64, 0x59
10126                 },
10127                 .len = 20
10128         }
10129 };
10130
10131 static const struct test_crypto_vector
10132 aes128_gmac_test_vector = {
10133         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
10134         .plaintext = {
10135                 .data = plaintext_hash,
10136                 .len = 512
10137         },
10138         .iv = {
10139                 .data = {
10140                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
10141                         0x08, 0x09, 0x0A, 0x0B
10142                 },
10143                 .len = 12
10144         },
10145         .auth_key = {
10146                 .data = {
10147                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
10148                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
10149                 },
10150                 .len = 16
10151         },
10152         .digest = {
10153                 .data = {
10154                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
10155                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
10156                 },
10157                 .len = 16
10158         }
10159 };
10160
10161 static const struct test_crypto_vector
10162 aes128cbc_hmac_sha1_test_vector = {
10163         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
10164         .cipher_offset = 0,
10165         .cipher_len = 512,
10166         .cipher_key = {
10167                 .data = {
10168                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
10169                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
10170                 },
10171                 .len = 16
10172         },
10173         .iv = {
10174                 .data = {
10175                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
10176                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
10177                 },
10178                 .len = 16
10179         },
10180         .plaintext = {
10181                 .data = plaintext_hash,
10182                 .len = 512
10183         },
10184         .ciphertext = {
10185                 .data = ciphertext512_aes128cbc,
10186                 .len = 512
10187         },
10188         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
10189         .auth_offset = 0,
10190         .auth_key = {
10191                 .data = {
10192                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
10193                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
10194                         0xDE, 0xF4, 0xDE, 0xAD
10195                 },
10196                 .len = 20
10197         },
10198         .digest = {
10199                 .data = {
10200                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
10201                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
10202                         0x18, 0x8C, 0x1D, 0x32
10203                 },
10204                 .len = 20
10205         }
10206 };
10207
10208 static const struct test_crypto_vector
10209 aes128cbc_hmac_sha1_aad_test_vector = {
10210         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
10211         .cipher_offset = 12,
10212         .cipher_len = 496,
10213         .cipher_key = {
10214                 .data = {
10215                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
10216                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
10217                 },
10218                 .len = 16
10219         },
10220         .iv = {
10221                 .data = {
10222                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
10223                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
10224                 },
10225                 .len = 16
10226         },
10227         .plaintext = {
10228                 .data = plaintext_hash,
10229                 .len = 512
10230         },
10231         .ciphertext = {
10232                 .data = ciphertext512_aes128cbc_aad,
10233                 .len = 512
10234         },
10235         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
10236         .auth_offset = 0,
10237         .auth_key = {
10238                 .data = {
10239                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
10240                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
10241                         0xDE, 0xF4, 0xDE, 0xAD
10242                 },
10243                 .len = 20
10244         },
10245         .digest = {
10246                 .data = {
10247                         0x1F, 0x6A, 0xD2, 0x8B, 0x4B, 0xB3, 0xC0, 0x9E,
10248                         0x86, 0x9B, 0x3A, 0xF2, 0x00, 0x5B, 0x4F, 0x08,
10249                         0x62, 0x8D, 0x62, 0x65
10250                 },
10251                 .len = 20
10252         }
10253 };
10254
10255 static void
10256 data_corruption(uint8_t *data)
10257 {
10258         data[0] += 1;
10259 }
10260
10261 static void
10262 tag_corruption(uint8_t *data, unsigned int tag_offset)
10263 {
10264         data[tag_offset] += 1;
10265 }
10266
10267 static int
10268 create_auth_session(struct crypto_unittest_params *ut_params,
10269                 uint8_t dev_id,
10270                 const struct test_crypto_vector *reference,
10271                 enum rte_crypto_auth_operation auth_op)
10272 {
10273         struct crypto_testsuite_params *ts_params = &testsuite_params;
10274         uint8_t auth_key[reference->auth_key.len + 1];
10275
10276         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
10277
10278         /* Setup Authentication Parameters */
10279         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10280         ut_params->auth_xform.auth.op = auth_op;
10281         ut_params->auth_xform.next = NULL;
10282         ut_params->auth_xform.auth.algo = reference->auth_algo;
10283         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
10284         ut_params->auth_xform.auth.key.data = auth_key;
10285         ut_params->auth_xform.auth.digest_length = reference->digest.len;
10286
10287         /* Create Crypto session*/
10288         ut_params->sess = rte_cryptodev_sym_session_create(
10289                         ts_params->session_mpool);
10290
10291         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
10292                                 &ut_params->auth_xform,
10293                                 ts_params->session_priv_mpool);
10294
10295         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10296
10297         return 0;
10298 }
10299
10300 static int
10301 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
10302                 uint8_t dev_id,
10303                 const struct test_crypto_vector *reference,
10304                 enum rte_crypto_auth_operation auth_op,
10305                 enum rte_crypto_cipher_operation cipher_op)
10306 {
10307         struct crypto_testsuite_params *ts_params = &testsuite_params;
10308         uint8_t cipher_key[reference->cipher_key.len + 1];
10309         uint8_t auth_key[reference->auth_key.len + 1];
10310
10311         memcpy(cipher_key, reference->cipher_key.data,
10312                         reference->cipher_key.len);
10313         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
10314
10315         /* Setup Authentication Parameters */
10316         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10317         ut_params->auth_xform.auth.op = auth_op;
10318         ut_params->auth_xform.auth.algo = reference->auth_algo;
10319         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
10320         ut_params->auth_xform.auth.key.data = auth_key;
10321         ut_params->auth_xform.auth.digest_length = reference->digest.len;
10322
10323         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
10324                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
10325                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
10326         } else {
10327                 ut_params->auth_xform.next = &ut_params->cipher_xform;
10328
10329                 /* Setup Cipher Parameters */
10330                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10331                 ut_params->cipher_xform.next = NULL;
10332                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
10333                 ut_params->cipher_xform.cipher.op = cipher_op;
10334                 ut_params->cipher_xform.cipher.key.data = cipher_key;
10335                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
10336                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10337                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
10338         }
10339
10340         /* Create Crypto session*/
10341         ut_params->sess = rte_cryptodev_sym_session_create(
10342                         ts_params->session_mpool);
10343
10344         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
10345                                 &ut_params->auth_xform,
10346                                 ts_params->session_priv_mpool);
10347
10348         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10349
10350         return 0;
10351 }
10352
10353 static int
10354 create_auth_operation(struct crypto_testsuite_params *ts_params,
10355                 struct crypto_unittest_params *ut_params,
10356                 const struct test_crypto_vector *reference,
10357                 unsigned int auth_generate)
10358 {
10359         /* Generate Crypto op data structure */
10360         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10361                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10362         TEST_ASSERT_NOT_NULL(ut_params->op,
10363                         "Failed to allocate pktmbuf offload");
10364
10365         /* Set crypto operation data parameters */
10366         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10367
10368         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10369
10370         /* set crypto operation source mbuf */
10371         sym_op->m_src = ut_params->ibuf;
10372
10373         /* digest */
10374         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10375                         ut_params->ibuf, reference->digest.len);
10376
10377         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10378                         "no room to append auth tag");
10379
10380         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10381                         ut_params->ibuf, reference->plaintext.len);
10382
10383         if (auth_generate)
10384                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
10385         else
10386                 memcpy(sym_op->auth.digest.data,
10387                                 reference->digest.data,
10388                                 reference->digest.len);
10389
10390         debug_hexdump(stdout, "digest:",
10391                         sym_op->auth.digest.data,
10392                         reference->digest.len);
10393
10394         sym_op->auth.data.length = reference->plaintext.len;
10395         sym_op->auth.data.offset = 0;
10396
10397         return 0;
10398 }
10399
10400 static int
10401 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
10402                 struct crypto_unittest_params *ut_params,
10403                 const struct test_crypto_vector *reference,
10404                 unsigned int auth_generate)
10405 {
10406         /* Generate Crypto op data structure */
10407         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10408                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10409         TEST_ASSERT_NOT_NULL(ut_params->op,
10410                         "Failed to allocate pktmbuf offload");
10411
10412         /* Set crypto operation data parameters */
10413         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10414
10415         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10416
10417         /* set crypto operation source mbuf */
10418         sym_op->m_src = ut_params->ibuf;
10419
10420         /* digest */
10421         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10422                         ut_params->ibuf, reference->digest.len);
10423
10424         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10425                         "no room to append auth tag");
10426
10427         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10428                         ut_params->ibuf, reference->ciphertext.len);
10429
10430         if (auth_generate)
10431                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
10432         else
10433                 memcpy(sym_op->auth.digest.data,
10434                                 reference->digest.data,
10435                                 reference->digest.len);
10436
10437         debug_hexdump(stdout, "digest:",
10438                         sym_op->auth.digest.data,
10439                         reference->digest.len);
10440
10441         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
10442                         reference->iv.data, reference->iv.len);
10443
10444         sym_op->cipher.data.length = 0;
10445         sym_op->cipher.data.offset = 0;
10446
10447         sym_op->auth.data.length = reference->plaintext.len;
10448         sym_op->auth.data.offset = 0;
10449
10450         return 0;
10451 }
10452
10453 static int
10454 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
10455                 struct crypto_unittest_params *ut_params,
10456                 const struct test_crypto_vector *reference,
10457                 unsigned int auth_generate)
10458 {
10459         /* Generate Crypto op data structure */
10460         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10461                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10462         TEST_ASSERT_NOT_NULL(ut_params->op,
10463                         "Failed to allocate pktmbuf offload");
10464
10465         /* Set crypto operation data parameters */
10466         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10467
10468         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10469
10470         /* set crypto operation source mbuf */
10471         sym_op->m_src = ut_params->ibuf;
10472
10473         /* digest */
10474         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10475                         ut_params->ibuf, reference->digest.len);
10476
10477         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10478                         "no room to append auth tag");
10479
10480         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10481                         ut_params->ibuf, reference->ciphertext.len);
10482
10483         if (auth_generate)
10484                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
10485         else
10486                 memcpy(sym_op->auth.digest.data,
10487                                 reference->digest.data,
10488                                 reference->digest.len);
10489
10490         debug_hexdump(stdout, "digest:",
10491                         sym_op->auth.digest.data,
10492                         reference->digest.len);
10493
10494         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
10495                         reference->iv.data, reference->iv.len);
10496
10497         sym_op->cipher.data.length = reference->cipher_len;
10498         sym_op->cipher.data.offset = reference->cipher_offset;
10499
10500         sym_op->auth.data.length = reference->plaintext.len;
10501         sym_op->auth.data.offset = reference->auth_offset;
10502
10503         return 0;
10504 }
10505
10506 static int
10507 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
10508                 struct crypto_unittest_params *ut_params,
10509                 const struct test_crypto_vector *reference)
10510 {
10511         return create_auth_operation(ts_params, ut_params, reference, 0);
10512 }
10513
10514 static int
10515 create_auth_verify_GMAC_operation(
10516                 struct crypto_testsuite_params *ts_params,
10517                 struct crypto_unittest_params *ut_params,
10518                 const struct test_crypto_vector *reference)
10519 {
10520         return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
10521 }
10522
10523 static int
10524 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
10525                 struct crypto_unittest_params *ut_params,
10526                 const struct test_crypto_vector *reference)
10527 {
10528         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
10529 }
10530
10531 static int
10532 test_authentication_verify_fail_when_data_corruption(
10533                 struct crypto_testsuite_params *ts_params,
10534                 struct crypto_unittest_params *ut_params,
10535                 const struct test_crypto_vector *reference,
10536                 unsigned int data_corrupted)
10537 {
10538         int retval;
10539
10540         uint8_t *plaintext;
10541
10542         /* Verify the capabilities */
10543         struct rte_cryptodev_sym_capability_idx cap_idx;
10544         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10545         cap_idx.algo.auth = reference->auth_algo;
10546         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10547                         &cap_idx) == NULL)
10548                 return -ENOTSUP;
10549
10550         /* Create session */
10551         retval = create_auth_session(ut_params,
10552                         ts_params->valid_devs[0],
10553                         reference,
10554                         RTE_CRYPTO_AUTH_OP_VERIFY);
10555         if (retval < 0)
10556                 return retval;
10557
10558         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10559         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10560                         "Failed to allocate input buffer in mempool");
10561
10562         /* clear mbuf payload */
10563         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10564                         rte_pktmbuf_tailroom(ut_params->ibuf));
10565
10566         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10567                         reference->plaintext.len);
10568         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
10569         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
10570
10571         debug_hexdump(stdout, "plaintext:", plaintext,
10572                 reference->plaintext.len);
10573
10574         /* Create operation */
10575         retval = create_auth_verify_operation(ts_params, ut_params, reference);
10576
10577         if (retval < 0)
10578                 return retval;
10579
10580         if (data_corrupted)
10581                 data_corruption(plaintext);
10582         else
10583                 tag_corruption(plaintext, reference->plaintext.len);
10584
10585         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
10586                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10587                         ut_params->op);
10588                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
10589                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10590                         "authentication not failed");
10591         } else {
10592                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
10593                         ut_params->op);
10594                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
10595         }
10596
10597         return 0;
10598 }
10599
10600 static int
10601 test_authentication_verify_GMAC_fail_when_corruption(
10602                 struct crypto_testsuite_params *ts_params,
10603                 struct crypto_unittest_params *ut_params,
10604                 const struct test_crypto_vector *reference,
10605                 unsigned int data_corrupted)
10606 {
10607         int retval;
10608         uint8_t *plaintext;
10609
10610         /* Verify the capabilities */
10611         struct rte_cryptodev_sym_capability_idx cap_idx;
10612         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10613         cap_idx.algo.auth = reference->auth_algo;
10614         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10615                         &cap_idx) == NULL)
10616                 return -ENOTSUP;
10617
10618         /* Create session */
10619         retval = create_auth_cipher_session(ut_params,
10620                         ts_params->valid_devs[0],
10621                         reference,
10622                         RTE_CRYPTO_AUTH_OP_VERIFY,
10623                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
10624         if (retval < 0)
10625                 return retval;
10626
10627         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10628         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10629                         "Failed to allocate input buffer in mempool");
10630
10631         /* clear mbuf payload */
10632         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10633                         rte_pktmbuf_tailroom(ut_params->ibuf));
10634
10635         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10636                         reference->plaintext.len);
10637         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
10638         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
10639
10640         debug_hexdump(stdout, "plaintext:", plaintext,
10641                 reference->plaintext.len);
10642
10643         /* Create operation */
10644         retval = create_auth_verify_GMAC_operation(ts_params,
10645                         ut_params,
10646                         reference);
10647
10648         if (retval < 0)
10649                 return retval;
10650
10651         if (data_corrupted)
10652                 data_corruption(plaintext);
10653         else
10654                 tag_corruption(plaintext, reference->aad.len);
10655
10656         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
10657                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10658                         ut_params->op);
10659                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
10660                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10661                         "authentication not failed");
10662         } else {
10663                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
10664                         ut_params->op);
10665                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
10666         }
10667
10668         return 0;
10669 }
10670
10671 static int
10672 test_authenticated_decryption_fail_when_corruption(
10673                 struct crypto_testsuite_params *ts_params,
10674                 struct crypto_unittest_params *ut_params,
10675                 const struct test_crypto_vector *reference,
10676                 unsigned int data_corrupted)
10677 {
10678         int retval;
10679
10680         uint8_t *ciphertext;
10681
10682         /* Verify the capabilities */
10683         struct rte_cryptodev_sym_capability_idx cap_idx;
10684         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10685         cap_idx.algo.auth = reference->auth_algo;
10686         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10687                         &cap_idx) == NULL)
10688                 return -ENOTSUP;
10689         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10690         cap_idx.algo.cipher = reference->crypto_algo;
10691         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10692                         &cap_idx) == NULL)
10693                 return -ENOTSUP;
10694
10695         /* Create session */
10696         retval = create_auth_cipher_session(ut_params,
10697                         ts_params->valid_devs[0],
10698                         reference,
10699                         RTE_CRYPTO_AUTH_OP_VERIFY,
10700                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
10701         if (retval < 0)
10702                 return retval;
10703
10704         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10705         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10706                         "Failed to allocate input buffer in mempool");
10707
10708         /* clear mbuf payload */
10709         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10710                         rte_pktmbuf_tailroom(ut_params->ibuf));
10711
10712         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10713                         reference->ciphertext.len);
10714         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
10715         memcpy(ciphertext, reference->ciphertext.data,
10716                         reference->ciphertext.len);
10717
10718         /* Create operation */
10719         retval = create_cipher_auth_verify_operation(ts_params,
10720                         ut_params,
10721                         reference);
10722
10723         if (retval < 0)
10724                 return retval;
10725
10726         if (data_corrupted)
10727                 data_corruption(ciphertext);
10728         else
10729                 tag_corruption(ciphertext, reference->ciphertext.len);
10730
10731         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
10732                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10733                         ut_params->op);
10734                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
10735                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10736                         "authentication not failed");
10737         } else {
10738                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
10739                         ut_params->op);
10740                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
10741         }
10742
10743         return 0;
10744 }
10745
10746 static int
10747 test_authenticated_encryt_with_esn(
10748                 struct crypto_testsuite_params *ts_params,
10749                 struct crypto_unittest_params *ut_params,
10750                 const struct test_crypto_vector *reference)
10751 {
10752         int retval;
10753
10754         uint8_t *authciphertext, *plaintext, *auth_tag;
10755         uint16_t plaintext_pad_len;
10756         uint8_t cipher_key[reference->cipher_key.len + 1];
10757         uint8_t auth_key[reference->auth_key.len + 1];
10758
10759         /* Verify the capabilities */
10760         struct rte_cryptodev_sym_capability_idx cap_idx;
10761         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10762         cap_idx.algo.auth = reference->auth_algo;
10763         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10764                         &cap_idx) == NULL)
10765                 return -ENOTSUP;
10766         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10767         cap_idx.algo.cipher = reference->crypto_algo;
10768         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10769                         &cap_idx) == NULL)
10770                 return -ENOTSUP;
10771
10772         /* Create session */
10773         memcpy(cipher_key, reference->cipher_key.data,
10774                         reference->cipher_key.len);
10775         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
10776
10777         /* Setup Cipher Parameters */
10778         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10779         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
10780         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10781         ut_params->cipher_xform.cipher.key.data = cipher_key;
10782         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
10783         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10784         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
10785
10786         ut_params->cipher_xform.next = &ut_params->auth_xform;
10787
10788         /* Setup Authentication Parameters */
10789         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10790         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10791         ut_params->auth_xform.auth.algo = reference->auth_algo;
10792         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
10793         ut_params->auth_xform.auth.key.data = auth_key;
10794         ut_params->auth_xform.auth.digest_length = reference->digest.len;
10795         ut_params->auth_xform.next = NULL;
10796
10797         /* Create Crypto session*/
10798         ut_params->sess = rte_cryptodev_sym_session_create(
10799                         ts_params->session_mpool);
10800
10801         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10802                                 ut_params->sess,
10803                                 &ut_params->cipher_xform,
10804                                 ts_params->session_priv_mpool);
10805
10806         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10807
10808         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10809         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10810                         "Failed to allocate input buffer in mempool");
10811
10812         /* clear mbuf payload */
10813         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10814                         rte_pktmbuf_tailroom(ut_params->ibuf));
10815
10816         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10817                         reference->plaintext.len);
10818         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
10819         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
10820
10821         /* Create operation */
10822         retval = create_cipher_auth_operation(ts_params,
10823                         ut_params,
10824                         reference, 0);
10825
10826         if (retval < 0)
10827                 return retval;
10828
10829         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10830                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10831                         ut_params->op);
10832         else
10833                 ut_params->op = process_crypto_request(
10834                         ts_params->valid_devs[0], ut_params->op);
10835
10836         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
10837
10838         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10839                         "crypto op processing failed");
10840
10841         plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
10842
10843         authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10844                         ut_params->op->sym->auth.data.offset);
10845         auth_tag = authciphertext + plaintext_pad_len;
10846         debug_hexdump(stdout, "ciphertext:", authciphertext,
10847                         reference->ciphertext.len);
10848         debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
10849
10850         /* Validate obuf */
10851         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10852                         authciphertext,
10853                         reference->ciphertext.data,
10854                         reference->ciphertext.len,
10855                         "Ciphertext data not as expected");
10856
10857         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10858                         auth_tag,
10859                         reference->digest.data,
10860                         reference->digest.len,
10861                         "Generated digest not as expected");
10862
10863         return TEST_SUCCESS;
10864
10865 }
10866
10867 static int
10868 test_authenticated_decrypt_with_esn(
10869                 struct crypto_testsuite_params *ts_params,
10870                 struct crypto_unittest_params *ut_params,
10871                 const struct test_crypto_vector *reference)
10872 {
10873         int retval;
10874
10875         uint8_t *ciphertext;
10876         uint8_t cipher_key[reference->cipher_key.len + 1];
10877         uint8_t auth_key[reference->auth_key.len + 1];
10878
10879         /* Verify the capabilities */
10880         struct rte_cryptodev_sym_capability_idx cap_idx;
10881         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10882         cap_idx.algo.auth = reference->auth_algo;
10883         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10884                         &cap_idx) == NULL)
10885                 return -ENOTSUP;
10886         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10887         cap_idx.algo.cipher = reference->crypto_algo;
10888         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10889                         &cap_idx) == NULL)
10890                 return -ENOTSUP;
10891
10892         /* Create session */
10893         memcpy(cipher_key, reference->cipher_key.data,
10894                         reference->cipher_key.len);
10895         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
10896
10897         /* Setup Authentication Parameters */
10898         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10899         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
10900         ut_params->auth_xform.auth.algo = reference->auth_algo;
10901         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
10902         ut_params->auth_xform.auth.key.data = auth_key;
10903         ut_params->auth_xform.auth.digest_length = reference->digest.len;
10904         ut_params->auth_xform.next = &ut_params->cipher_xform;
10905
10906         /* Setup Cipher Parameters */
10907         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10908         ut_params->cipher_xform.next = NULL;
10909         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
10910         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
10911         ut_params->cipher_xform.cipher.key.data = cipher_key;
10912         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
10913         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10914         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
10915
10916         /* Create Crypto session*/
10917         ut_params->sess = rte_cryptodev_sym_session_create(
10918                         ts_params->session_mpool);
10919
10920         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10921                                 ut_params->sess,
10922                                 &ut_params->auth_xform,
10923                                 ts_params->session_priv_mpool);
10924
10925         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10926
10927         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10928         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10929                         "Failed to allocate input buffer in mempool");
10930
10931         /* clear mbuf payload */
10932         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10933                         rte_pktmbuf_tailroom(ut_params->ibuf));
10934
10935         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10936                         reference->ciphertext.len);
10937         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
10938         memcpy(ciphertext, reference->ciphertext.data,
10939                         reference->ciphertext.len);
10940
10941         /* Create operation */
10942         retval = create_cipher_auth_verify_operation(ts_params,
10943                         ut_params,
10944                         reference);
10945
10946         if (retval < 0)
10947                 return retval;
10948
10949         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10950                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10951                         ut_params->op);
10952         else
10953                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
10954                         ut_params->op);
10955
10956         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10957         TEST_ASSERT_EQUAL(ut_params->op->status,
10958                         RTE_CRYPTO_OP_STATUS_SUCCESS,
10959                         "crypto op processing passed");
10960
10961         ut_params->obuf = ut_params->op->sym->m_src;
10962         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
10963
10964         return 0;
10965 }
10966
10967 static int
10968 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
10969                 const struct aead_test_data *tdata,
10970                 void *digest_mem, uint64_t digest_phys)
10971 {
10972         struct crypto_testsuite_params *ts_params = &testsuite_params;
10973         struct crypto_unittest_params *ut_params = &unittest_params;
10974
10975         const unsigned int auth_tag_len = tdata->auth_tag.len;
10976         const unsigned int iv_len = tdata->iv.len;
10977         unsigned int aad_len = tdata->aad.len;
10978         unsigned int aad_len_pad = 0;
10979
10980         /* Generate Crypto op data structure */
10981         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10982                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10983         TEST_ASSERT_NOT_NULL(ut_params->op,
10984                 "Failed to allocate symmetric crypto operation struct");
10985
10986         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10987
10988         sym_op->aead.digest.data = digest_mem;
10989
10990         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
10991                         "no room to append digest");
10992
10993         sym_op->aead.digest.phys_addr = digest_phys;
10994
10995         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
10996                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
10997                                 auth_tag_len);
10998                 debug_hexdump(stdout, "digest:",
10999                                 sym_op->aead.digest.data,
11000                                 auth_tag_len);
11001         }
11002
11003         /* Append aad data */
11004         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
11005                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11006                                 uint8_t *, IV_OFFSET);
11007
11008                 /* Copy IV 1 byte after the IV pointer, according to the API */
11009                 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
11010
11011                 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
11012
11013                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
11014                                 ut_params->ibuf, aad_len);
11015                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
11016                                 "no room to prepend aad");
11017                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
11018                                 ut_params->ibuf);
11019
11020                 memset(sym_op->aead.aad.data, 0, aad_len);
11021                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
11022                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
11023
11024                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
11025                 debug_hexdump(stdout, "aad:",
11026                                 sym_op->aead.aad.data, aad_len);
11027         } else {
11028                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11029                                 uint8_t *, IV_OFFSET);
11030
11031                 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
11032
11033                 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
11034
11035                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
11036                                 ut_params->ibuf, aad_len_pad);
11037                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
11038                                 "no room to prepend aad");
11039                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
11040                                 ut_params->ibuf);
11041
11042                 memset(sym_op->aead.aad.data, 0, aad_len);
11043                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
11044
11045                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
11046                 debug_hexdump(stdout, "aad:",
11047                                 sym_op->aead.aad.data, aad_len);
11048         }
11049
11050         sym_op->aead.data.length = tdata->plaintext.len;
11051         sym_op->aead.data.offset = aad_len_pad;
11052
11053         return 0;
11054 }
11055
11056 #define SGL_MAX_NO      16
11057
11058 static int
11059 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
11060                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
11061 {
11062         struct crypto_testsuite_params *ts_params = &testsuite_params;
11063         struct crypto_unittest_params *ut_params = &unittest_params;
11064         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
11065         int retval;
11066         int to_trn = 0;
11067         int to_trn_tbl[SGL_MAX_NO];
11068         int segs = 1;
11069         unsigned int trn_data = 0;
11070         uint8_t *plaintext, *ciphertext, *auth_tag;
11071         struct rte_cryptodev_info dev_info;
11072
11073         /* Verify the capabilities */
11074         struct rte_cryptodev_sym_capability_idx cap_idx;
11075         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11076         cap_idx.algo.aead = tdata->algo;
11077         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11078                         &cap_idx) == NULL)
11079                 return -ENOTSUP;
11080
11081         /* OOP not supported with CPU crypto */
11082         if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11083                 return -ENOTSUP;
11084
11085         /* Detailed check for the particular SGL support flag */
11086         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11087         if (!oop) {
11088                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
11089                 if (sgl_in && (!(dev_info.feature_flags &
11090                                 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
11091                         return -ENOTSUP;
11092         } else {
11093                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
11094                 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
11095                                 tdata->plaintext.len;
11096                 if (sgl_in && !sgl_out) {
11097                         if (!(dev_info.feature_flags &
11098                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
11099                                 return -ENOTSUP;
11100                 } else if (!sgl_in && sgl_out) {
11101                         if (!(dev_info.feature_flags &
11102                                         RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
11103                                 return -ENOTSUP;
11104                 } else if (sgl_in && sgl_out) {
11105                         if (!(dev_info.feature_flags &
11106                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
11107                                 return -ENOTSUP;
11108                 }
11109         }
11110
11111         if (fragsz > tdata->plaintext.len)
11112                 fragsz = tdata->plaintext.len;
11113
11114         uint16_t plaintext_len = fragsz;
11115         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
11116
11117         if (fragsz_oop > tdata->plaintext.len)
11118                 frag_size_oop = tdata->plaintext.len;
11119
11120         int ecx = 0;
11121         void *digest_mem = NULL;
11122
11123         uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
11124
11125         if (tdata->plaintext.len % fragsz != 0) {
11126                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
11127                         return 1;
11128         }       else {
11129                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
11130                         return 1;
11131         }
11132
11133         /*
11134          * For out-op-place we need to alloc another mbuf
11135          */
11136         if (oop) {
11137                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11138                 rte_pktmbuf_append(ut_params->obuf,
11139                                 frag_size_oop + prepend_len);
11140                 buf_oop = ut_params->obuf;
11141         }
11142
11143         /* Create AEAD session */
11144         retval = create_aead_session(ts_params->valid_devs[0],
11145                         tdata->algo,
11146                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
11147                         tdata->key.data, tdata->key.len,
11148                         tdata->aad.len, tdata->auth_tag.len,
11149                         tdata->iv.len);
11150         if (retval < 0)
11151                 return retval;
11152
11153         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11154
11155         /* clear mbuf payload */
11156         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11157                         rte_pktmbuf_tailroom(ut_params->ibuf));
11158
11159         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11160                         plaintext_len);
11161
11162         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
11163
11164         trn_data += plaintext_len;
11165
11166         buf = ut_params->ibuf;
11167
11168         /*
11169          * Loop until no more fragments
11170          */
11171
11172         while (trn_data < tdata->plaintext.len) {
11173                 ++segs;
11174                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
11175                                 (tdata->plaintext.len - trn_data) : fragsz;
11176
11177                 to_trn_tbl[ecx++] = to_trn;
11178
11179                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11180                 buf = buf->next;
11181
11182                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
11183                                 rte_pktmbuf_tailroom(buf));
11184
11185                 /* OOP */
11186                 if (oop && !fragsz_oop) {
11187                         buf_last_oop = buf_oop->next =
11188                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
11189                         buf_oop = buf_oop->next;
11190                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
11191                                         0, rte_pktmbuf_tailroom(buf_oop));
11192                         rte_pktmbuf_append(buf_oop, to_trn);
11193                 }
11194
11195                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
11196                                 to_trn);
11197
11198                 memcpy(plaintext, tdata->plaintext.data + trn_data,
11199                                 to_trn);
11200                 trn_data += to_trn;
11201                 if (trn_data  == tdata->plaintext.len) {
11202                         if (oop) {
11203                                 if (!fragsz_oop)
11204                                         digest_mem = rte_pktmbuf_append(buf_oop,
11205                                                 tdata->auth_tag.len);
11206                         } else
11207                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
11208                                         tdata->auth_tag.len);
11209                 }
11210         }
11211
11212         uint64_t digest_phys = 0;
11213
11214         ut_params->ibuf->nb_segs = segs;
11215
11216         segs = 1;
11217         if (fragsz_oop && oop) {
11218                 to_trn = 0;
11219                 ecx = 0;
11220
11221                 if (frag_size_oop == tdata->plaintext.len) {
11222                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
11223                                 tdata->auth_tag.len);
11224
11225                         digest_phys = rte_pktmbuf_iova_offset(
11226                                         ut_params->obuf,
11227                                         tdata->plaintext.len + prepend_len);
11228                 }
11229
11230                 trn_data = frag_size_oop;
11231                 while (trn_data < tdata->plaintext.len) {
11232                         ++segs;
11233                         to_trn =
11234                                 (tdata->plaintext.len - trn_data <
11235                                                 frag_size_oop) ?
11236                                 (tdata->plaintext.len - trn_data) :
11237                                                 frag_size_oop;
11238
11239                         to_trn_tbl[ecx++] = to_trn;
11240
11241                         buf_last_oop = buf_oop->next =
11242                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
11243                         buf_oop = buf_oop->next;
11244                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
11245                                         0, rte_pktmbuf_tailroom(buf_oop));
11246                         rte_pktmbuf_append(buf_oop, to_trn);
11247
11248                         trn_data += to_trn;
11249
11250                         if (trn_data  == tdata->plaintext.len) {
11251                                 digest_mem = rte_pktmbuf_append(buf_oop,
11252                                         tdata->auth_tag.len);
11253                         }
11254                 }
11255
11256                 ut_params->obuf->nb_segs = segs;
11257         }
11258
11259         /*
11260          * Place digest at the end of the last buffer
11261          */
11262         if (!digest_phys)
11263                 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
11264         if (oop && buf_last_oop)
11265                 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
11266
11267         if (!digest_mem && !oop) {
11268                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11269                                 + tdata->auth_tag.len);
11270                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
11271                                 tdata->plaintext.len);
11272         }
11273
11274         /* Create AEAD operation */
11275         retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
11276                         tdata, digest_mem, digest_phys);
11277
11278         if (retval < 0)
11279                 return retval;
11280
11281         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11282
11283         ut_params->op->sym->m_src = ut_params->ibuf;
11284         if (oop)
11285                 ut_params->op->sym->m_dst = ut_params->obuf;
11286
11287         /* Process crypto operation */
11288         if (oop == IN_PLACE &&
11289                         gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11290                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
11291         else
11292                 TEST_ASSERT_NOT_NULL(
11293                         process_crypto_request(ts_params->valid_devs[0],
11294                         ut_params->op), "failed to process sym crypto op");
11295
11296         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11297                         "crypto op processing failed");
11298
11299
11300         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
11301                         uint8_t *, prepend_len);
11302         if (oop) {
11303                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11304                                 uint8_t *, prepend_len);
11305         }
11306
11307         if (fragsz_oop)
11308                 fragsz = fragsz_oop;
11309
11310         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11311                         ciphertext,
11312                         tdata->ciphertext.data,
11313                         fragsz,
11314                         "Ciphertext data not as expected");
11315
11316         buf = ut_params->op->sym->m_src->next;
11317         if (oop)
11318                 buf = ut_params->op->sym->m_dst->next;
11319
11320         unsigned int off = fragsz;
11321
11322         ecx = 0;
11323         while (buf) {
11324                 ciphertext = rte_pktmbuf_mtod(buf,
11325                                 uint8_t *);
11326
11327                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
11328                                 ciphertext,
11329                                 tdata->ciphertext.data + off,
11330                                 to_trn_tbl[ecx],
11331                                 "Ciphertext data not as expected");
11332
11333                 off += to_trn_tbl[ecx++];
11334                 buf = buf->next;
11335         }
11336
11337         auth_tag = digest_mem;
11338         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11339                         auth_tag,
11340                         tdata->auth_tag.data,
11341                         tdata->auth_tag.len,
11342                         "Generated auth tag not as expected");
11343
11344         return 0;
11345 }
11346
11347 static int
11348 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
11349 {
11350         return test_authenticated_encryption_SGL(
11351                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
11352 }
11353
11354 static int
11355 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
11356 {
11357         return test_authenticated_encryption_SGL(
11358                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
11359 }
11360
11361 static int
11362 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
11363 {
11364         return test_authenticated_encryption_SGL(
11365                         &gcm_test_case_8, OUT_OF_PLACE, 400,
11366                         gcm_test_case_8.plaintext.len);
11367 }
11368
11369 static int
11370 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
11371 {
11372         /* This test is not for OPENSSL PMD */
11373         if (gbl_driver_id == rte_cryptodev_driver_id_get(
11374                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
11375                 return -ENOTSUP;
11376
11377         return test_authenticated_encryption_SGL(
11378                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
11379 }
11380
11381 static int
11382 test_authentication_verify_fail_when_data_corrupted(
11383                 struct crypto_testsuite_params *ts_params,
11384                 struct crypto_unittest_params *ut_params,
11385                 const struct test_crypto_vector *reference)
11386 {
11387         return test_authentication_verify_fail_when_data_corruption(
11388                         ts_params, ut_params, reference, 1);
11389 }
11390
11391 static int
11392 test_authentication_verify_fail_when_tag_corrupted(
11393                 struct crypto_testsuite_params *ts_params,
11394                 struct crypto_unittest_params *ut_params,
11395                 const struct test_crypto_vector *reference)
11396 {
11397         return test_authentication_verify_fail_when_data_corruption(
11398                         ts_params, ut_params, reference, 0);
11399 }
11400
11401 static int
11402 test_authentication_verify_GMAC_fail_when_data_corrupted(
11403                 struct crypto_testsuite_params *ts_params,
11404                 struct crypto_unittest_params *ut_params,
11405                 const struct test_crypto_vector *reference)
11406 {
11407         return test_authentication_verify_GMAC_fail_when_corruption(
11408                         ts_params, ut_params, reference, 1);
11409 }
11410
11411 static int
11412 test_authentication_verify_GMAC_fail_when_tag_corrupted(
11413                 struct crypto_testsuite_params *ts_params,
11414                 struct crypto_unittest_params *ut_params,
11415                 const struct test_crypto_vector *reference)
11416 {
11417         return test_authentication_verify_GMAC_fail_when_corruption(
11418                         ts_params, ut_params, reference, 0);
11419 }
11420
11421 static int
11422 test_authenticated_decryption_fail_when_data_corrupted(
11423                 struct crypto_testsuite_params *ts_params,
11424                 struct crypto_unittest_params *ut_params,
11425                 const struct test_crypto_vector *reference)
11426 {
11427         return test_authenticated_decryption_fail_when_corruption(
11428                         ts_params, ut_params, reference, 1);
11429 }
11430
11431 static int
11432 test_authenticated_decryption_fail_when_tag_corrupted(
11433                 struct crypto_testsuite_params *ts_params,
11434                 struct crypto_unittest_params *ut_params,
11435                 const struct test_crypto_vector *reference)
11436 {
11437         return test_authenticated_decryption_fail_when_corruption(
11438                         ts_params, ut_params, reference, 0);
11439 }
11440
11441 static int
11442 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
11443 {
11444         return test_authentication_verify_fail_when_data_corrupted(
11445                         &testsuite_params, &unittest_params,
11446                         &hmac_sha1_test_crypto_vector);
11447 }
11448
11449 static int
11450 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
11451 {
11452         return test_authentication_verify_fail_when_tag_corrupted(
11453                         &testsuite_params, &unittest_params,
11454                         &hmac_sha1_test_crypto_vector);
11455 }
11456
11457 static int
11458 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
11459 {
11460         return test_authentication_verify_GMAC_fail_when_data_corrupted(
11461                         &testsuite_params, &unittest_params,
11462                         &aes128_gmac_test_vector);
11463 }
11464
11465 static int
11466 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
11467 {
11468         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
11469                         &testsuite_params, &unittest_params,
11470                         &aes128_gmac_test_vector);
11471 }
11472
11473 static int
11474 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
11475 {
11476         return test_authenticated_decryption_fail_when_data_corrupted(
11477                         &testsuite_params,
11478                         &unittest_params,
11479                         &aes128cbc_hmac_sha1_test_vector);
11480 }
11481
11482 static int
11483 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
11484 {
11485         return test_authenticated_decryption_fail_when_tag_corrupted(
11486                         &testsuite_params,
11487                         &unittest_params,
11488                         &aes128cbc_hmac_sha1_test_vector);
11489 }
11490
11491 static int
11492 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
11493 {
11494         return test_authenticated_encryt_with_esn(
11495                         &testsuite_params,
11496                         &unittest_params,
11497                         &aes128cbc_hmac_sha1_aad_test_vector);
11498 }
11499
11500 static int
11501 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
11502 {
11503         return test_authenticated_decrypt_with_esn(
11504                         &testsuite_params,
11505                         &unittest_params,
11506                         &aes128cbc_hmac_sha1_aad_test_vector);
11507 }
11508
11509 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
11510
11511 /* global AESNI slave IDs for the scheduler test */
11512 uint8_t aesni_ids[2];
11513
11514 static int
11515 test_scheduler_attach_slave_op(void)
11516 {
11517         struct crypto_testsuite_params *ts_params = &testsuite_params;
11518         uint8_t sched_id = ts_params->valid_devs[0];
11519         uint32_t nb_devs, i, nb_devs_attached = 0;
11520         int ret;
11521         char vdev_name[32];
11522
11523         /* create 2 AESNI_MB if necessary */
11524         nb_devs = rte_cryptodev_device_count_by_driver(
11525                         rte_cryptodev_driver_id_get(
11526                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
11527         if (nb_devs < 2) {
11528                 for (i = nb_devs; i < 2; i++) {
11529                         snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
11530                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
11531                                         i);
11532                         ret = rte_vdev_init(vdev_name, NULL);
11533
11534                         TEST_ASSERT(ret == 0,
11535                                 "Failed to create instance %u of"
11536                                 " pmd : %s",
11537                                 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
11538                 }
11539         }
11540
11541         /* attach 2 AESNI_MB cdevs */
11542         for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
11543                         i++) {
11544                 struct rte_cryptodev_info info;
11545                 unsigned int session_size;
11546
11547                 rte_cryptodev_info_get(i, &info);
11548                 if (info.driver_id != rte_cryptodev_driver_id_get(
11549                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
11550                         continue;
11551
11552                 session_size = rte_cryptodev_sym_get_private_session_size(i);
11553                 /*
11554                  * Create the session mempool again, since now there are new devices
11555                  * to use the mempool.
11556                  */
11557                 if (ts_params->session_mpool) {
11558                         rte_mempool_free(ts_params->session_mpool);
11559                         ts_params->session_mpool = NULL;
11560                 }
11561                 if (ts_params->session_priv_mpool) {
11562                         rte_mempool_free(ts_params->session_priv_mpool);
11563                         ts_params->session_priv_mpool = NULL;
11564                 }
11565
11566                 if (info.sym.max_nb_sessions != 0 &&
11567                                 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
11568                         RTE_LOG(ERR, USER1,
11569                                         "Device does not support "
11570                                         "at least %u sessions\n",
11571                                         MAX_NB_SESSIONS);
11572                         return TEST_FAILED;
11573                 }
11574                 /*
11575                  * Create mempool with maximum number of sessions,
11576                  * to include the session headers
11577                  */
11578                 if (ts_params->session_mpool == NULL) {
11579                         ts_params->session_mpool =
11580                                 rte_cryptodev_sym_session_pool_create(
11581                                                 "test_sess_mp",
11582                                                 MAX_NB_SESSIONS, 0, 0, 0,
11583                                                 SOCKET_ID_ANY);
11584                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
11585                                         "session mempool allocation failed");
11586                 }
11587
11588                 /*
11589                  * Create mempool with maximum number of sessions,
11590                  * to include device specific session private data
11591                  */
11592                 if (ts_params->session_priv_mpool == NULL) {
11593                         ts_params->session_priv_mpool = rte_mempool_create(
11594                                         "test_sess_mp_priv",
11595                                         MAX_NB_SESSIONS,
11596                                         session_size,
11597                                         0, 0, NULL, NULL, NULL,
11598                                         NULL, SOCKET_ID_ANY,
11599                                         0);
11600
11601                         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
11602                                         "session mempool allocation failed");
11603                 }
11604
11605                 ts_params->qp_conf.mp_session = ts_params->session_mpool;
11606                 ts_params->qp_conf.mp_session_private =
11607                                 ts_params->session_priv_mpool;
11608
11609                 ret = rte_cryptodev_scheduler_slave_attach(sched_id,
11610                                 (uint8_t)i);
11611
11612                 TEST_ASSERT(ret == 0,
11613                         "Failed to attach device %u of pmd : %s", i,
11614                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
11615
11616                 aesni_ids[nb_devs_attached] = (uint8_t)i;
11617
11618                 nb_devs_attached++;
11619         }
11620
11621         return 0;
11622 }
11623
11624 static int
11625 test_scheduler_detach_slave_op(void)
11626 {
11627         struct crypto_testsuite_params *ts_params = &testsuite_params;
11628         uint8_t sched_id = ts_params->valid_devs[0];
11629         uint32_t i;
11630         int ret;
11631
11632         for (i = 0; i < 2; i++) {
11633                 ret = rte_cryptodev_scheduler_slave_detach(sched_id,
11634                                 aesni_ids[i]);
11635                 TEST_ASSERT(ret == 0,
11636                         "Failed to detach device %u", aesni_ids[i]);
11637         }
11638
11639         return 0;
11640 }
11641
11642 static int
11643 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
11644 {
11645         struct crypto_testsuite_params *ts_params = &testsuite_params;
11646         uint8_t sched_id = ts_params->valid_devs[0];
11647         /* set mode */
11648         return rte_cryptodev_scheduler_mode_set(sched_id,
11649                 scheduler_mode);
11650 }
11651
11652 static int
11653 test_scheduler_mode_roundrobin_op(void)
11654 {
11655         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
11656                         0, "Failed to set roundrobin mode");
11657         return 0;
11658
11659 }
11660
11661 static int
11662 test_scheduler_mode_multicore_op(void)
11663 {
11664         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
11665                         0, "Failed to set multicore mode");
11666
11667         return 0;
11668 }
11669
11670 static int
11671 test_scheduler_mode_failover_op(void)
11672 {
11673         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
11674                         0, "Failed to set failover mode");
11675
11676         return 0;
11677 }
11678
11679 static int
11680 test_scheduler_mode_pkt_size_distr_op(void)
11681 {
11682         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
11683                         0, "Failed to set pktsize mode");
11684
11685         return 0;
11686 }
11687
11688 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
11689         .suite_name = "Crypto Device Scheduler Unit Test Suite",
11690         .setup = testsuite_setup,
11691         .teardown = testsuite_teardown,
11692         .unit_test_cases = {
11693                 /* Multi Core */
11694                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
11695                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),
11696                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
11697                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
11698                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
11699                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
11700
11701                 /* Round Robin */
11702                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
11703                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),
11704                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
11705                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
11706                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
11707                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
11708
11709                 /* Fail over */
11710                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
11711                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),
11712                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
11713                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
11714                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
11715                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
11716
11717                 /* PKT SIZE */
11718                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
11719                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),
11720                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
11721                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
11722                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
11723                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
11724
11725                 TEST_CASES_END() /**< NULL terminate unit test array */
11726         }
11727 };
11728
11729 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
11730
11731 static struct unit_test_suite cryptodev_testsuite  = {
11732         .suite_name = "Crypto Unit Test Suite",
11733         .setup = testsuite_setup,
11734         .teardown = testsuite_teardown,
11735         .unit_test_cases = {
11736                 TEST_CASE_ST(ut_setup, ut_teardown,
11737                                 test_device_configure_invalid_dev_id),
11738                 TEST_CASE_ST(ut_setup, ut_teardown,
11739                                 test_device_configure_invalid_queue_pair_ids),
11740                 TEST_CASE_ST(ut_setup, ut_teardown,
11741                                 test_queue_pair_descriptor_setup),
11742
11743                 TEST_CASE_ST(ut_setup, ut_teardown,
11744                                 test_multi_session),
11745                 TEST_CASE_ST(ut_setup, ut_teardown,
11746                                 test_multi_session_random_usage),
11747
11748                 TEST_CASE_ST(ut_setup, ut_teardown,
11749                         test_null_invalid_operation),
11750                 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
11751
11752                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
11753                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
11754                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
11755                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
11756                 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all),
11757                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all),
11758                 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all),
11759                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
11760                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
11761
11762                 /** AES CCM Authenticated Encryption 128 bits key */
11763                 TEST_CASE_ST(ut_setup, ut_teardown,
11764                         test_AES_CCM_authenticated_encryption_test_case_128_1),
11765                 TEST_CASE_ST(ut_setup, ut_teardown,
11766                         test_AES_CCM_authenticated_encryption_test_case_128_2),
11767                 TEST_CASE_ST(ut_setup, ut_teardown,
11768                         test_AES_CCM_authenticated_encryption_test_case_128_3),
11769
11770                 /** AES CCM Authenticated Decryption 128 bits key*/
11771                 TEST_CASE_ST(ut_setup, ut_teardown,
11772                         test_AES_CCM_authenticated_decryption_test_case_128_1),
11773                 TEST_CASE_ST(ut_setup, ut_teardown,
11774                         test_AES_CCM_authenticated_decryption_test_case_128_2),
11775                 TEST_CASE_ST(ut_setup, ut_teardown,
11776                         test_AES_CCM_authenticated_decryption_test_case_128_3),
11777
11778                 /** AES CCM Authenticated Encryption 192 bits key */
11779                 TEST_CASE_ST(ut_setup, ut_teardown,
11780                         test_AES_CCM_authenticated_encryption_test_case_192_1),
11781                 TEST_CASE_ST(ut_setup, ut_teardown,
11782                         test_AES_CCM_authenticated_encryption_test_case_192_2),
11783                 TEST_CASE_ST(ut_setup, ut_teardown,
11784                         test_AES_CCM_authenticated_encryption_test_case_192_3),
11785
11786                 /** AES CCM Authenticated Decryption 192 bits key*/
11787                 TEST_CASE_ST(ut_setup, ut_teardown,
11788                         test_AES_CCM_authenticated_decryption_test_case_192_1),
11789                 TEST_CASE_ST(ut_setup, ut_teardown,
11790                         test_AES_CCM_authenticated_decryption_test_case_192_2),
11791                 TEST_CASE_ST(ut_setup, ut_teardown,
11792                         test_AES_CCM_authenticated_decryption_test_case_192_3),
11793
11794                 /** AES CCM Authenticated Encryption 256 bits key */
11795                 TEST_CASE_ST(ut_setup, ut_teardown,
11796                         test_AES_CCM_authenticated_encryption_test_case_256_1),
11797                 TEST_CASE_ST(ut_setup, ut_teardown,
11798                         test_AES_CCM_authenticated_encryption_test_case_256_2),
11799                 TEST_CASE_ST(ut_setup, ut_teardown,
11800                         test_AES_CCM_authenticated_encryption_test_case_256_3),
11801
11802                 /** AES CCM Authenticated Decryption 256 bits key*/
11803                 TEST_CASE_ST(ut_setup, ut_teardown,
11804                         test_AES_CCM_authenticated_decryption_test_case_256_1),
11805                 TEST_CASE_ST(ut_setup, ut_teardown,
11806                         test_AES_CCM_authenticated_decryption_test_case_256_2),
11807                 TEST_CASE_ST(ut_setup, ut_teardown,
11808                         test_AES_CCM_authenticated_decryption_test_case_256_3),
11809
11810                 /** AES GCM Authenticated Encryption */
11811                 TEST_CASE_ST(ut_setup, ut_teardown,
11812                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
11813                 TEST_CASE_ST(ut_setup, ut_teardown,
11814                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
11815                 TEST_CASE_ST(ut_setup, ut_teardown,
11816                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
11817                 TEST_CASE_ST(ut_setup, ut_teardown,
11818                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
11819                 TEST_CASE_ST(ut_setup, ut_teardown,
11820                         test_AES_GCM_authenticated_encryption_test_case_1),
11821                 TEST_CASE_ST(ut_setup, ut_teardown,
11822                         test_AES_GCM_authenticated_encryption_test_case_2),
11823                 TEST_CASE_ST(ut_setup, ut_teardown,
11824                         test_AES_GCM_authenticated_encryption_test_case_3),
11825                 TEST_CASE_ST(ut_setup, ut_teardown,
11826                         test_AES_GCM_authenticated_encryption_test_case_4),
11827                 TEST_CASE_ST(ut_setup, ut_teardown,
11828                         test_AES_GCM_authenticated_encryption_test_case_5),
11829                 TEST_CASE_ST(ut_setup, ut_teardown,
11830                         test_AES_GCM_authenticated_encryption_test_case_6),
11831                 TEST_CASE_ST(ut_setup, ut_teardown,
11832                         test_AES_GCM_authenticated_encryption_test_case_7),
11833                 TEST_CASE_ST(ut_setup, ut_teardown,
11834                         test_AES_GCM_authenticated_encryption_test_case_8),
11835                 TEST_CASE_ST(ut_setup, ut_teardown,
11836                         test_AES_GCM_J0_authenticated_encryption_test_case_1),
11837
11838                 /** AES GCM Authenticated Decryption */
11839                 TEST_CASE_ST(ut_setup, ut_teardown,
11840                         test_AES_GCM_authenticated_decryption_test_case_1),
11841                 TEST_CASE_ST(ut_setup, ut_teardown,
11842                         test_AES_GCM_authenticated_decryption_test_case_2),
11843                 TEST_CASE_ST(ut_setup, ut_teardown,
11844                         test_AES_GCM_authenticated_decryption_test_case_3),
11845                 TEST_CASE_ST(ut_setup, ut_teardown,
11846                         test_AES_GCM_authenticated_decryption_test_case_4),
11847                 TEST_CASE_ST(ut_setup, ut_teardown,
11848                         test_AES_GCM_authenticated_decryption_test_case_5),
11849                 TEST_CASE_ST(ut_setup, ut_teardown,
11850                         test_AES_GCM_authenticated_decryption_test_case_6),
11851                 TEST_CASE_ST(ut_setup, ut_teardown,
11852                         test_AES_GCM_authenticated_decryption_test_case_7),
11853                 TEST_CASE_ST(ut_setup, ut_teardown,
11854                         test_AES_GCM_authenticated_decryption_test_case_8),
11855                 TEST_CASE_ST(ut_setup, ut_teardown,
11856                         test_AES_GCM_J0_authenticated_decryption_test_case_1),
11857
11858                 /** AES GCM Authenticated Encryption 192 bits key */
11859                 TEST_CASE_ST(ut_setup, ut_teardown,
11860                         test_AES_GCM_auth_encryption_test_case_192_1),
11861                 TEST_CASE_ST(ut_setup, ut_teardown,
11862                         test_AES_GCM_auth_encryption_test_case_192_2),
11863                 TEST_CASE_ST(ut_setup, ut_teardown,
11864                         test_AES_GCM_auth_encryption_test_case_192_3),
11865                 TEST_CASE_ST(ut_setup, ut_teardown,
11866                         test_AES_GCM_auth_encryption_test_case_192_4),
11867                 TEST_CASE_ST(ut_setup, ut_teardown,
11868                         test_AES_GCM_auth_encryption_test_case_192_5),
11869                 TEST_CASE_ST(ut_setup, ut_teardown,
11870                         test_AES_GCM_auth_encryption_test_case_192_6),
11871                 TEST_CASE_ST(ut_setup, ut_teardown,
11872                         test_AES_GCM_auth_encryption_test_case_192_7),
11873
11874                 /** AES GCM Authenticated Decryption 192 bits key */
11875                 TEST_CASE_ST(ut_setup, ut_teardown,
11876                         test_AES_GCM_auth_decryption_test_case_192_1),
11877                 TEST_CASE_ST(ut_setup, ut_teardown,
11878                         test_AES_GCM_auth_decryption_test_case_192_2),
11879                 TEST_CASE_ST(ut_setup, ut_teardown,
11880                         test_AES_GCM_auth_decryption_test_case_192_3),
11881                 TEST_CASE_ST(ut_setup, ut_teardown,
11882                         test_AES_GCM_auth_decryption_test_case_192_4),
11883                 TEST_CASE_ST(ut_setup, ut_teardown,
11884                         test_AES_GCM_auth_decryption_test_case_192_5),
11885                 TEST_CASE_ST(ut_setup, ut_teardown,
11886                         test_AES_GCM_auth_decryption_test_case_192_6),
11887                 TEST_CASE_ST(ut_setup, ut_teardown,
11888                         test_AES_GCM_auth_decryption_test_case_192_7),
11889
11890                 /** AES GCM Authenticated Encryption 256 bits key */
11891                 TEST_CASE_ST(ut_setup, ut_teardown,
11892                         test_AES_GCM_auth_encryption_test_case_256_1),
11893                 TEST_CASE_ST(ut_setup, ut_teardown,
11894                         test_AES_GCM_auth_encryption_test_case_256_2),
11895                 TEST_CASE_ST(ut_setup, ut_teardown,
11896                         test_AES_GCM_auth_encryption_test_case_256_3),
11897                 TEST_CASE_ST(ut_setup, ut_teardown,
11898                         test_AES_GCM_auth_encryption_test_case_256_4),
11899                 TEST_CASE_ST(ut_setup, ut_teardown,
11900                         test_AES_GCM_auth_encryption_test_case_256_5),
11901                 TEST_CASE_ST(ut_setup, ut_teardown,
11902                         test_AES_GCM_auth_encryption_test_case_256_6),
11903                 TEST_CASE_ST(ut_setup, ut_teardown,
11904                         test_AES_GCM_auth_encryption_test_case_256_7),
11905
11906                 /** AES GCM Authenticated Decryption 256 bits key */
11907                 TEST_CASE_ST(ut_setup, ut_teardown,
11908                         test_AES_GCM_auth_decryption_test_case_256_1),
11909                 TEST_CASE_ST(ut_setup, ut_teardown,
11910                         test_AES_GCM_auth_decryption_test_case_256_2),
11911                 TEST_CASE_ST(ut_setup, ut_teardown,
11912                         test_AES_GCM_auth_decryption_test_case_256_3),
11913                 TEST_CASE_ST(ut_setup, ut_teardown,
11914                         test_AES_GCM_auth_decryption_test_case_256_4),
11915                 TEST_CASE_ST(ut_setup, ut_teardown,
11916                         test_AES_GCM_auth_decryption_test_case_256_5),
11917                 TEST_CASE_ST(ut_setup, ut_teardown,
11918                         test_AES_GCM_auth_decryption_test_case_256_6),
11919                 TEST_CASE_ST(ut_setup, ut_teardown,
11920                         test_AES_GCM_auth_decryption_test_case_256_7),
11921
11922                 /** AES GCM Authenticated Encryption big aad size */
11923                 TEST_CASE_ST(ut_setup, ut_teardown,
11924                         test_AES_GCM_auth_encryption_test_case_aad_1),
11925                 TEST_CASE_ST(ut_setup, ut_teardown,
11926                         test_AES_GCM_auth_encryption_test_case_aad_2),
11927
11928                 /** AES GCM Authenticated Decryption big aad size */
11929                 TEST_CASE_ST(ut_setup, ut_teardown,
11930                         test_AES_GCM_auth_decryption_test_case_aad_1),
11931                 TEST_CASE_ST(ut_setup, ut_teardown,
11932                         test_AES_GCM_auth_decryption_test_case_aad_2),
11933
11934                 /** Out of place tests */
11935                 TEST_CASE_ST(ut_setup, ut_teardown,
11936                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
11937                 TEST_CASE_ST(ut_setup, ut_teardown,
11938                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
11939
11940                 /** Session-less tests */
11941                 TEST_CASE_ST(ut_setup, ut_teardown,
11942                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
11943                 TEST_CASE_ST(ut_setup, ut_teardown,
11944                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
11945
11946                 /** AES GMAC Authentication */
11947                 TEST_CASE_ST(ut_setup, ut_teardown,
11948                         test_AES_GMAC_authentication_test_case_1),
11949                 TEST_CASE_ST(ut_setup, ut_teardown,
11950                         test_AES_GMAC_authentication_verify_test_case_1),
11951                 TEST_CASE_ST(ut_setup, ut_teardown,
11952                         test_AES_GMAC_authentication_test_case_2),
11953                 TEST_CASE_ST(ut_setup, ut_teardown,
11954                         test_AES_GMAC_authentication_verify_test_case_2),
11955                 TEST_CASE_ST(ut_setup, ut_teardown,
11956                         test_AES_GMAC_authentication_test_case_3),
11957                 TEST_CASE_ST(ut_setup, ut_teardown,
11958                         test_AES_GMAC_authentication_verify_test_case_3),
11959                 TEST_CASE_ST(ut_setup, ut_teardown,
11960                         test_AES_GMAC_authentication_test_case_4),
11961                 TEST_CASE_ST(ut_setup, ut_teardown,
11962                         test_AES_GMAC_authentication_verify_test_case_4),
11963
11964                 /** SNOW 3G encrypt only (UEA2) */
11965                 TEST_CASE_ST(ut_setup, ut_teardown,
11966                         test_snow3g_encryption_test_case_1),
11967                 TEST_CASE_ST(ut_setup, ut_teardown,
11968                         test_snow3g_encryption_test_case_2),
11969                 TEST_CASE_ST(ut_setup, ut_teardown,
11970                         test_snow3g_encryption_test_case_3),
11971                 TEST_CASE_ST(ut_setup, ut_teardown,
11972                         test_snow3g_encryption_test_case_4),
11973                 TEST_CASE_ST(ut_setup, ut_teardown,
11974                         test_snow3g_encryption_test_case_5),
11975
11976                 TEST_CASE_ST(ut_setup, ut_teardown,
11977                         test_snow3g_encryption_test_case_1_oop),
11978                 TEST_CASE_ST(ut_setup, ut_teardown,
11979                         test_snow3g_encryption_test_case_1_oop_sgl),
11980                 TEST_CASE_ST(ut_setup, ut_teardown,
11981                         test_snow3g_encryption_test_case_1_offset_oop),
11982                 TEST_CASE_ST(ut_setup, ut_teardown,
11983                         test_snow3g_decryption_test_case_1_oop),
11984
11985                 /** SNOW 3G generate auth, then encrypt (UEA2) */
11986                 TEST_CASE_ST(ut_setup, ut_teardown,
11987                         test_snow3g_auth_cipher_test_case_1),
11988                 TEST_CASE_ST(ut_setup, ut_teardown,
11989                         test_snow3g_auth_cipher_test_case_2),
11990                 TEST_CASE_ST(ut_setup, ut_teardown,
11991                         test_snow3g_auth_cipher_test_case_2_oop),
11992                 TEST_CASE_ST(ut_setup, ut_teardown,
11993                         test_snow3g_auth_cipher_part_digest_enc),
11994                 TEST_CASE_ST(ut_setup, ut_teardown,
11995                         test_snow3g_auth_cipher_part_digest_enc_oop),
11996                 TEST_CASE_ST(ut_setup, ut_teardown,
11997                         test_snow3g_auth_cipher_test_case_3_sgl),
11998                 TEST_CASE_ST(ut_setup, ut_teardown,
11999                         test_snow3g_auth_cipher_test_case_3_oop_sgl),
12000                 TEST_CASE_ST(ut_setup, ut_teardown,
12001                         test_snow3g_auth_cipher_part_digest_enc_sgl),
12002                 TEST_CASE_ST(ut_setup, ut_teardown,
12003                         test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
12004
12005                 /** SNOW 3G decrypt (UEA2), then verify auth */
12006                 TEST_CASE_ST(ut_setup, ut_teardown,
12007                         test_snow3g_auth_cipher_verify_test_case_1),
12008                 TEST_CASE_ST(ut_setup, ut_teardown,
12009                         test_snow3g_auth_cipher_verify_test_case_2),
12010                 TEST_CASE_ST(ut_setup, ut_teardown,
12011                         test_snow3g_auth_cipher_verify_test_case_2_oop),
12012                 TEST_CASE_ST(ut_setup, ut_teardown,
12013                         test_snow3g_auth_cipher_verify_part_digest_enc),
12014                 TEST_CASE_ST(ut_setup, ut_teardown,
12015                         test_snow3g_auth_cipher_verify_part_digest_enc_oop),
12016                 TEST_CASE_ST(ut_setup, ut_teardown,
12017                         test_snow3g_auth_cipher_verify_test_case_3_sgl),
12018                 TEST_CASE_ST(ut_setup, ut_teardown,
12019                         test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
12020                 TEST_CASE_ST(ut_setup, ut_teardown,
12021                         test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
12022                 TEST_CASE_ST(ut_setup, ut_teardown,
12023                         test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
12024
12025                 /** SNOW 3G decrypt only (UEA2) */
12026                 TEST_CASE_ST(ut_setup, ut_teardown,
12027                         test_snow3g_decryption_test_case_1),
12028                 TEST_CASE_ST(ut_setup, ut_teardown,
12029                         test_snow3g_decryption_test_case_2),
12030                 TEST_CASE_ST(ut_setup, ut_teardown,
12031                         test_snow3g_decryption_test_case_3),
12032                 TEST_CASE_ST(ut_setup, ut_teardown,
12033                         test_snow3g_decryption_test_case_4),
12034                 TEST_CASE_ST(ut_setup, ut_teardown,
12035                         test_snow3g_decryption_test_case_5),
12036                 TEST_CASE_ST(ut_setup, ut_teardown,
12037                         test_snow3g_decryption_with_digest_test_case_1),
12038                 TEST_CASE_ST(ut_setup, ut_teardown,
12039                         test_snow3g_hash_generate_test_case_1),
12040                 TEST_CASE_ST(ut_setup, ut_teardown,
12041                         test_snow3g_hash_generate_test_case_2),
12042                 TEST_CASE_ST(ut_setup, ut_teardown,
12043                         test_snow3g_hash_generate_test_case_3),
12044                 /* Tests with buffers which length is not byte-aligned */
12045                 TEST_CASE_ST(ut_setup, ut_teardown,
12046                         test_snow3g_hash_generate_test_case_4),
12047                 TEST_CASE_ST(ut_setup, ut_teardown,
12048                         test_snow3g_hash_generate_test_case_5),
12049                 TEST_CASE_ST(ut_setup, ut_teardown,
12050                         test_snow3g_hash_generate_test_case_6),
12051                 TEST_CASE_ST(ut_setup, ut_teardown,
12052                         test_snow3g_hash_verify_test_case_1),
12053                 TEST_CASE_ST(ut_setup, ut_teardown,
12054                         test_snow3g_hash_verify_test_case_2),
12055                 TEST_CASE_ST(ut_setup, ut_teardown,
12056                         test_snow3g_hash_verify_test_case_3),
12057                 /* Tests with buffers which length is not byte-aligned */
12058                 TEST_CASE_ST(ut_setup, ut_teardown,
12059                         test_snow3g_hash_verify_test_case_4),
12060                 TEST_CASE_ST(ut_setup, ut_teardown,
12061                         test_snow3g_hash_verify_test_case_5),
12062                 TEST_CASE_ST(ut_setup, ut_teardown,
12063                         test_snow3g_hash_verify_test_case_6),
12064                 TEST_CASE_ST(ut_setup, ut_teardown,
12065                         test_snow3g_cipher_auth_test_case_1),
12066                 TEST_CASE_ST(ut_setup, ut_teardown,
12067                         test_snow3g_auth_cipher_with_digest_test_case_1),
12068
12069                 /** ZUC encrypt only (EEA3) */
12070                 TEST_CASE_ST(ut_setup, ut_teardown,
12071                         test_zuc_encryption_test_case_1),
12072                 TEST_CASE_ST(ut_setup, ut_teardown,
12073                         test_zuc_encryption_test_case_2),
12074                 TEST_CASE_ST(ut_setup, ut_teardown,
12075                         test_zuc_encryption_test_case_3),
12076                 TEST_CASE_ST(ut_setup, ut_teardown,
12077                         test_zuc_encryption_test_case_4),
12078                 TEST_CASE_ST(ut_setup, ut_teardown,
12079                         test_zuc_encryption_test_case_5),
12080                 TEST_CASE_ST(ut_setup, ut_teardown,
12081                         test_zuc_encryption_test_case_6_sgl),
12082
12083                 /** ZUC authenticate (EIA3) */
12084                 TEST_CASE_ST(ut_setup, ut_teardown,
12085                         test_zuc_hash_generate_test_case_1),
12086                 TEST_CASE_ST(ut_setup, ut_teardown,
12087                         test_zuc_hash_generate_test_case_2),
12088                 TEST_CASE_ST(ut_setup, ut_teardown,
12089                         test_zuc_hash_generate_test_case_3),
12090                 TEST_CASE_ST(ut_setup, ut_teardown,
12091                         test_zuc_hash_generate_test_case_4),
12092                 TEST_CASE_ST(ut_setup, ut_teardown,
12093                         test_zuc_hash_generate_test_case_5),
12094                 TEST_CASE_ST(ut_setup, ut_teardown,
12095                         test_zuc_hash_generate_test_case_6),
12096                 TEST_CASE_ST(ut_setup, ut_teardown,
12097                         test_zuc_hash_generate_test_case_7),
12098                 TEST_CASE_ST(ut_setup, ut_teardown,
12099                         test_zuc_hash_generate_test_case_8),
12100
12101                 /** ZUC alg-chain (EEA3/EIA3) */
12102                 TEST_CASE_ST(ut_setup, ut_teardown,
12103                         test_zuc_cipher_auth_test_case_1),
12104                 TEST_CASE_ST(ut_setup, ut_teardown,
12105                         test_zuc_cipher_auth_test_case_2),
12106
12107                 /** ZUC generate auth, then encrypt (EEA3) */
12108                 TEST_CASE_ST(ut_setup, ut_teardown,
12109                         test_zuc_auth_cipher_test_case_1),
12110                 TEST_CASE_ST(ut_setup, ut_teardown,
12111                         test_zuc_auth_cipher_test_case_1_oop),
12112                 TEST_CASE_ST(ut_setup, ut_teardown,
12113                         test_zuc_auth_cipher_test_case_1_sgl),
12114                 TEST_CASE_ST(ut_setup, ut_teardown,
12115                         test_zuc_auth_cipher_test_case_1_oop_sgl),
12116
12117                 /** ZUC decrypt (EEA3), then verify auth */
12118                 TEST_CASE_ST(ut_setup, ut_teardown,
12119                         test_zuc_auth_cipher_verify_test_case_1),
12120                 TEST_CASE_ST(ut_setup, ut_teardown,
12121                         test_zuc_auth_cipher_verify_test_case_1_oop),
12122                 TEST_CASE_ST(ut_setup, ut_teardown,
12123                         test_zuc_auth_cipher_verify_test_case_1_sgl),
12124                 TEST_CASE_ST(ut_setup, ut_teardown,
12125                         test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
12126
12127                 /** HMAC_MD5 Authentication */
12128                 TEST_CASE_ST(ut_setup, ut_teardown,
12129                         test_MD5_HMAC_generate_case_1),
12130                 TEST_CASE_ST(ut_setup, ut_teardown,
12131                         test_MD5_HMAC_verify_case_1),
12132                 TEST_CASE_ST(ut_setup, ut_teardown,
12133                         test_MD5_HMAC_generate_case_2),
12134                 TEST_CASE_ST(ut_setup, ut_teardown,
12135                         test_MD5_HMAC_verify_case_2),
12136
12137                 /** KASUMI hash only (UIA1) */
12138                 TEST_CASE_ST(ut_setup, ut_teardown,
12139                         test_kasumi_hash_generate_test_case_1),
12140                 TEST_CASE_ST(ut_setup, ut_teardown,
12141                         test_kasumi_hash_generate_test_case_2),
12142                 TEST_CASE_ST(ut_setup, ut_teardown,
12143                         test_kasumi_hash_generate_test_case_3),
12144                 TEST_CASE_ST(ut_setup, ut_teardown,
12145                         test_kasumi_hash_generate_test_case_4),
12146                 TEST_CASE_ST(ut_setup, ut_teardown,
12147                         test_kasumi_hash_generate_test_case_5),
12148                 TEST_CASE_ST(ut_setup, ut_teardown,
12149                         test_kasumi_hash_generate_test_case_6),
12150
12151                 TEST_CASE_ST(ut_setup, ut_teardown,
12152                         test_kasumi_hash_verify_test_case_1),
12153                 TEST_CASE_ST(ut_setup, ut_teardown,
12154                         test_kasumi_hash_verify_test_case_2),
12155                 TEST_CASE_ST(ut_setup, ut_teardown,
12156                         test_kasumi_hash_verify_test_case_3),
12157                 TEST_CASE_ST(ut_setup, ut_teardown,
12158                         test_kasumi_hash_verify_test_case_4),
12159                 TEST_CASE_ST(ut_setup, ut_teardown,
12160                         test_kasumi_hash_verify_test_case_5),
12161
12162                 /** KASUMI encrypt only (UEA1) */
12163                 TEST_CASE_ST(ut_setup, ut_teardown,
12164                         test_kasumi_encryption_test_case_1),
12165                 TEST_CASE_ST(ut_setup, ut_teardown,
12166                         test_kasumi_encryption_test_case_1_sgl),
12167                 TEST_CASE_ST(ut_setup, ut_teardown,
12168                         test_kasumi_encryption_test_case_1_oop),
12169                 TEST_CASE_ST(ut_setup, ut_teardown,
12170                         test_kasumi_encryption_test_case_1_oop_sgl),
12171                 TEST_CASE_ST(ut_setup, ut_teardown,
12172                         test_kasumi_encryption_test_case_2),
12173                 TEST_CASE_ST(ut_setup, ut_teardown,
12174                         test_kasumi_encryption_test_case_3),
12175                 TEST_CASE_ST(ut_setup, ut_teardown,
12176                         test_kasumi_encryption_test_case_4),
12177                 TEST_CASE_ST(ut_setup, ut_teardown,
12178                         test_kasumi_encryption_test_case_5),
12179
12180                 /** KASUMI decrypt only (UEA1) */
12181                 TEST_CASE_ST(ut_setup, ut_teardown,
12182                         test_kasumi_decryption_test_case_1),
12183                 TEST_CASE_ST(ut_setup, ut_teardown,
12184                         test_kasumi_decryption_test_case_2),
12185                 TEST_CASE_ST(ut_setup, ut_teardown,
12186                         test_kasumi_decryption_test_case_3),
12187                 TEST_CASE_ST(ut_setup, ut_teardown,
12188                         test_kasumi_decryption_test_case_4),
12189                 TEST_CASE_ST(ut_setup, ut_teardown,
12190                         test_kasumi_decryption_test_case_5),
12191                 TEST_CASE_ST(ut_setup, ut_teardown,
12192                         test_kasumi_decryption_test_case_1_oop),
12193
12194                 TEST_CASE_ST(ut_setup, ut_teardown,
12195                         test_kasumi_cipher_auth_test_case_1),
12196
12197                 /** KASUMI generate auth, then encrypt (F8) */
12198                 TEST_CASE_ST(ut_setup, ut_teardown,
12199                         test_kasumi_auth_cipher_test_case_1),
12200                 TEST_CASE_ST(ut_setup, ut_teardown,
12201                         test_kasumi_auth_cipher_test_case_2),
12202                 TEST_CASE_ST(ut_setup, ut_teardown,
12203                         test_kasumi_auth_cipher_test_case_2_oop),
12204                 TEST_CASE_ST(ut_setup, ut_teardown,
12205                         test_kasumi_auth_cipher_test_case_2_sgl),
12206                 TEST_CASE_ST(ut_setup, ut_teardown,
12207                         test_kasumi_auth_cipher_test_case_2_oop_sgl),
12208
12209                 /** KASUMI decrypt (F8), then verify auth */
12210                 TEST_CASE_ST(ut_setup, ut_teardown,
12211                         test_kasumi_auth_cipher_verify_test_case_1),
12212                 TEST_CASE_ST(ut_setup, ut_teardown,
12213                         test_kasumi_auth_cipher_verify_test_case_2),
12214                 TEST_CASE_ST(ut_setup, ut_teardown,
12215                         test_kasumi_auth_cipher_verify_test_case_2_oop),
12216                 TEST_CASE_ST(ut_setup, ut_teardown,
12217                         test_kasumi_auth_cipher_verify_test_case_2_sgl),
12218                 TEST_CASE_ST(ut_setup, ut_teardown,
12219                         test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
12220
12221                 /** ESN Testcase */
12222                 TEST_CASE_ST(ut_setup, ut_teardown,
12223                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
12224                 TEST_CASE_ST(ut_setup, ut_teardown,
12225                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
12226
12227                 /** Negative tests */
12228                 TEST_CASE_ST(ut_setup, ut_teardown,
12229                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
12230                 TEST_CASE_ST(ut_setup, ut_teardown,
12231                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
12232                 TEST_CASE_ST(ut_setup, ut_teardown,
12233                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
12234                 TEST_CASE_ST(ut_setup, ut_teardown,
12235                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
12236                 TEST_CASE_ST(ut_setup, ut_teardown,
12237                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
12238                 TEST_CASE_ST(ut_setup, ut_teardown,
12239                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
12240                 TEST_CASE_ST(ut_setup, ut_teardown,
12241                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
12242                 TEST_CASE_ST(ut_setup, ut_teardown,
12243                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
12244                 TEST_CASE_ST(ut_setup, ut_teardown,
12245                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
12246                 TEST_CASE_ST(ut_setup, ut_teardown,
12247                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
12248                 TEST_CASE_ST(ut_setup, ut_teardown,
12249                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
12250                 TEST_CASE_ST(ut_setup, ut_teardown,
12251                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
12252                 TEST_CASE_ST(ut_setup, ut_teardown,
12253                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
12254                 TEST_CASE_ST(ut_setup, ut_teardown,
12255                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
12256                 TEST_CASE_ST(ut_setup, ut_teardown,
12257                         authentication_verify_AES128_GMAC_fail_data_corrupt),
12258                 TEST_CASE_ST(ut_setup, ut_teardown,
12259                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
12260                 TEST_CASE_ST(ut_setup, ut_teardown,
12261                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
12262                 TEST_CASE_ST(ut_setup, ut_teardown,
12263                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
12264
12265                 /** Mixed CIPHER + HASH algorithms */
12266                 /** AUTH AES CMAC + CIPHER AES CTR */
12267                 TEST_CASE_ST(ut_setup, ut_teardown,
12268                         test_aes_cmac_aes_ctr_digest_enc_test_case_1),
12269                 TEST_CASE_ST(ut_setup, ut_teardown,
12270                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
12271                 TEST_CASE_ST(ut_setup, ut_teardown,
12272                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
12273                 TEST_CASE_ST(ut_setup, ut_teardown,
12274                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
12275                 TEST_CASE_ST(ut_setup, ut_teardown,
12276                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
12277                 TEST_CASE_ST(ut_setup, ut_teardown,
12278                        test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
12279                 TEST_CASE_ST(ut_setup, ut_teardown,
12280                        test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
12281                 TEST_CASE_ST(ut_setup, ut_teardown,
12282                    test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
12283
12284                 /** AUTH ZUC + CIPHER SNOW3G */
12285                 TEST_CASE_ST(ut_setup, ut_teardown,
12286                         test_auth_zuc_cipher_snow_test_case_1),
12287                 TEST_CASE_ST(ut_setup, ut_teardown,
12288                         test_verify_auth_zuc_cipher_snow_test_case_1),
12289                 /** AUTH AES CMAC + CIPHER SNOW3G */
12290                 TEST_CASE_ST(ut_setup, ut_teardown,
12291                         test_auth_aes_cmac_cipher_snow_test_case_1),
12292                 TEST_CASE_ST(ut_setup, ut_teardown,
12293                         test_verify_auth_aes_cmac_cipher_snow_test_case_1),
12294                 /** AUTH ZUC + CIPHER AES CTR */
12295                 TEST_CASE_ST(ut_setup, ut_teardown,
12296                         test_auth_zuc_cipher_aes_ctr_test_case_1),
12297                 TEST_CASE_ST(ut_setup, ut_teardown,
12298                         test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
12299                 /** AUTH SNOW3G + CIPHER AES CTR */
12300                 TEST_CASE_ST(ut_setup, ut_teardown,
12301                         test_auth_snow_cipher_aes_ctr_test_case_1),
12302                 TEST_CASE_ST(ut_setup, ut_teardown,
12303                         test_verify_auth_snow_cipher_aes_ctr_test_case_1),
12304                 /** AUTH SNOW3G + CIPHER ZUC */
12305                 TEST_CASE_ST(ut_setup, ut_teardown,
12306                         test_auth_snow_cipher_zuc_test_case_1),
12307                 TEST_CASE_ST(ut_setup, ut_teardown,
12308                         test_verify_auth_snow_cipher_zuc_test_case_1),
12309                 /** AUTH AES CMAC + CIPHER ZUC */
12310                 TEST_CASE_ST(ut_setup, ut_teardown,
12311                         test_auth_aes_cmac_cipher_zuc_test_case_1),
12312                 TEST_CASE_ST(ut_setup, ut_teardown,
12313                         test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
12314
12315                 /** AUTH NULL + CIPHER SNOW3G */
12316                 TEST_CASE_ST(ut_setup, ut_teardown,
12317                         test_auth_null_cipher_snow_test_case_1),
12318                 TEST_CASE_ST(ut_setup, ut_teardown,
12319                         test_verify_auth_null_cipher_snow_test_case_1),
12320                 /** AUTH NULL + CIPHER ZUC */
12321                 TEST_CASE_ST(ut_setup, ut_teardown,
12322                         test_auth_null_cipher_zuc_test_case_1),
12323                 TEST_CASE_ST(ut_setup, ut_teardown,
12324                         test_verify_auth_null_cipher_zuc_test_case_1),
12325                 /** AUTH SNOW3G + CIPHER NULL */
12326                 TEST_CASE_ST(ut_setup, ut_teardown,
12327                         test_auth_snow_cipher_null_test_case_1),
12328                 TEST_CASE_ST(ut_setup, ut_teardown,
12329                         test_verify_auth_snow_cipher_null_test_case_1),
12330                 /** AUTH ZUC + CIPHER NULL */
12331                 TEST_CASE_ST(ut_setup, ut_teardown,
12332                         test_auth_zuc_cipher_null_test_case_1),
12333                 TEST_CASE_ST(ut_setup, ut_teardown,
12334                         test_verify_auth_zuc_cipher_null_test_case_1),
12335                 /** AUTH NULL + CIPHER AES CTR */
12336                 TEST_CASE_ST(ut_setup, ut_teardown,
12337                         test_auth_null_cipher_aes_ctr_test_case_1),
12338                 TEST_CASE_ST(ut_setup, ut_teardown,
12339                         test_verify_auth_null_cipher_aes_ctr_test_case_1),
12340                 /** AUTH AES CMAC + CIPHER NULL */
12341                 TEST_CASE_ST(ut_setup, ut_teardown,
12342                         test_auth_aes_cmac_cipher_null_test_case_1),
12343                 TEST_CASE_ST(ut_setup, ut_teardown,
12344                         test_verify_auth_aes_cmac_cipher_null_test_case_1),
12345
12346                 TEST_CASES_END() /**< NULL terminate unit test array */
12347         }
12348 };
12349
12350 static struct unit_test_suite cryptodev_virtio_testsuite = {
12351         .suite_name = "Crypto VIRTIO Unit Test Suite",
12352         .setup = testsuite_setup,
12353         .teardown = testsuite_teardown,
12354         .unit_test_cases = {
12355                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
12356
12357                 TEST_CASES_END() /**< NULL terminate unit test array */
12358         }
12359 };
12360
12361 static struct unit_test_suite cryptodev_caam_jr_testsuite  = {
12362         .suite_name = "Crypto CAAM JR Unit Test Suite",
12363         .setup = testsuite_setup,
12364         .teardown = testsuite_teardown,
12365         .unit_test_cases = {
12366                 TEST_CASE_ST(ut_setup, ut_teardown,
12367                              test_device_configure_invalid_dev_id),
12368                 TEST_CASE_ST(ut_setup, ut_teardown,
12369                              test_multi_session),
12370
12371                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
12372                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
12373                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
12374                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
12375                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
12376
12377                 TEST_CASES_END() /**< NULL terminate unit test array */
12378         }
12379 };
12380
12381 static struct unit_test_suite cryptodev_dpaa_sec_testsuite  = {
12382         .suite_name = "Crypto DPAA_SEC Unit Test Suite",
12383         .setup = testsuite_setup,
12384         .teardown = testsuite_teardown,
12385         .unit_test_cases = {
12386                 TEST_CASE_ST(ut_setup, ut_teardown,
12387                              test_device_configure_invalid_dev_id),
12388                 TEST_CASE_ST(ut_setup, ut_teardown,
12389                              test_multi_session),
12390
12391                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
12392                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
12393                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
12394                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
12395                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
12396
12397 #ifdef RTE_LIBRTE_SECURITY
12398                 TEST_CASE_ST(ut_setup, ut_teardown,
12399                         test_PDCP_PROTO_cplane_encap_all),
12400
12401                 TEST_CASE_ST(ut_setup, ut_teardown,
12402                         test_PDCP_PROTO_cplane_decap_all),
12403
12404                 TEST_CASE_ST(ut_setup, ut_teardown,
12405                         test_PDCP_PROTO_uplane_encap_all),
12406
12407                 TEST_CASE_ST(ut_setup, ut_teardown,
12408                         test_PDCP_PROTO_uplane_decap_all),
12409
12410                 TEST_CASE_ST(ut_setup, ut_teardown,
12411                         test_PDCP_PROTO_SGL_in_place_32B),
12412                 TEST_CASE_ST(ut_setup, ut_teardown,
12413                         test_PDCP_PROTO_SGL_oop_32B_128B),
12414                 TEST_CASE_ST(ut_setup, ut_teardown,
12415                         test_PDCP_PROTO_SGL_oop_32B_40B),
12416                 TEST_CASE_ST(ut_setup, ut_teardown,
12417                         test_PDCP_PROTO_SGL_oop_128B_32B),
12418 #endif
12419                 /** AES GCM Authenticated Encryption */
12420                 TEST_CASE_ST(ut_setup, ut_teardown,
12421                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
12422                 TEST_CASE_ST(ut_setup, ut_teardown,
12423                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
12424                 TEST_CASE_ST(ut_setup, ut_teardown,
12425                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
12426                 TEST_CASE_ST(ut_setup, ut_teardown,
12427                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
12428                 TEST_CASE_ST(ut_setup, ut_teardown,
12429                         test_AES_GCM_authenticated_encryption_test_case_1),
12430                 TEST_CASE_ST(ut_setup, ut_teardown,
12431                         test_AES_GCM_authenticated_encryption_test_case_2),
12432                 TEST_CASE_ST(ut_setup, ut_teardown,
12433                         test_AES_GCM_authenticated_encryption_test_case_3),
12434                 TEST_CASE_ST(ut_setup, ut_teardown,
12435                         test_AES_GCM_authenticated_encryption_test_case_4),
12436                 TEST_CASE_ST(ut_setup, ut_teardown,
12437                         test_AES_GCM_authenticated_encryption_test_case_5),
12438                 TEST_CASE_ST(ut_setup, ut_teardown,
12439                         test_AES_GCM_authenticated_encryption_test_case_6),
12440                 TEST_CASE_ST(ut_setup, ut_teardown,
12441                         test_AES_GCM_authenticated_encryption_test_case_7),
12442                 TEST_CASE_ST(ut_setup, ut_teardown,
12443                         test_AES_GCM_authenticated_encryption_test_case_8),
12444
12445                 /** AES GCM Authenticated Decryption */
12446                 TEST_CASE_ST(ut_setup, ut_teardown,
12447                         test_AES_GCM_authenticated_decryption_test_case_1),
12448                 TEST_CASE_ST(ut_setup, ut_teardown,
12449                         test_AES_GCM_authenticated_decryption_test_case_2),
12450                 TEST_CASE_ST(ut_setup, ut_teardown,
12451                         test_AES_GCM_authenticated_decryption_test_case_3),
12452                 TEST_CASE_ST(ut_setup, ut_teardown,
12453                         test_AES_GCM_authenticated_decryption_test_case_4),
12454                 TEST_CASE_ST(ut_setup, ut_teardown,
12455                         test_AES_GCM_authenticated_decryption_test_case_5),
12456                 TEST_CASE_ST(ut_setup, ut_teardown,
12457                         test_AES_GCM_authenticated_decryption_test_case_6),
12458                 TEST_CASE_ST(ut_setup, ut_teardown,
12459                         test_AES_GCM_authenticated_decryption_test_case_7),
12460                 TEST_CASE_ST(ut_setup, ut_teardown,
12461                         test_AES_GCM_authenticated_decryption_test_case_8),
12462
12463                 /** AES GCM Authenticated Encryption 192 bits key */
12464                 TEST_CASE_ST(ut_setup, ut_teardown,
12465                         test_AES_GCM_auth_encryption_test_case_192_1),
12466                 TEST_CASE_ST(ut_setup, ut_teardown,
12467                         test_AES_GCM_auth_encryption_test_case_192_2),
12468                 TEST_CASE_ST(ut_setup, ut_teardown,
12469                         test_AES_GCM_auth_encryption_test_case_192_3),
12470                 TEST_CASE_ST(ut_setup, ut_teardown,
12471                         test_AES_GCM_auth_encryption_test_case_192_4),
12472                 TEST_CASE_ST(ut_setup, ut_teardown,
12473                         test_AES_GCM_auth_encryption_test_case_192_5),
12474                 TEST_CASE_ST(ut_setup, ut_teardown,
12475                         test_AES_GCM_auth_encryption_test_case_192_6),
12476                 TEST_CASE_ST(ut_setup, ut_teardown,
12477                         test_AES_GCM_auth_encryption_test_case_192_7),
12478
12479                 /** AES GCM Authenticated Decryption 192 bits key */
12480                 TEST_CASE_ST(ut_setup, ut_teardown,
12481                         test_AES_GCM_auth_decryption_test_case_192_1),
12482                 TEST_CASE_ST(ut_setup, ut_teardown,
12483                         test_AES_GCM_auth_decryption_test_case_192_2),
12484                 TEST_CASE_ST(ut_setup, ut_teardown,
12485                         test_AES_GCM_auth_decryption_test_case_192_3),
12486                 TEST_CASE_ST(ut_setup, ut_teardown,
12487                         test_AES_GCM_auth_decryption_test_case_192_4),
12488                 TEST_CASE_ST(ut_setup, ut_teardown,
12489                         test_AES_GCM_auth_decryption_test_case_192_5),
12490                 TEST_CASE_ST(ut_setup, ut_teardown,
12491                         test_AES_GCM_auth_decryption_test_case_192_6),
12492                 TEST_CASE_ST(ut_setup, ut_teardown,
12493                         test_AES_GCM_auth_decryption_test_case_192_7),
12494
12495                 /** AES GCM Authenticated Encryption 256 bits key */
12496                 TEST_CASE_ST(ut_setup, ut_teardown,
12497                         test_AES_GCM_auth_encryption_test_case_256_1),
12498                 TEST_CASE_ST(ut_setup, ut_teardown,
12499                         test_AES_GCM_auth_encryption_test_case_256_2),
12500                 TEST_CASE_ST(ut_setup, ut_teardown,
12501                         test_AES_GCM_auth_encryption_test_case_256_3),
12502                 TEST_CASE_ST(ut_setup, ut_teardown,
12503                         test_AES_GCM_auth_encryption_test_case_256_4),
12504                 TEST_CASE_ST(ut_setup, ut_teardown,
12505                         test_AES_GCM_auth_encryption_test_case_256_5),
12506                 TEST_CASE_ST(ut_setup, ut_teardown,
12507                         test_AES_GCM_auth_encryption_test_case_256_6),
12508                 TEST_CASE_ST(ut_setup, ut_teardown,
12509                         test_AES_GCM_auth_encryption_test_case_256_7),
12510
12511                 /** AES GCM Authenticated Decryption 256 bits key */
12512                 TEST_CASE_ST(ut_setup, ut_teardown,
12513                         test_AES_GCM_auth_decryption_test_case_256_1),
12514                 TEST_CASE_ST(ut_setup, ut_teardown,
12515                         test_AES_GCM_auth_decryption_test_case_256_2),
12516                 TEST_CASE_ST(ut_setup, ut_teardown,
12517                         test_AES_GCM_auth_decryption_test_case_256_3),
12518                 TEST_CASE_ST(ut_setup, ut_teardown,
12519                         test_AES_GCM_auth_decryption_test_case_256_4),
12520                 TEST_CASE_ST(ut_setup, ut_teardown,
12521                         test_AES_GCM_auth_decryption_test_case_256_5),
12522                 TEST_CASE_ST(ut_setup, ut_teardown,
12523                         test_AES_GCM_auth_decryption_test_case_256_6),
12524                 TEST_CASE_ST(ut_setup, ut_teardown,
12525                         test_AES_GCM_auth_decryption_test_case_256_7),
12526
12527                 /** Out of place tests */
12528                 TEST_CASE_ST(ut_setup, ut_teardown,
12529                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
12530                 TEST_CASE_ST(ut_setup, ut_teardown,
12531                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
12532
12533                 /** SNOW 3G encrypt only (UEA2) */
12534                 TEST_CASE_ST(ut_setup, ut_teardown,
12535                         test_snow3g_encryption_test_case_1),
12536                 TEST_CASE_ST(ut_setup, ut_teardown,
12537                         test_snow3g_encryption_test_case_2),
12538                 TEST_CASE_ST(ut_setup, ut_teardown,
12539                         test_snow3g_encryption_test_case_3),
12540                 TEST_CASE_ST(ut_setup, ut_teardown,
12541                         test_snow3g_encryption_test_case_4),
12542                 TEST_CASE_ST(ut_setup, ut_teardown,
12543                         test_snow3g_encryption_test_case_5),
12544
12545                 TEST_CASE_ST(ut_setup, ut_teardown,
12546                         test_snow3g_encryption_test_case_1_oop),
12547                 TEST_CASE_ST(ut_setup, ut_teardown,
12548                                 test_snow3g_encryption_test_case_1_oop_sgl),
12549                 TEST_CASE_ST(ut_setup, ut_teardown,
12550                         test_snow3g_decryption_test_case_1_oop),
12551
12552                 /** SNOW 3G decrypt only (UEA2) */
12553                 TEST_CASE_ST(ut_setup, ut_teardown,
12554                         test_snow3g_decryption_test_case_1),
12555                 TEST_CASE_ST(ut_setup, ut_teardown,
12556                         test_snow3g_decryption_test_case_2),
12557                 TEST_CASE_ST(ut_setup, ut_teardown,
12558                         test_snow3g_decryption_test_case_3),
12559                 TEST_CASE_ST(ut_setup, ut_teardown,
12560                         test_snow3g_decryption_test_case_4),
12561                 TEST_CASE_ST(ut_setup, ut_teardown,
12562                         test_snow3g_decryption_test_case_5),
12563
12564                 TEST_CASE_ST(ut_setup, ut_teardown,
12565                         test_snow3g_hash_generate_test_case_1),
12566                 TEST_CASE_ST(ut_setup, ut_teardown,
12567                         test_snow3g_hash_generate_test_case_2),
12568                 TEST_CASE_ST(ut_setup, ut_teardown,
12569                         test_snow3g_hash_generate_test_case_3),
12570                 TEST_CASE_ST(ut_setup, ut_teardown,
12571                         test_snow3g_hash_verify_test_case_1),
12572                 TEST_CASE_ST(ut_setup, ut_teardown,
12573                         test_snow3g_hash_verify_test_case_2),
12574                 TEST_CASE_ST(ut_setup, ut_teardown,
12575                         test_snow3g_hash_verify_test_case_3),
12576
12577                 /** ZUC encrypt only (EEA3) */
12578                 TEST_CASE_ST(ut_setup, ut_teardown,
12579                         test_zuc_encryption_test_case_1),
12580                 TEST_CASE_ST(ut_setup, ut_teardown,
12581                         test_zuc_encryption_test_case_2),
12582                 TEST_CASE_ST(ut_setup, ut_teardown,
12583                         test_zuc_encryption_test_case_3),
12584                 TEST_CASE_ST(ut_setup, ut_teardown,
12585                         test_zuc_encryption_test_case_4),
12586                 TEST_CASE_ST(ut_setup, ut_teardown,
12587                         test_zuc_encryption_test_case_5),
12588
12589                 /** ZUC authenticate (EIA3) */
12590                 TEST_CASE_ST(ut_setup, ut_teardown,
12591                         test_zuc_hash_generate_test_case_6),
12592                 TEST_CASE_ST(ut_setup, ut_teardown,
12593                         test_zuc_hash_generate_test_case_7),
12594                 TEST_CASE_ST(ut_setup, ut_teardown,
12595                         test_zuc_hash_generate_test_case_8),
12596
12597                 /** Negative tests */
12598                 TEST_CASE_ST(ut_setup, ut_teardown,
12599                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
12600                 TEST_CASE_ST(ut_setup, ut_teardown,
12601                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
12602                 TEST_CASE_ST(ut_setup, ut_teardown,
12603                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
12604                 TEST_CASE_ST(ut_setup, ut_teardown,
12605                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
12606                 TEST_CASE_ST(ut_setup, ut_teardown,
12607                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
12608                 TEST_CASE_ST(ut_setup, ut_teardown,
12609                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
12610                 TEST_CASE_ST(ut_setup, ut_teardown,
12611                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
12612                 TEST_CASE_ST(ut_setup, ut_teardown,
12613                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
12614                 TEST_CASE_ST(ut_setup, ut_teardown,
12615                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
12616                 TEST_CASE_ST(ut_setup, ut_teardown,
12617                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
12618                 TEST_CASE_ST(ut_setup, ut_teardown,
12619                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
12620                 TEST_CASE_ST(ut_setup, ut_teardown,
12621                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
12622                 TEST_CASE_ST(ut_setup, ut_teardown,
12623                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
12624                 TEST_CASE_ST(ut_setup, ut_teardown,
12625                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
12626                 TEST_CASE_ST(ut_setup, ut_teardown,
12627                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
12628                 TEST_CASE_ST(ut_setup, ut_teardown,
12629                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
12630
12631                 /* ESN Testcase */
12632                 TEST_CASE_ST(ut_setup, ut_teardown,
12633                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
12634                 TEST_CASE_ST(ut_setup, ut_teardown,
12635                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
12636
12637                 TEST_CASES_END() /**< NULL terminate unit test array */
12638         }
12639 };
12640
12641 static struct unit_test_suite cryptodev_dpaa2_sec_testsuite  = {
12642         .suite_name = "Crypto DPAA2_SEC Unit Test Suite",
12643         .setup = testsuite_setup,
12644         .teardown = testsuite_teardown,
12645         .unit_test_cases = {
12646                 TEST_CASE_ST(ut_setup, ut_teardown,
12647                         test_device_configure_invalid_dev_id),
12648                 TEST_CASE_ST(ut_setup, ut_teardown,
12649                         test_multi_session),
12650                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
12651                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
12652                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
12653                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
12654                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
12655
12656 #ifdef RTE_LIBRTE_SECURITY
12657                 TEST_CASE_ST(ut_setup, ut_teardown,
12658                         test_PDCP_PROTO_cplane_encap_all),
12659
12660                 TEST_CASE_ST(ut_setup, ut_teardown,
12661                         test_PDCP_PROTO_cplane_decap_all),
12662
12663                 TEST_CASE_ST(ut_setup, ut_teardown,
12664                         test_PDCP_PROTO_uplane_encap_all),
12665
12666                 TEST_CASE_ST(ut_setup, ut_teardown,
12667                         test_PDCP_PROTO_uplane_decap_all),
12668
12669                 TEST_CASE_ST(ut_setup, ut_teardown,
12670                         test_PDCP_PROTO_SGL_in_place_32B),
12671                 TEST_CASE_ST(ut_setup, ut_teardown,
12672                         test_PDCP_PROTO_SGL_oop_32B_128B),
12673                 TEST_CASE_ST(ut_setup, ut_teardown,
12674                         test_PDCP_PROTO_SGL_oop_32B_40B),
12675                 TEST_CASE_ST(ut_setup, ut_teardown,
12676                         test_PDCP_PROTO_SGL_oop_128B_32B),
12677 #endif
12678                 /** AES GCM Authenticated Encryption */
12679                 TEST_CASE_ST(ut_setup, ut_teardown,
12680                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
12681                 TEST_CASE_ST(ut_setup, ut_teardown,
12682                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
12683                 TEST_CASE_ST(ut_setup, ut_teardown,
12684                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
12685                 TEST_CASE_ST(ut_setup, ut_teardown,
12686                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
12687                 TEST_CASE_ST(ut_setup, ut_teardown,
12688                         test_AES_GCM_authenticated_encryption_test_case_1),
12689                 TEST_CASE_ST(ut_setup, ut_teardown,
12690                         test_AES_GCM_authenticated_encryption_test_case_2),
12691                 TEST_CASE_ST(ut_setup, ut_teardown,
12692                         test_AES_GCM_authenticated_encryption_test_case_3),
12693                 TEST_CASE_ST(ut_setup, ut_teardown,
12694                         test_AES_GCM_authenticated_encryption_test_case_4),
12695                 TEST_CASE_ST(ut_setup, ut_teardown,
12696                         test_AES_GCM_authenticated_encryption_test_case_5),
12697                 TEST_CASE_ST(ut_setup, ut_teardown,
12698                         test_AES_GCM_authenticated_encryption_test_case_6),
12699                 TEST_CASE_ST(ut_setup, ut_teardown,
12700                         test_AES_GCM_authenticated_encryption_test_case_7),
12701                 TEST_CASE_ST(ut_setup, ut_teardown,
12702                         test_AES_GCM_authenticated_encryption_test_case_8),
12703
12704                 /** AES GCM Authenticated Decryption */
12705                 TEST_CASE_ST(ut_setup, ut_teardown,
12706                         test_AES_GCM_authenticated_decryption_test_case_1),
12707                 TEST_CASE_ST(ut_setup, ut_teardown,
12708                         test_AES_GCM_authenticated_decryption_test_case_2),
12709                 TEST_CASE_ST(ut_setup, ut_teardown,
12710                         test_AES_GCM_authenticated_decryption_test_case_3),
12711                 TEST_CASE_ST(ut_setup, ut_teardown,
12712                         test_AES_GCM_authenticated_decryption_test_case_4),
12713                 TEST_CASE_ST(ut_setup, ut_teardown,
12714                         test_AES_GCM_authenticated_decryption_test_case_5),
12715                 TEST_CASE_ST(ut_setup, ut_teardown,
12716                         test_AES_GCM_authenticated_decryption_test_case_6),
12717                 TEST_CASE_ST(ut_setup, ut_teardown,
12718                         test_AES_GCM_authenticated_decryption_test_case_7),
12719                 TEST_CASE_ST(ut_setup, ut_teardown,
12720                         test_AES_GCM_authenticated_decryption_test_case_8),
12721
12722                 /** AES GCM Authenticated Encryption 192 bits key */
12723                 TEST_CASE_ST(ut_setup, ut_teardown,
12724                         test_AES_GCM_auth_encryption_test_case_192_1),
12725                 TEST_CASE_ST(ut_setup, ut_teardown,
12726                         test_AES_GCM_auth_encryption_test_case_192_2),
12727                 TEST_CASE_ST(ut_setup, ut_teardown,
12728                         test_AES_GCM_auth_encryption_test_case_192_3),
12729                 TEST_CASE_ST(ut_setup, ut_teardown,
12730                         test_AES_GCM_auth_encryption_test_case_192_4),
12731                 TEST_CASE_ST(ut_setup, ut_teardown,
12732                         test_AES_GCM_auth_encryption_test_case_192_5),
12733                 TEST_CASE_ST(ut_setup, ut_teardown,
12734                         test_AES_GCM_auth_encryption_test_case_192_6),
12735                 TEST_CASE_ST(ut_setup, ut_teardown,
12736                         test_AES_GCM_auth_encryption_test_case_192_7),
12737
12738                 /** AES GCM Authenticated Decryption 192 bits key */
12739                 TEST_CASE_ST(ut_setup, ut_teardown,
12740                         test_AES_GCM_auth_decryption_test_case_192_1),
12741                 TEST_CASE_ST(ut_setup, ut_teardown,
12742                         test_AES_GCM_auth_decryption_test_case_192_2),
12743                 TEST_CASE_ST(ut_setup, ut_teardown,
12744                         test_AES_GCM_auth_decryption_test_case_192_3),
12745                 TEST_CASE_ST(ut_setup, ut_teardown,
12746                         test_AES_GCM_auth_decryption_test_case_192_4),
12747                 TEST_CASE_ST(ut_setup, ut_teardown,
12748                         test_AES_GCM_auth_decryption_test_case_192_5),
12749                 TEST_CASE_ST(ut_setup, ut_teardown,
12750                         test_AES_GCM_auth_decryption_test_case_192_6),
12751                 TEST_CASE_ST(ut_setup, ut_teardown,
12752                         test_AES_GCM_auth_decryption_test_case_192_7),
12753
12754                 /** AES GCM Authenticated Encryption 256 bits key */
12755                 TEST_CASE_ST(ut_setup, ut_teardown,
12756                         test_AES_GCM_auth_encryption_test_case_256_1),
12757                 TEST_CASE_ST(ut_setup, ut_teardown,
12758                         test_AES_GCM_auth_encryption_test_case_256_2),
12759                 TEST_CASE_ST(ut_setup, ut_teardown,
12760                         test_AES_GCM_auth_encryption_test_case_256_3),
12761                 TEST_CASE_ST(ut_setup, ut_teardown,
12762                         test_AES_GCM_auth_encryption_test_case_256_4),
12763                 TEST_CASE_ST(ut_setup, ut_teardown,
12764                         test_AES_GCM_auth_encryption_test_case_256_5),
12765                 TEST_CASE_ST(ut_setup, ut_teardown,
12766                         test_AES_GCM_auth_encryption_test_case_256_6),
12767                 TEST_CASE_ST(ut_setup, ut_teardown,
12768                         test_AES_GCM_auth_encryption_test_case_256_7),
12769
12770                 /** AES GCM Authenticated Decryption 256 bits key */
12771                 TEST_CASE_ST(ut_setup, ut_teardown,
12772                         test_AES_GCM_auth_decryption_test_case_256_1),
12773                 TEST_CASE_ST(ut_setup, ut_teardown,
12774                         test_AES_GCM_auth_decryption_test_case_256_2),
12775                 TEST_CASE_ST(ut_setup, ut_teardown,
12776                         test_AES_GCM_auth_decryption_test_case_256_3),
12777                 TEST_CASE_ST(ut_setup, ut_teardown,
12778                         test_AES_GCM_auth_decryption_test_case_256_4),
12779                 TEST_CASE_ST(ut_setup, ut_teardown,
12780                         test_AES_GCM_auth_decryption_test_case_256_5),
12781                 TEST_CASE_ST(ut_setup, ut_teardown,
12782                         test_AES_GCM_auth_decryption_test_case_256_6),
12783                 TEST_CASE_ST(ut_setup, ut_teardown,
12784                         test_AES_GCM_auth_decryption_test_case_256_7),
12785
12786                 /** Out of place tests */
12787                 TEST_CASE_ST(ut_setup, ut_teardown,
12788                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
12789                 TEST_CASE_ST(ut_setup, ut_teardown,
12790                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
12791
12792                 /** SNOW 3G encrypt only (UEA2) */
12793                 TEST_CASE_ST(ut_setup, ut_teardown,
12794                         test_snow3g_encryption_test_case_1),
12795                 TEST_CASE_ST(ut_setup, ut_teardown,
12796                         test_snow3g_encryption_test_case_2),
12797                 TEST_CASE_ST(ut_setup, ut_teardown,
12798                         test_snow3g_encryption_test_case_3),
12799                 TEST_CASE_ST(ut_setup, ut_teardown,
12800                         test_snow3g_encryption_test_case_4),
12801                 TEST_CASE_ST(ut_setup, ut_teardown,
12802                         test_snow3g_encryption_test_case_5),
12803
12804                 TEST_CASE_ST(ut_setup, ut_teardown,
12805                         test_snow3g_encryption_test_case_1_oop),
12806                 TEST_CASE_ST(ut_setup, ut_teardown,
12807                                 test_snow3g_encryption_test_case_1_oop_sgl),
12808                 TEST_CASE_ST(ut_setup, ut_teardown,
12809                         test_snow3g_decryption_test_case_1_oop),
12810
12811                 /** SNOW 3G decrypt only (UEA2) */
12812                 TEST_CASE_ST(ut_setup, ut_teardown,
12813                         test_snow3g_decryption_test_case_1),
12814                 TEST_CASE_ST(ut_setup, ut_teardown,
12815                         test_snow3g_decryption_test_case_2),
12816                 TEST_CASE_ST(ut_setup, ut_teardown,
12817                         test_snow3g_decryption_test_case_3),
12818                 TEST_CASE_ST(ut_setup, ut_teardown,
12819                         test_snow3g_decryption_test_case_4),
12820                 TEST_CASE_ST(ut_setup, ut_teardown,
12821                         test_snow3g_decryption_test_case_5),
12822
12823                 TEST_CASE_ST(ut_setup, ut_teardown,
12824                         test_snow3g_hash_generate_test_case_1),
12825                 TEST_CASE_ST(ut_setup, ut_teardown,
12826                         test_snow3g_hash_generate_test_case_2),
12827                 TEST_CASE_ST(ut_setup, ut_teardown,
12828                         test_snow3g_hash_generate_test_case_3),
12829                 TEST_CASE_ST(ut_setup, ut_teardown,
12830                         test_snow3g_hash_verify_test_case_1),
12831                 TEST_CASE_ST(ut_setup, ut_teardown,
12832                         test_snow3g_hash_verify_test_case_2),
12833                 TEST_CASE_ST(ut_setup, ut_teardown,
12834                         test_snow3g_hash_verify_test_case_3),
12835
12836                 /** ZUC encrypt only (EEA3) */
12837                 TEST_CASE_ST(ut_setup, ut_teardown,
12838                         test_zuc_encryption_test_case_1),
12839                 TEST_CASE_ST(ut_setup, ut_teardown,
12840                         test_zuc_encryption_test_case_2),
12841                 TEST_CASE_ST(ut_setup, ut_teardown,
12842                         test_zuc_encryption_test_case_3),
12843                 TEST_CASE_ST(ut_setup, ut_teardown,
12844                         test_zuc_encryption_test_case_4),
12845                 TEST_CASE_ST(ut_setup, ut_teardown,
12846                         test_zuc_encryption_test_case_5),
12847
12848                 /** ZUC authenticate (EIA3) */
12849                 TEST_CASE_ST(ut_setup, ut_teardown,
12850                         test_zuc_hash_generate_test_case_6),
12851                 TEST_CASE_ST(ut_setup, ut_teardown,
12852                         test_zuc_hash_generate_test_case_7),
12853                 TEST_CASE_ST(ut_setup, ut_teardown,
12854                         test_zuc_hash_generate_test_case_8),
12855
12856                 /** HMAC_MD5 Authentication */
12857                 TEST_CASE_ST(ut_setup, ut_teardown,
12858                         test_MD5_HMAC_generate_case_1),
12859                 TEST_CASE_ST(ut_setup, ut_teardown,
12860                         test_MD5_HMAC_verify_case_1),
12861                 TEST_CASE_ST(ut_setup, ut_teardown,
12862                         test_MD5_HMAC_generate_case_2),
12863                 TEST_CASE_ST(ut_setup, ut_teardown,
12864                         test_MD5_HMAC_verify_case_2),
12865
12866                 /** Negative tests */
12867                 TEST_CASE_ST(ut_setup, ut_teardown,
12868                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
12869                 TEST_CASE_ST(ut_setup, ut_teardown,
12870                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
12871                 TEST_CASE_ST(ut_setup, ut_teardown,
12872                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
12873                 TEST_CASE_ST(ut_setup, ut_teardown,
12874                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
12875                 TEST_CASE_ST(ut_setup, ut_teardown,
12876                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
12877                 TEST_CASE_ST(ut_setup, ut_teardown,
12878                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
12879                 TEST_CASE_ST(ut_setup, ut_teardown,
12880                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
12881                 TEST_CASE_ST(ut_setup, ut_teardown,
12882                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
12883                 TEST_CASE_ST(ut_setup, ut_teardown,
12884                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
12885                 TEST_CASE_ST(ut_setup, ut_teardown,
12886                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
12887                 TEST_CASE_ST(ut_setup, ut_teardown,
12888                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
12889                 TEST_CASE_ST(ut_setup, ut_teardown,
12890                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
12891                 TEST_CASE_ST(ut_setup, ut_teardown,
12892                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
12893                 TEST_CASE_ST(ut_setup, ut_teardown,
12894                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
12895                 TEST_CASE_ST(ut_setup, ut_teardown,
12896                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
12897                 TEST_CASE_ST(ut_setup, ut_teardown,
12898                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
12899
12900                 /* ESN Testcase */
12901                 TEST_CASE_ST(ut_setup, ut_teardown,
12902                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
12903
12904                 TEST_CASE_ST(ut_setup, ut_teardown,
12905                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
12906
12907                 TEST_CASES_END() /**< NULL terminate unit test array */
12908         }
12909 };
12910
12911 static struct unit_test_suite cryptodev_armv8_testsuite  = {
12912         .suite_name = "Crypto Device ARMv8 Unit Test Suite",
12913         .setup = testsuite_setup,
12914         .teardown = testsuite_teardown,
12915         .unit_test_cases = {
12916                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
12917
12918                 /** Negative tests */
12919                 TEST_CASE_ST(ut_setup, ut_teardown,
12920                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
12921                 TEST_CASE_ST(ut_setup, ut_teardown,
12922                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
12923
12924                 TEST_CASES_END() /**< NULL terminate unit test array */
12925         }
12926 };
12927
12928 static struct unit_test_suite cryptodev_mrvl_testsuite  = {
12929         .suite_name = "Crypto Device Marvell Component Test Suite",
12930         .setup = testsuite_setup,
12931         .teardown = testsuite_teardown,
12932         .unit_test_cases = {
12933                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
12934                 TEST_CASE_ST(ut_setup, ut_teardown,
12935                                 test_multi_session_random_usage),
12936                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
12937                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
12938                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
12939                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
12940                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
12941
12942                 /** Negative tests */
12943                 TEST_CASE_ST(ut_setup, ut_teardown,
12944                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
12945                 TEST_CASE_ST(ut_setup, ut_teardown,
12946                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
12947                 TEST_CASE_ST(ut_setup, ut_teardown,
12948                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
12949                 TEST_CASE_ST(ut_setup, ut_teardown,
12950                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
12951
12952                 TEST_CASES_END() /**< NULL terminate unit test array */
12953         }
12954 };
12955
12956 static struct unit_test_suite cryptodev_ccp_testsuite  = {
12957         .suite_name = "Crypto Device CCP Unit Test Suite",
12958         .setup = testsuite_setup,
12959         .teardown = testsuite_teardown,
12960         .unit_test_cases = {
12961                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
12962                 TEST_CASE_ST(ut_setup, ut_teardown,
12963                                 test_multi_session_random_usage),
12964                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
12965                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
12966                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
12967                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
12968                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
12969
12970                 /** Negative tests */
12971                 TEST_CASE_ST(ut_setup, ut_teardown,
12972                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
12973                 TEST_CASE_ST(ut_setup, ut_teardown,
12974                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
12975                 TEST_CASE_ST(ut_setup, ut_teardown,
12976                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
12977                 TEST_CASE_ST(ut_setup, ut_teardown,
12978                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
12979
12980                 TEST_CASES_END() /**< NULL terminate unit test array */
12981         }
12982 };
12983
12984 static struct unit_test_suite cryptodev_octeontx_testsuite  = {
12985         .suite_name = "Crypto Device OCTEONTX Unit Test Suite",
12986         .setup = testsuite_setup,
12987         .teardown = testsuite_teardown,
12988         .unit_test_cases = {
12989                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
12990                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
12991                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
12992                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
12993                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
12994
12995                 /** AES GCM Authenticated Encryption */
12996                 TEST_CASE_ST(ut_setup, ut_teardown,
12997                         test_AES_GCM_authenticated_encryption_test_case_1),
12998                 TEST_CASE_ST(ut_setup, ut_teardown,
12999                         test_AES_GCM_authenticated_encryption_test_case_2),
13000                 TEST_CASE_ST(ut_setup, ut_teardown,
13001                         test_AES_GCM_authenticated_encryption_test_case_3),
13002                 TEST_CASE_ST(ut_setup, ut_teardown,
13003                         test_AES_GCM_authenticated_encryption_test_case_4),
13004                 TEST_CASE_ST(ut_setup, ut_teardown,
13005                         test_AES_GCM_authenticated_encryption_test_case_5),
13006                 TEST_CASE_ST(ut_setup, ut_teardown,
13007                         test_AES_GCM_authenticated_encryption_test_case_6),
13008                 TEST_CASE_ST(ut_setup, ut_teardown,
13009                         test_AES_GCM_authenticated_encryption_test_case_7),
13010
13011                 /** AES GCM Authenticated Decryption */
13012                 TEST_CASE_ST(ut_setup, ut_teardown,
13013                         test_AES_GCM_authenticated_decryption_test_case_1),
13014                 TEST_CASE_ST(ut_setup, ut_teardown,
13015                         test_AES_GCM_authenticated_decryption_test_case_2),
13016                 TEST_CASE_ST(ut_setup, ut_teardown,
13017                         test_AES_GCM_authenticated_decryption_test_case_3),
13018                 TEST_CASE_ST(ut_setup, ut_teardown,
13019                         test_AES_GCM_authenticated_decryption_test_case_4),
13020                 TEST_CASE_ST(ut_setup, ut_teardown,
13021                         test_AES_GCM_authenticated_decryption_test_case_5),
13022                 TEST_CASE_ST(ut_setup, ut_teardown,
13023                         test_AES_GCM_authenticated_decryption_test_case_6),
13024                 TEST_CASE_ST(ut_setup, ut_teardown,
13025                         test_AES_GCM_authenticated_decryption_test_case_7),
13026                 /** AES GMAC Authentication */
13027                 TEST_CASE_ST(ut_setup, ut_teardown,
13028                         test_AES_GMAC_authentication_test_case_1),
13029                 TEST_CASE_ST(ut_setup, ut_teardown,
13030                         test_AES_GMAC_authentication_verify_test_case_1),
13031                 TEST_CASE_ST(ut_setup, ut_teardown,
13032                         test_AES_GMAC_authentication_test_case_2),
13033                 TEST_CASE_ST(ut_setup, ut_teardown,
13034                         test_AES_GMAC_authentication_verify_test_case_2),
13035                 TEST_CASE_ST(ut_setup, ut_teardown,
13036                         test_AES_GMAC_authentication_test_case_3),
13037                 TEST_CASE_ST(ut_setup, ut_teardown,
13038                         test_AES_GMAC_authentication_verify_test_case_3),
13039
13040                 /** SNOW 3G encrypt only (UEA2) */
13041                 TEST_CASE_ST(ut_setup, ut_teardown,
13042                         test_snow3g_encryption_test_case_1),
13043                 TEST_CASE_ST(ut_setup, ut_teardown,
13044                         test_snow3g_encryption_test_case_2),
13045                 TEST_CASE_ST(ut_setup, ut_teardown,
13046                         test_snow3g_encryption_test_case_3),
13047                 TEST_CASE_ST(ut_setup, ut_teardown,
13048                         test_snow3g_encryption_test_case_4),
13049                 TEST_CASE_ST(ut_setup, ut_teardown,
13050                         test_snow3g_encryption_test_case_5),
13051
13052                 TEST_CASE_ST(ut_setup, ut_teardown,
13053                         test_snow3g_encryption_test_case_1_oop),
13054                 TEST_CASE_ST(ut_setup, ut_teardown,
13055                         test_snow3g_decryption_test_case_1_oop),
13056                 TEST_CASE_ST(ut_setup, ut_teardown,
13057                         test_snow3g_encryption_test_case_1_oop_sgl),
13058
13059                 /** SNOW 3G decrypt only (UEA2) */
13060                 TEST_CASE_ST(ut_setup, ut_teardown,
13061                         test_snow3g_decryption_test_case_1),
13062                 TEST_CASE_ST(ut_setup, ut_teardown,
13063                         test_snow3g_decryption_test_case_2),
13064                 TEST_CASE_ST(ut_setup, ut_teardown,
13065                         test_snow3g_decryption_test_case_3),
13066                 TEST_CASE_ST(ut_setup, ut_teardown,
13067                         test_snow3g_decryption_test_case_4),
13068                 TEST_CASE_ST(ut_setup, ut_teardown,
13069                         test_snow3g_decryption_test_case_5),
13070
13071                 TEST_CASE_ST(ut_setup, ut_teardown,
13072                         test_snow3g_hash_generate_test_case_1),
13073                 TEST_CASE_ST(ut_setup, ut_teardown,
13074                         test_snow3g_hash_generate_test_case_2),
13075                 TEST_CASE_ST(ut_setup, ut_teardown,
13076                         test_snow3g_hash_generate_test_case_3),
13077                 TEST_CASE_ST(ut_setup, ut_teardown,
13078                         test_snow3g_hash_verify_test_case_1),
13079                 TEST_CASE_ST(ut_setup, ut_teardown,
13080                         test_snow3g_hash_verify_test_case_2),
13081                 TEST_CASE_ST(ut_setup, ut_teardown,
13082                         test_snow3g_hash_verify_test_case_3),
13083
13084                 /** ZUC encrypt only (EEA3) */
13085                 TEST_CASE_ST(ut_setup, ut_teardown,
13086                         test_zuc_encryption_test_case_1),
13087                 TEST_CASE_ST(ut_setup, ut_teardown,
13088                         test_zuc_encryption_test_case_2),
13089                 TEST_CASE_ST(ut_setup, ut_teardown,
13090                         test_zuc_encryption_test_case_3),
13091                 TEST_CASE_ST(ut_setup, ut_teardown,
13092                         test_zuc_encryption_test_case_4),
13093                 TEST_CASE_ST(ut_setup, ut_teardown,
13094                         test_zuc_encryption_test_case_5),
13095                 TEST_CASE_ST(ut_setup, ut_teardown,
13096                         test_zuc_hash_generate_test_case_1),
13097                 TEST_CASE_ST(ut_setup, ut_teardown,
13098                         test_zuc_hash_generate_test_case_2),
13099                 TEST_CASE_ST(ut_setup, ut_teardown,
13100                         test_zuc_hash_generate_test_case_3),
13101                 TEST_CASE_ST(ut_setup, ut_teardown,
13102                         test_zuc_hash_generate_test_case_4),
13103                 TEST_CASE_ST(ut_setup, ut_teardown,
13104                         test_zuc_hash_generate_test_case_5),
13105                 TEST_CASE_ST(ut_setup, ut_teardown,
13106                         test_zuc_encryption_test_case_6_sgl),
13107
13108                 /** KASUMI encrypt only (UEA1) */
13109                 TEST_CASE_ST(ut_setup, ut_teardown,
13110                         test_kasumi_encryption_test_case_1),
13111                 TEST_CASE_ST(ut_setup, ut_teardown,
13112                         test_kasumi_encryption_test_case_2),
13113                 TEST_CASE_ST(ut_setup, ut_teardown,
13114                         test_kasumi_encryption_test_case_3),
13115                 TEST_CASE_ST(ut_setup, ut_teardown,
13116                         test_kasumi_encryption_test_case_4),
13117                 TEST_CASE_ST(ut_setup, ut_teardown,
13118                         test_kasumi_encryption_test_case_5),
13119                 TEST_CASE_ST(ut_setup, ut_teardown,
13120                         test_kasumi_encryption_test_case_1_sgl),
13121                 TEST_CASE_ST(ut_setup, ut_teardown,
13122                         test_kasumi_encryption_test_case_1_oop_sgl),
13123                 /** KASUMI decrypt only (UEA1) */
13124                 TEST_CASE_ST(ut_setup, ut_teardown,
13125                         test_kasumi_decryption_test_case_1),
13126                 TEST_CASE_ST(ut_setup, ut_teardown,
13127                         test_kasumi_decryption_test_case_2),
13128                 TEST_CASE_ST(ut_setup, ut_teardown,
13129                         test_kasumi_decryption_test_case_3),
13130                 TEST_CASE_ST(ut_setup, ut_teardown,
13131                         test_kasumi_decryption_test_case_4),
13132                 TEST_CASE_ST(ut_setup, ut_teardown,
13133                         test_kasumi_decryption_test_case_5),
13134
13135                 TEST_CASE_ST(ut_setup, ut_teardown,
13136                         test_kasumi_encryption_test_case_1_oop),
13137                 TEST_CASE_ST(ut_setup, ut_teardown,
13138                         test_kasumi_decryption_test_case_1_oop),
13139
13140                 /** KASUMI hash only (UIA1) */
13141                 TEST_CASE_ST(ut_setup, ut_teardown,
13142                         test_kasumi_hash_generate_test_case_1),
13143                 TEST_CASE_ST(ut_setup, ut_teardown,
13144                         test_kasumi_hash_generate_test_case_2),
13145                 TEST_CASE_ST(ut_setup, ut_teardown,
13146                         test_kasumi_hash_generate_test_case_3),
13147                 TEST_CASE_ST(ut_setup, ut_teardown,
13148                         test_kasumi_hash_generate_test_case_4),
13149                 TEST_CASE_ST(ut_setup, ut_teardown,
13150                         test_kasumi_hash_generate_test_case_5),
13151                 TEST_CASE_ST(ut_setup, ut_teardown,
13152                         test_kasumi_hash_generate_test_case_6),
13153                 TEST_CASE_ST(ut_setup, ut_teardown,
13154                         test_kasumi_hash_verify_test_case_1),
13155                 TEST_CASE_ST(ut_setup, ut_teardown,
13156                         test_kasumi_hash_verify_test_case_2),
13157                 TEST_CASE_ST(ut_setup, ut_teardown,
13158                         test_kasumi_hash_verify_test_case_3),
13159                 TEST_CASE_ST(ut_setup, ut_teardown,
13160                         test_kasumi_hash_verify_test_case_4),
13161                 TEST_CASE_ST(ut_setup, ut_teardown,
13162                         test_kasumi_hash_verify_test_case_5),
13163
13164                 /** NULL tests */
13165                 TEST_CASE_ST(ut_setup, ut_teardown,
13166                         test_null_cipher_only_operation),
13167                 TEST_CASE_ST(ut_setup, ut_teardown,
13168                         test_null_auth_only_operation),
13169                 TEST_CASE_ST(ut_setup, ut_teardown,
13170                         test_null_cipher_auth_operation),
13171                 TEST_CASE_ST(ut_setup, ut_teardown,
13172                         test_null_auth_cipher_operation),
13173
13174                 /** Negative tests */
13175                 TEST_CASE_ST(ut_setup, ut_teardown,
13176                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13177                 TEST_CASE_ST(ut_setup, ut_teardown,
13178                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13179                 TEST_CASE_ST(ut_setup, ut_teardown,
13180                         authentication_verify_AES128_GMAC_fail_data_corrupt),
13181                 TEST_CASE_ST(ut_setup, ut_teardown,
13182                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
13183                 TEST_CASE_ST(ut_setup, ut_teardown,
13184                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13185                 TEST_CASE_ST(ut_setup, ut_teardown,
13186                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13187                 TEST_CASES_END() /**< NULL terminate unit test array */
13188         }
13189 };
13190
13191 static struct unit_test_suite cryptodev_nitrox_testsuite  = {
13192         .suite_name = "Crypto NITROX Unit Test Suite",
13193         .setup = testsuite_setup,
13194         .teardown = testsuite_teardown,
13195         .unit_test_cases = {
13196                 TEST_CASE_ST(ut_setup, ut_teardown,
13197                              test_device_configure_invalid_dev_id),
13198                 TEST_CASE_ST(ut_setup, ut_teardown,
13199                                 test_device_configure_invalid_queue_pair_ids),
13200                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13201                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13202
13203                 TEST_CASES_END() /**< NULL terminate unit test array */
13204         }
13205 };
13206
13207 static struct unit_test_suite cryptodev_octeontx2_testsuite  = {
13208         .suite_name = "Crypto Device OCTEON TX2 Unit Test Suite",
13209         .setup = testsuite_setup,
13210         .teardown = testsuite_teardown,
13211         .unit_test_cases = {
13212                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13213                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13214                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13215                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13216                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13217
13218                 /** AES GCM Authenticated Encryption */
13219                 TEST_CASE_ST(ut_setup, ut_teardown,
13220                         test_AES_GCM_authenticated_encryption_test_case_1),
13221                 TEST_CASE_ST(ut_setup, ut_teardown,
13222                         test_AES_GCM_authenticated_encryption_test_case_2),
13223                 TEST_CASE_ST(ut_setup, ut_teardown,
13224                         test_AES_GCM_authenticated_encryption_test_case_3),
13225                 TEST_CASE_ST(ut_setup, ut_teardown,
13226                         test_AES_GCM_authenticated_encryption_test_case_4),
13227                 TEST_CASE_ST(ut_setup, ut_teardown,
13228                         test_AES_GCM_authenticated_encryption_test_case_5),
13229                 TEST_CASE_ST(ut_setup, ut_teardown,
13230                         test_AES_GCM_authenticated_encryption_test_case_6),
13231                 TEST_CASE_ST(ut_setup, ut_teardown,
13232                         test_AES_GCM_authenticated_encryption_test_case_7),
13233
13234                 /** AES GCM Authenticated Decryption */
13235                 TEST_CASE_ST(ut_setup, ut_teardown,
13236                         test_AES_GCM_authenticated_decryption_test_case_1),
13237                 TEST_CASE_ST(ut_setup, ut_teardown,
13238                         test_AES_GCM_authenticated_decryption_test_case_2),
13239                 TEST_CASE_ST(ut_setup, ut_teardown,
13240                         test_AES_GCM_authenticated_decryption_test_case_3),
13241                 TEST_CASE_ST(ut_setup, ut_teardown,
13242                         test_AES_GCM_authenticated_decryption_test_case_4),
13243                 TEST_CASE_ST(ut_setup, ut_teardown,
13244                         test_AES_GCM_authenticated_decryption_test_case_5),
13245                 TEST_CASE_ST(ut_setup, ut_teardown,
13246                         test_AES_GCM_authenticated_decryption_test_case_6),
13247                 TEST_CASE_ST(ut_setup, ut_teardown,
13248                         test_AES_GCM_authenticated_decryption_test_case_7),
13249                 /** AES GMAC Authentication */
13250                 TEST_CASE_ST(ut_setup, ut_teardown,
13251                         test_AES_GMAC_authentication_test_case_1),
13252                 TEST_CASE_ST(ut_setup, ut_teardown,
13253                         test_AES_GMAC_authentication_verify_test_case_1),
13254                 TEST_CASE_ST(ut_setup, ut_teardown,
13255                         test_AES_GMAC_authentication_test_case_2),
13256                 TEST_CASE_ST(ut_setup, ut_teardown,
13257                         test_AES_GMAC_authentication_verify_test_case_2),
13258                 TEST_CASE_ST(ut_setup, ut_teardown,
13259                         test_AES_GMAC_authentication_test_case_3),
13260                 TEST_CASE_ST(ut_setup, ut_teardown,
13261                         test_AES_GMAC_authentication_verify_test_case_3),
13262
13263                 /** SNOW 3G encrypt only (UEA2) */
13264                 TEST_CASE_ST(ut_setup, ut_teardown,
13265                         test_snow3g_encryption_test_case_1),
13266                 TEST_CASE_ST(ut_setup, ut_teardown,
13267                         test_snow3g_encryption_test_case_2),
13268                 TEST_CASE_ST(ut_setup, ut_teardown,
13269                         test_snow3g_encryption_test_case_3),
13270                 TEST_CASE_ST(ut_setup, ut_teardown,
13271                         test_snow3g_encryption_test_case_4),
13272                 TEST_CASE_ST(ut_setup, ut_teardown,
13273                         test_snow3g_encryption_test_case_5),
13274
13275                 TEST_CASE_ST(ut_setup, ut_teardown,
13276                         test_snow3g_encryption_test_case_1_oop),
13277                 TEST_CASE_ST(ut_setup, ut_teardown,
13278                         test_snow3g_decryption_test_case_1_oop),
13279                 TEST_CASE_ST(ut_setup, ut_teardown,
13280                         test_snow3g_encryption_test_case_1_oop_sgl),
13281
13282                 /** SNOW 3G decrypt only (UEA2) */
13283                 TEST_CASE_ST(ut_setup, ut_teardown,
13284                         test_snow3g_decryption_test_case_1),
13285                 TEST_CASE_ST(ut_setup, ut_teardown,
13286                         test_snow3g_decryption_test_case_2),
13287                 TEST_CASE_ST(ut_setup, ut_teardown,
13288                         test_snow3g_decryption_test_case_3),
13289                 TEST_CASE_ST(ut_setup, ut_teardown,
13290                         test_snow3g_decryption_test_case_4),
13291                 TEST_CASE_ST(ut_setup, ut_teardown,
13292                         test_snow3g_decryption_test_case_5),
13293
13294                 TEST_CASE_ST(ut_setup, ut_teardown,
13295                         test_snow3g_hash_generate_test_case_1),
13296                 TEST_CASE_ST(ut_setup, ut_teardown,
13297                         test_snow3g_hash_generate_test_case_2),
13298                 TEST_CASE_ST(ut_setup, ut_teardown,
13299                         test_snow3g_hash_generate_test_case_3),
13300                 TEST_CASE_ST(ut_setup, ut_teardown,
13301                         test_snow3g_hash_verify_test_case_1),
13302                 TEST_CASE_ST(ut_setup, ut_teardown,
13303                         test_snow3g_hash_verify_test_case_2),
13304                 TEST_CASE_ST(ut_setup, ut_teardown,
13305                         test_snow3g_hash_verify_test_case_3),
13306
13307                 /** ZUC encrypt only (EEA3) */
13308                 TEST_CASE_ST(ut_setup, ut_teardown,
13309                         test_zuc_encryption_test_case_1),
13310                 TEST_CASE_ST(ut_setup, ut_teardown,
13311                         test_zuc_encryption_test_case_2),
13312                 TEST_CASE_ST(ut_setup, ut_teardown,
13313                         test_zuc_encryption_test_case_3),
13314                 TEST_CASE_ST(ut_setup, ut_teardown,
13315                         test_zuc_encryption_test_case_4),
13316                 TEST_CASE_ST(ut_setup, ut_teardown,
13317                         test_zuc_encryption_test_case_5),
13318                 TEST_CASE_ST(ut_setup, ut_teardown,
13319                         test_zuc_hash_generate_test_case_1),
13320                 TEST_CASE_ST(ut_setup, ut_teardown,
13321                         test_zuc_hash_generate_test_case_2),
13322                 TEST_CASE_ST(ut_setup, ut_teardown,
13323                         test_zuc_hash_generate_test_case_3),
13324                 TEST_CASE_ST(ut_setup, ut_teardown,
13325                         test_zuc_hash_generate_test_case_4),
13326                 TEST_CASE_ST(ut_setup, ut_teardown,
13327                         test_zuc_hash_generate_test_case_5),
13328                 TEST_CASE_ST(ut_setup, ut_teardown,
13329                         test_zuc_encryption_test_case_6_sgl),
13330
13331                 /** KASUMI encrypt only (UEA1) */
13332                 TEST_CASE_ST(ut_setup, ut_teardown,
13333                         test_kasumi_encryption_test_case_1),
13334                 TEST_CASE_ST(ut_setup, ut_teardown,
13335                         test_kasumi_encryption_test_case_2),
13336                 TEST_CASE_ST(ut_setup, ut_teardown,
13337                         test_kasumi_encryption_test_case_3),
13338                 TEST_CASE_ST(ut_setup, ut_teardown,
13339                         test_kasumi_encryption_test_case_4),
13340                 TEST_CASE_ST(ut_setup, ut_teardown,
13341                         test_kasumi_encryption_test_case_5),
13342                 TEST_CASE_ST(ut_setup, ut_teardown,
13343                         test_kasumi_encryption_test_case_1_sgl),
13344                 TEST_CASE_ST(ut_setup, ut_teardown,
13345                         test_kasumi_encryption_test_case_1_oop_sgl),
13346                 /** KASUMI decrypt only (UEA1) */
13347                 TEST_CASE_ST(ut_setup, ut_teardown,
13348                         test_kasumi_decryption_test_case_1),
13349                 TEST_CASE_ST(ut_setup, ut_teardown,
13350                         test_kasumi_decryption_test_case_2),
13351                 TEST_CASE_ST(ut_setup, ut_teardown,
13352                         test_kasumi_decryption_test_case_3),
13353                 TEST_CASE_ST(ut_setup, ut_teardown,
13354                         test_kasumi_decryption_test_case_4),
13355                 TEST_CASE_ST(ut_setup, ut_teardown,
13356                         test_kasumi_decryption_test_case_5),
13357
13358                 TEST_CASE_ST(ut_setup, ut_teardown,
13359                         test_kasumi_encryption_test_case_1_oop),
13360                 TEST_CASE_ST(ut_setup, ut_teardown,
13361                         test_kasumi_decryption_test_case_1_oop),
13362
13363                 /** KASUMI hash only (UIA1) */
13364                 TEST_CASE_ST(ut_setup, ut_teardown,
13365                         test_kasumi_hash_generate_test_case_1),
13366                 TEST_CASE_ST(ut_setup, ut_teardown,
13367                         test_kasumi_hash_generate_test_case_2),
13368                 TEST_CASE_ST(ut_setup, ut_teardown,
13369                         test_kasumi_hash_generate_test_case_3),
13370                 TEST_CASE_ST(ut_setup, ut_teardown,
13371                         test_kasumi_hash_generate_test_case_4),
13372                 TEST_CASE_ST(ut_setup, ut_teardown,
13373                         test_kasumi_hash_generate_test_case_5),
13374                 TEST_CASE_ST(ut_setup, ut_teardown,
13375                         test_kasumi_hash_generate_test_case_6),
13376                 TEST_CASE_ST(ut_setup, ut_teardown,
13377                         test_kasumi_hash_verify_test_case_1),
13378                 TEST_CASE_ST(ut_setup, ut_teardown,
13379                         test_kasumi_hash_verify_test_case_2),
13380                 TEST_CASE_ST(ut_setup, ut_teardown,
13381                         test_kasumi_hash_verify_test_case_3),
13382                 TEST_CASE_ST(ut_setup, ut_teardown,
13383                         test_kasumi_hash_verify_test_case_4),
13384                 TEST_CASE_ST(ut_setup, ut_teardown,
13385                         test_kasumi_hash_verify_test_case_5),
13386
13387                 /** NULL tests */
13388                 TEST_CASE_ST(ut_setup, ut_teardown,
13389                         test_null_cipher_only_operation),
13390                 TEST_CASE_ST(ut_setup, ut_teardown,
13391                         test_null_auth_only_operation),
13392                 TEST_CASE_ST(ut_setup, ut_teardown,
13393                         test_null_cipher_auth_operation),
13394                 TEST_CASE_ST(ut_setup, ut_teardown,
13395                         test_null_auth_cipher_operation),
13396
13397                 /** Negative tests */
13398                 TEST_CASE_ST(ut_setup, ut_teardown,
13399                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13400                 TEST_CASE_ST(ut_setup, ut_teardown,
13401                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13402                 TEST_CASE_ST(ut_setup, ut_teardown,
13403                         authentication_verify_AES128_GMAC_fail_data_corrupt),
13404                 TEST_CASE_ST(ut_setup, ut_teardown,
13405                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
13406                 TEST_CASE_ST(ut_setup, ut_teardown,
13407                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13408                 TEST_CASE_ST(ut_setup, ut_teardown,
13409                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13410                 TEST_CASES_END() /**< NULL terminate unit test array */
13411         }
13412 };
13413
13414 static int
13415 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
13416 {
13417         gbl_driver_id = rte_cryptodev_driver_id_get(
13418                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
13419
13420         if (gbl_driver_id == -1) {
13421                 RTE_LOG(ERR, USER1, "QAT PMD must be loaded. Check that both "
13422                 "CONFIG_RTE_LIBRTE_PMD_QAT and CONFIG_RTE_LIBRTE_PMD_QAT_SYM "
13423                 "are enabled in config file to run this testsuite.\n");
13424                 return TEST_SKIPPED;
13425         }
13426
13427         return unit_test_suite_runner(&cryptodev_testsuite);
13428 }
13429
13430 static int
13431 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)
13432 {
13433         gbl_driver_id = rte_cryptodev_driver_id_get(
13434                         RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
13435
13436         if (gbl_driver_id == -1) {
13437                 RTE_LOG(ERR, USER1, "VIRTIO PMD must be loaded. Check if "
13438                                 "CONFIG_RTE_LIBRTE_PMD_VIRTIO_CRYPTO is enabled "
13439                                 "in config file to run this testsuite.\n");
13440                 return TEST_FAILED;
13441         }
13442
13443         return unit_test_suite_runner(&cryptodev_virtio_testsuite);
13444 }
13445
13446 static int
13447 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
13448 {
13449         gbl_driver_id = rte_cryptodev_driver_id_get(
13450                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13451
13452         if (gbl_driver_id == -1) {
13453                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded. Check if "
13454                                 "CONFIG_RTE_LIBRTE_PMD_AESNI_MB is enabled "
13455                                 "in config file to run this testsuite.\n");
13456                 return TEST_SKIPPED;
13457         }
13458
13459         return unit_test_suite_runner(&cryptodev_testsuite);
13460 }
13461
13462 static int
13463 test_cryptodev_cpu_aesni_mb(void)
13464 {
13465         int32_t rc;
13466         enum rte_security_session_action_type at;
13467
13468         gbl_driver_id = rte_cryptodev_driver_id_get(
13469                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13470
13471         if (gbl_driver_id == -1) {
13472                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded. Check if "
13473                                 "CONFIG_RTE_LIBRTE_PMD_AESNI_MB is enabled "
13474                                 "in config file to run this testsuite.\n");
13475                 return TEST_SKIPPED;
13476         }
13477
13478         at = gbl_action_type;
13479         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
13480         rc = unit_test_suite_runner(&cryptodev_testsuite);
13481         gbl_action_type = at;
13482         return rc;
13483 }
13484
13485 static int
13486 test_cryptodev_openssl(void)
13487 {
13488         gbl_driver_id = rte_cryptodev_driver_id_get(
13489                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
13490
13491         if (gbl_driver_id == -1) {
13492                 RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded. Check if "
13493                                 "CONFIG_RTE_LIBRTE_PMD_OPENSSL is enabled "
13494                                 "in config file to run this testsuite.\n");
13495                 return TEST_SKIPPED;
13496         }
13497
13498         return unit_test_suite_runner(&cryptodev_testsuite);
13499 }
13500
13501 static int
13502 test_cryptodev_aesni_gcm(void)
13503 {
13504         gbl_driver_id = rte_cryptodev_driver_id_get(
13505                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
13506
13507         if (gbl_driver_id == -1) {
13508                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded. Check if "
13509                                 "CONFIG_RTE_LIBRTE_PMD_AESNI_GCM is enabled "
13510                                 "in config file to run this testsuite.\n");
13511                 return TEST_SKIPPED;
13512         }
13513
13514         return unit_test_suite_runner(&cryptodev_testsuite);
13515 }
13516
13517 static int
13518 test_cryptodev_cpu_aesni_gcm(void)
13519 {
13520         int32_t rc;
13521         enum rte_security_session_action_type at;
13522
13523         gbl_driver_id = rte_cryptodev_driver_id_get(
13524                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
13525
13526         if (gbl_driver_id == -1) {
13527                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded. Check if "
13528                                 "CONFIG_RTE_LIBRTE_PMD_AESNI_GCM is enabled "
13529                                 "in config file to run this testsuite.\n");
13530                 return TEST_SKIPPED;
13531         }
13532
13533         at = gbl_action_type;
13534         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
13535         rc = unit_test_suite_runner(&cryptodev_testsuite);
13536         gbl_action_type = at;
13537         return rc;
13538 }
13539
13540 static int
13541 test_cryptodev_null(void)
13542 {
13543         gbl_driver_id = rte_cryptodev_driver_id_get(
13544                         RTE_STR(CRYPTODEV_NAME_NULL_PMD));
13545
13546         if (gbl_driver_id == -1) {
13547                 RTE_LOG(ERR, USER1, "NULL PMD must be loaded. Check if "
13548                                 "CONFIG_RTE_LIBRTE_PMD_NULL is enabled "
13549                                 "in config file to run this testsuite.\n");
13550                 return TEST_SKIPPED;
13551         }
13552
13553         return unit_test_suite_runner(&cryptodev_testsuite);
13554 }
13555
13556 static int
13557 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
13558 {
13559         gbl_driver_id = rte_cryptodev_driver_id_get(
13560                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
13561
13562         if (gbl_driver_id == -1) {
13563                 RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded. Check if "
13564                                 "CONFIG_RTE_LIBRTE_PMD_SNOW3G is enabled "
13565                                 "in config file to run this testsuite.\n");
13566                 return TEST_SKIPPED;
13567         }
13568
13569         return unit_test_suite_runner(&cryptodev_testsuite);
13570 }
13571
13572 static int
13573 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
13574 {
13575         gbl_driver_id = rte_cryptodev_driver_id_get(
13576                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
13577
13578         if (gbl_driver_id == -1) {
13579                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded. Check if "
13580                                 "CONFIG_RTE_LIBRTE_PMD_KASUMI is enabled "
13581                                 "in config file to run this testsuite.\n");
13582                 return TEST_SKIPPED;
13583         }
13584
13585         return unit_test_suite_runner(&cryptodev_testsuite);
13586 }
13587
13588 static int
13589 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
13590 {
13591         gbl_driver_id = rte_cryptodev_driver_id_get(
13592                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
13593
13594         if (gbl_driver_id == -1) {
13595                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded. Check if "
13596                                 "CONFIG_RTE_LIBRTE_PMD_ZUC is enabled "
13597                                 "in config file to run this testsuite.\n");
13598                 return TEST_SKIPPED;
13599         }
13600
13601         return unit_test_suite_runner(&cryptodev_testsuite);
13602 }
13603
13604 static int
13605 test_cryptodev_armv8(void)
13606 {
13607         gbl_driver_id = rte_cryptodev_driver_id_get(
13608                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
13609
13610         if (gbl_driver_id == -1) {
13611                 RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded. Check if "
13612                                 "CONFIG_RTE_LIBRTE_PMD_ARMV8 is enabled "
13613                                 "in config file to run this testsuite.\n");
13614                 return TEST_SKIPPED;
13615         }
13616
13617         return unit_test_suite_runner(&cryptodev_armv8_testsuite);
13618 }
13619
13620 static int
13621 test_cryptodev_mrvl(void)
13622 {
13623         gbl_driver_id = rte_cryptodev_driver_id_get(
13624                         RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
13625
13626         if (gbl_driver_id == -1) {
13627                 RTE_LOG(ERR, USER1, "MVSAM PMD must be loaded. Check if "
13628                                 "CONFIG_RTE_LIBRTE_PMD_MVSAM_CRYPTO is enabled "
13629                                 "in config file to run this testsuite.\n");
13630                 return TEST_SKIPPED;
13631         }
13632
13633         return unit_test_suite_runner(&cryptodev_mrvl_testsuite);
13634 }
13635
13636 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
13637
13638 static int
13639 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
13640 {
13641         gbl_driver_id = rte_cryptodev_driver_id_get(
13642                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
13643
13644         if (gbl_driver_id == -1) {
13645                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded. Check if "
13646                                 "CONFIG_RTE_LIBRTE_PMD_SCHEDULER is enabled "
13647                                 "in config file to run this testsuite.\n");
13648                 return TEST_SKIPPED;
13649         }
13650
13651         if (rte_cryptodev_driver_id_get(
13652                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
13653                 RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_AESNI_MB must be"
13654                         " enabled in config file to run this testsuite.\n");
13655                 return TEST_SKIPPED;
13656 }
13657         return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
13658 }
13659
13660 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
13661
13662 #endif
13663
13664 static int
13665 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)
13666 {
13667         gbl_driver_id = rte_cryptodev_driver_id_get(
13668                         RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
13669
13670         if (gbl_driver_id == -1) {
13671                 RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded. Check if "
13672                                 "CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC is enabled "
13673                                 "in config file to run this testsuite.\n");
13674                 return TEST_SKIPPED;
13675         }
13676
13677         return unit_test_suite_runner(&cryptodev_dpaa2_sec_testsuite);
13678 }
13679
13680 static int
13681 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)
13682 {
13683         gbl_driver_id = rte_cryptodev_driver_id_get(
13684                         RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
13685
13686         if (gbl_driver_id == -1) {
13687                 RTE_LOG(ERR, USER1, "DPAA SEC PMD must be loaded. Check if "
13688                                 "CONFIG_RTE_LIBRTE_PMD_DPAA_SEC is enabled "
13689                                 "in config file to run this testsuite.\n");
13690                 return TEST_SKIPPED;
13691         }
13692
13693         return unit_test_suite_runner(&cryptodev_dpaa_sec_testsuite);
13694 }
13695
13696 static int
13697 test_cryptodev_ccp(void)
13698 {
13699         gbl_driver_id = rte_cryptodev_driver_id_get(
13700                         RTE_STR(CRYPTODEV_NAME_CCP_PMD));
13701
13702         if (gbl_driver_id == -1) {
13703                 RTE_LOG(ERR, USER1, "CCP PMD must be loaded. Check if "
13704                                 "CONFIG_RTE_LIBRTE_PMD_CCP is enabled "
13705                                 "in config file to run this testsuite.\n");
13706                 return TEST_FAILED;
13707         }
13708
13709         return unit_test_suite_runner(&cryptodev_ccp_testsuite);
13710 }
13711
13712 static int
13713 test_cryptodev_octeontx(void)
13714 {
13715         gbl_driver_id = rte_cryptodev_driver_id_get(
13716                         RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
13717         if (gbl_driver_id == -1) {
13718                 RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded. Check if "
13719                                 "CONFIG_RTE_LIBRTE_PMD_OCTEONTX_CRYPTO is "
13720                                 "enabled in config file to run this "
13721                                 "testsuite.\n");
13722                 return TEST_FAILED;
13723         }
13724         return unit_test_suite_runner(&cryptodev_octeontx_testsuite);
13725 }
13726
13727 static int
13728 test_cryptodev_octeontx2(void)
13729 {
13730         gbl_driver_id = rte_cryptodev_driver_id_get(
13731                         RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
13732         if (gbl_driver_id == -1) {
13733                 RTE_LOG(ERR, USER1, "OCTEON TX2 PMD must be loaded. Check if "
13734                                 "CONFIG_RTE_LIBRTE_PMD_OCTEONTX2_CRYPTO is "
13735                                 "enabled in config file to run this "
13736                                 "testsuite.\n");
13737                 return TEST_FAILED;
13738         }
13739         return unit_test_suite_runner(&cryptodev_octeontx2_testsuite);
13740 }
13741
13742 static int
13743 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)
13744 {
13745         gbl_driver_id = rte_cryptodev_driver_id_get(
13746                         RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
13747
13748         if (gbl_driver_id == -1) {
13749                 RTE_LOG(ERR, USER1, "CAAM_JR PMD must be loaded. Check if "
13750                                 "CONFIG_RTE_LIBRTE_PMD_CAAM_JR is enabled "
13751                                 "in config file to run this testsuite.\n");
13752                 return TEST_FAILED;
13753         }
13754
13755         return unit_test_suite_runner(&cryptodev_caam_jr_testsuite);
13756 }
13757
13758 static int
13759 test_cryptodev_nitrox(void)
13760 {
13761         gbl_driver_id = rte_cryptodev_driver_id_get(
13762                         RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
13763
13764         if (gbl_driver_id == -1) {
13765                 RTE_LOG(ERR, USER1, "NITROX PMD must be loaded. Check if "
13766                                 "CONFIG_RTE_LIBRTE_PMD_NITROX is enabled "
13767                                 "in config file to run this testsuite.\n");
13768                 return TEST_FAILED;
13769         }
13770
13771         return unit_test_suite_runner(&cryptodev_nitrox_testsuite);
13772 }
13773
13774 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
13775 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
13776 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
13777         test_cryptodev_cpu_aesni_mb);
13778 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
13779 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
13780 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
13781         test_cryptodev_cpu_aesni_gcm);
13782 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
13783 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
13784 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
13785 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
13786 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
13787 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
13788 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
13789 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
13790 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
13791 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
13792 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
13793 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
13794 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
13795 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);