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