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