d68855c442d9732724145dfb1e49f52b84ef4e3c
[dpdk.git] / app / test / test_cryptodev.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2020 Intel Corporation
3  * Copyright 2020 NXP
4  */
5
6 #include <time.h>
7
8 #include <rte_common.h>
9 #include <rte_hexdump.h>
10 #include <rte_mbuf.h>
11 #include <rte_malloc.h>
12 #include <rte_memcpy.h>
13 #include <rte_pause.h>
14 #include <rte_bus_vdev.h>
15 #include <rte_ether.h>
16
17 #include <rte_crypto.h>
18 #include <rte_cryptodev.h>
19 #include <rte_cryptodev_pmd.h>
20 #include <rte_string_fns.h>
21
22 #ifdef RTE_CRYPTO_SCHEDULER
23 #include <rte_cryptodev_scheduler.h>
24 #include <rte_cryptodev_scheduler_operations.h>
25 #endif
26
27 #include <rte_lcore.h>
28
29 #include "test.h"
30 #include "test_cryptodev.h"
31
32 #include "test_cryptodev_blockcipher.h"
33 #include "test_cryptodev_aes_test_vectors.h"
34 #include "test_cryptodev_des_test_vectors.h"
35 #include "test_cryptodev_hash_test_vectors.h"
36 #include "test_cryptodev_kasumi_test_vectors.h"
37 #include "test_cryptodev_kasumi_hash_test_vectors.h"
38 #include "test_cryptodev_snow3g_test_vectors.h"
39 #include "test_cryptodev_snow3g_hash_test_vectors.h"
40 #include "test_cryptodev_zuc_test_vectors.h"
41 #include "test_cryptodev_aead_test_vectors.h"
42 #include "test_cryptodev_hmac_test_vectors.h"
43 #include "test_cryptodev_mixed_test_vectors.h"
44 #ifdef RTE_LIB_SECURITY
45 #include "test_cryptodev_security_pdcp_test_vectors.h"
46 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
47 #include "test_cryptodev_security_pdcp_test_func.h"
48 #include "test_cryptodev_security_docsis_test_vectors.h"
49
50 #define SDAP_DISABLED   0
51 #define SDAP_ENABLED    1
52 #endif
53
54 #define VDEV_ARGS_SIZE 100
55 #define MAX_NB_SESSIONS 4
56
57 #define MAX_DRV_SERVICE_CTX_SIZE 256
58
59 #define MAX_RAW_DEQUEUE_COUNT   65535
60
61 #define IN_PLACE 0
62 #define OUT_OF_PLACE 1
63
64 #ifndef ARRAY_SIZE
65 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
66 #endif
67
68 static int gbl_driver_id;
69
70 static enum rte_security_session_action_type gbl_action_type =
71         RTE_SECURITY_ACTION_TYPE_NONE;
72
73 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
74
75 struct crypto_testsuite_params {
76         struct rte_mempool *mbuf_pool;
77         struct rte_mempool *large_mbuf_pool;
78         struct rte_mempool *op_mpool;
79         struct rte_mempool *session_mpool;
80         struct rte_mempool *session_priv_mpool;
81         struct rte_cryptodev_config conf;
82         struct rte_cryptodev_qp_conf qp_conf;
83
84         uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
85         uint8_t valid_dev_count;
86 };
87
88 struct crypto_unittest_params {
89         struct rte_crypto_sym_xform cipher_xform;
90         struct rte_crypto_sym_xform auth_xform;
91         struct rte_crypto_sym_xform aead_xform;
92 #ifdef RTE_LIB_SECURITY
93         struct rte_security_docsis_xform docsis_xform;
94 #endif
95
96         union {
97                 struct rte_cryptodev_sym_session *sess;
98 #ifdef RTE_LIB_SECURITY
99                 struct rte_security_session *sec_session;
100 #endif
101         };
102 #ifdef RTE_LIB_SECURITY
103         enum rte_security_session_action_type type;
104 #endif
105         struct rte_crypto_op *op;
106
107         struct rte_mbuf *obuf, *ibuf;
108
109         uint8_t *digest;
110 };
111
112 #define ALIGN_POW2_ROUNDUP(num, align) \
113         (((num) + (align) - 1) & ~((align) - 1))
114
115 /*
116  * Forward declarations.
117  */
118 static int
119 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
120                 struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
121                 uint8_t *hmac_key);
122
123 static int
124 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
125                 struct crypto_unittest_params *ut_params,
126                 struct crypto_testsuite_params *ts_param,
127                 const uint8_t *cipher,
128                 const uint8_t *digest,
129                 const uint8_t *iv);
130
131 static struct rte_mbuf *
132 setup_test_string(struct rte_mempool *mpool,
133                 const char *string, size_t len, uint8_t blocksize)
134 {
135         struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
136         size_t t_len = len - (blocksize ? (len % blocksize) : 0);
137
138         memset(m->buf_addr, 0, m->buf_len);
139         if (m) {
140                 char *dst = rte_pktmbuf_append(m, t_len);
141
142                 if (!dst) {
143                         rte_pktmbuf_free(m);
144                         return NULL;
145                 }
146                 if (string != NULL)
147                         rte_memcpy(dst, string, t_len);
148                 else
149                         memset(dst, 0, t_len);
150         }
151
152         return m;
153 }
154
155 /* Get number of bytes in X bits (rounding up) */
156 static uint32_t
157 ceil_byte_length(uint32_t num_bits)
158 {
159         if (num_bits % 8)
160                 return ((num_bits >> 3) + 1);
161         else
162                 return (num_bits >> 3);
163 }
164
165 static uint32_t
166 get_raw_dp_dequeue_count(void *user_data __rte_unused)
167 {
168         return 1;
169 }
170
171 static void
172 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,
173                 uint8_t is_op_success)
174 {
175         struct rte_crypto_op *op = user_data;
176         op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
177                         RTE_CRYPTO_OP_STATUS_ERROR;
178 }
179
180 void
181 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
182                 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
183                 uint8_t len_in_bits, uint8_t cipher_iv_len)
184 {
185         struct rte_crypto_sym_op *sop = op->sym;
186         struct rte_crypto_op *ret_op = NULL;
187         struct rte_crypto_vec data_vec[UINT8_MAX];
188         struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
189         union rte_crypto_sym_ofs ofs;
190         struct rte_crypto_sym_vec vec;
191         struct rte_crypto_sgl sgl;
192         uint32_t max_len;
193         union rte_cryptodev_session_ctx sess;
194         uint32_t count = 0;
195         struct rte_crypto_raw_dp_ctx *ctx;
196         uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
197                         auth_len = 0;
198         int32_t n;
199         uint32_t n_success;
200         int ctx_service_size;
201         int32_t status = 0;
202         int enqueue_status, dequeue_status;
203
204         ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
205         if (ctx_service_size < 0) {
206                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
207                 return;
208         }
209
210         ctx = malloc(ctx_service_size);
211         if (!ctx) {
212                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
213                 return;
214         }
215
216         /* Both are enums, setting crypto_sess will suit any session type */
217         sess.crypto_sess = op->sym->session;
218
219         if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
220                         op->sess_type, sess, 0) < 0) {
221                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
222                 goto exit;
223         }
224
225         cipher_iv.iova = 0;
226         cipher_iv.va = NULL;
227         aad_auth_iv.iova = 0;
228         aad_auth_iv.va = NULL;
229         digest.iova = 0;
230         digest.va = NULL;
231         sgl.vec = data_vec;
232         vec.num = 1;
233         vec.sgl = &sgl;
234         vec.iv = &cipher_iv;
235         vec.digest = &digest;
236         vec.aad = &aad_auth_iv;
237         vec.status = &status;
238
239         ofs.raw = 0;
240
241         if (is_cipher && is_auth) {
242                 cipher_offset = sop->cipher.data.offset;
243                 cipher_len = sop->cipher.data.length;
244                 auth_offset = sop->auth.data.offset;
245                 auth_len = sop->auth.data.length;
246                 max_len = RTE_MAX(cipher_offset + cipher_len,
247                                 auth_offset + auth_len);
248                 if (len_in_bits) {
249                         max_len = max_len >> 3;
250                         cipher_offset = cipher_offset >> 3;
251                         auth_offset = auth_offset >> 3;
252                         cipher_len = cipher_len >> 3;
253                         auth_len = auth_len >> 3;
254                 }
255                 ofs.ofs.cipher.head = cipher_offset;
256                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
257                 ofs.ofs.auth.head = auth_offset;
258                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
259                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
260                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
261                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
262                                 op, void *, IV_OFFSET + cipher_iv_len);
263                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
264                                 cipher_iv_len);
265                 digest.va = (void *)sop->auth.digest.data;
266                 digest.iova = sop->auth.digest.phys_addr;
267
268         } else if (is_cipher) {
269                 cipher_offset = sop->cipher.data.offset;
270                 cipher_len = sop->cipher.data.length;
271                 max_len = cipher_len + cipher_offset;
272                 if (len_in_bits) {
273                         max_len = max_len >> 3;
274                         cipher_offset = cipher_offset >> 3;
275                         cipher_len = cipher_len >> 3;
276                 }
277                 ofs.ofs.cipher.head = cipher_offset;
278                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
279                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
280                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
281
282         } else if (is_auth) {
283                 auth_offset = sop->auth.data.offset;
284                 auth_len = sop->auth.data.length;
285                 max_len = auth_len + auth_offset;
286                 if (len_in_bits) {
287                         max_len = max_len >> 3;
288                         auth_offset = auth_offset >> 3;
289                         auth_len = auth_len >> 3;
290                 }
291                 ofs.ofs.auth.head = auth_offset;
292                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
293                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
294                                 op, void *, IV_OFFSET + cipher_iv_len);
295                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
296                                 cipher_iv_len);
297                 digest.va = (void *)sop->auth.digest.data;
298                 digest.iova = sop->auth.digest.phys_addr;
299
300         } else { /* aead */
301                 cipher_offset = sop->aead.data.offset;
302                 cipher_len = sop->aead.data.length;
303                 max_len = cipher_len + cipher_offset;
304                 if (len_in_bits) {
305                         max_len = max_len >> 3;
306                         cipher_offset = cipher_offset >> 3;
307                         cipher_len = cipher_len >> 3;
308                 }
309                 ofs.ofs.cipher.head = cipher_offset;
310                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
311                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
312                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
313                 aad_auth_iv.va = (void *)sop->aead.aad.data;
314                 aad_auth_iv.iova = sop->aead.aad.phys_addr;
315                 digest.va = (void *)sop->aead.digest.data;
316                 digest.iova = sop->aead.digest.phys_addr;
317         }
318
319         n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
320                         data_vec, RTE_DIM(data_vec));
321         if (n < 0 || n > sop->m_src->nb_segs) {
322                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
323                 goto exit;
324         }
325
326         sgl.num = n;
327
328         if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
329                         &enqueue_status) < 1) {
330                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
331                 goto exit;
332         }
333
334         if (enqueue_status == 0) {
335                 status = rte_cryptodev_raw_enqueue_done(ctx, 1);
336                 if (status < 0) {
337                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
338                         goto exit;
339                 }
340         } else if (enqueue_status < 0) {
341                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
342                 goto exit;
343         }
344
345         n = n_success = 0;
346         while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
347                 n = rte_cryptodev_raw_dequeue_burst(ctx,
348                         get_raw_dp_dequeue_count, post_process_raw_dp_op,
349                                 (void **)&ret_op, 0, &n_success,
350                                 &dequeue_status);
351                 if (dequeue_status < 0) {
352                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
353                         goto exit;
354                 }
355                 if (n == 0)
356                         rte_pause();
357         }
358
359         if (n == 1 && dequeue_status == 0) {
360                 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
361                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
362                         goto exit;
363                 }
364         }
365
366         op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
367                         n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
368                                         RTE_CRYPTO_OP_STATUS_SUCCESS;
369
370 exit:
371         free(ctx);
372 }
373
374 static void
375 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
376 {
377         int32_t n, st;
378         struct rte_crypto_sym_op *sop;
379         union rte_crypto_sym_ofs ofs;
380         struct rte_crypto_sgl sgl;
381         struct rte_crypto_sym_vec symvec;
382         struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
383         struct rte_crypto_vec vec[UINT8_MAX];
384
385         sop = op->sym;
386
387         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
388                 sop->aead.data.length, vec, RTE_DIM(vec));
389
390         if (n < 0 || n != sop->m_src->nb_segs) {
391                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
392                 return;
393         }
394
395         sgl.vec = vec;
396         sgl.num = n;
397         symvec.sgl = &sgl;
398         symvec.iv = &iv_ptr;
399         symvec.digest = &digest_ptr;
400         symvec.aad = &aad_ptr;
401         symvec.status = &st;
402         symvec.num = 1;
403
404         /* for CPU crypto the IOVA address is not required */
405         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
406         digest_ptr.va = (void *)sop->aead.digest.data;
407         aad_ptr.va = (void *)sop->aead.aad.data;
408
409         ofs.raw = 0;
410
411         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
412                 &symvec);
413
414         if (n != 1)
415                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
416         else
417                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
418 }
419
420 static void
421 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
422 {
423         int32_t n, st;
424         struct rte_crypto_sym_op *sop;
425         union rte_crypto_sym_ofs ofs;
426         struct rte_crypto_sgl sgl;
427         struct rte_crypto_sym_vec symvec;
428         struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
429         struct rte_crypto_vec vec[UINT8_MAX];
430
431         sop = op->sym;
432
433         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
434                 sop->auth.data.length, vec, RTE_DIM(vec));
435
436         if (n < 0 || n != sop->m_src->nb_segs) {
437                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
438                 return;
439         }
440
441         sgl.vec = vec;
442         sgl.num = n;
443         symvec.sgl = &sgl;
444         symvec.iv = &iv_ptr;
445         symvec.digest = &digest_ptr;
446         symvec.status = &st;
447         symvec.num = 1;
448
449         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
450         digest_ptr.va = (void *)sop->auth.digest.data;
451
452         ofs.raw = 0;
453         ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
454         ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
455                 (sop->cipher.data.offset + sop->cipher.data.length);
456
457         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
458                 &symvec);
459
460         if (n != 1)
461                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
462         else
463                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
464 }
465
466 static struct rte_crypto_op *
467 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
468 {
469
470         RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
471
472         if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
473                 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
474                 return NULL;
475         }
476
477         op = NULL;
478
479         while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
480                 rte_pause();
481
482         if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
483                 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
484                 return NULL;
485         }
486
487         return op;
488 }
489
490 static struct crypto_testsuite_params testsuite_params = { NULL };
491 static struct crypto_unittest_params unittest_params;
492
493 static int
494 testsuite_setup(void)
495 {
496         struct crypto_testsuite_params *ts_params = &testsuite_params;
497         struct rte_cryptodev_info info;
498         uint32_t i = 0, nb_devs, dev_id;
499         int ret;
500         uint16_t qp_id;
501
502         memset(ts_params, 0, sizeof(*ts_params));
503
504         ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
505         if (ts_params->mbuf_pool == NULL) {
506                 /* Not already created so create */
507                 ts_params->mbuf_pool = rte_pktmbuf_pool_create(
508                                 "CRYPTO_MBUFPOOL",
509                                 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
510                                 rte_socket_id());
511                 if (ts_params->mbuf_pool == NULL) {
512                         RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
513                         return TEST_FAILED;
514                 }
515         }
516
517         ts_params->large_mbuf_pool = rte_mempool_lookup(
518                         "CRYPTO_LARGE_MBUFPOOL");
519         if (ts_params->large_mbuf_pool == NULL) {
520                 /* Not already created so create */
521                 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
522                                 "CRYPTO_LARGE_MBUFPOOL",
523                                 1, 0, 0, UINT16_MAX,
524                                 rte_socket_id());
525                 if (ts_params->large_mbuf_pool == NULL) {
526                         RTE_LOG(ERR, USER1,
527                                 "Can't create CRYPTO_LARGE_MBUFPOOL\n");
528                         return TEST_FAILED;
529                 }
530         }
531
532         ts_params->op_mpool = rte_crypto_op_pool_create(
533                         "MBUF_CRYPTO_SYM_OP_POOL",
534                         RTE_CRYPTO_OP_TYPE_SYMMETRIC,
535                         NUM_MBUFS, MBUF_CACHE_SIZE,
536                         DEFAULT_NUM_XFORMS *
537                         sizeof(struct rte_crypto_sym_xform) +
538                         MAXIMUM_IV_LENGTH,
539                         rte_socket_id());
540         if (ts_params->op_mpool == NULL) {
541                 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
542                 return TEST_FAILED;
543         }
544
545         /* Create an AESNI MB device if required */
546         if (gbl_driver_id == rte_cryptodev_driver_id_get(
547                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) {
548                 nb_devs = rte_cryptodev_device_count_by_driver(
549                                 rte_cryptodev_driver_id_get(
550                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
551                 if (nb_devs < 1) {
552                         ret = rte_vdev_init(
553                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);
554
555                         TEST_ASSERT(ret == 0,
556                                 "Failed to create instance of"
557                                 " pmd : %s",
558                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
559                 }
560         }
561
562         /* Create an AESNI GCM device if required */
563         if (gbl_driver_id == rte_cryptodev_driver_id_get(
564                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) {
565                 nb_devs = rte_cryptodev_device_count_by_driver(
566                                 rte_cryptodev_driver_id_get(
567                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)));
568                 if (nb_devs < 1) {
569                         TEST_ASSERT_SUCCESS(rte_vdev_init(
570                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL),
571                                 "Failed to create instance of"
572                                 " pmd : %s",
573                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
574                 }
575         }
576
577         /* Create a SNOW 3G device if required */
578         if (gbl_driver_id == rte_cryptodev_driver_id_get(
579                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) {
580                 nb_devs = rte_cryptodev_device_count_by_driver(
581                                 rte_cryptodev_driver_id_get(
582                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)));
583                 if (nb_devs < 1) {
584                         TEST_ASSERT_SUCCESS(rte_vdev_init(
585                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL),
586                                 "Failed to create instance of"
587                                 " pmd : %s",
588                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
589                 }
590         }
591
592         /* Create a KASUMI device if required */
593         if (gbl_driver_id == rte_cryptodev_driver_id_get(
594                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))) {
595                 nb_devs = rte_cryptodev_device_count_by_driver(
596                                 rte_cryptodev_driver_id_get(
597                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)));
598                 if (nb_devs < 1) {
599                         TEST_ASSERT_SUCCESS(rte_vdev_init(
600                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL),
601                                 "Failed to create instance of"
602                                 " pmd : %s",
603                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
604                 }
605         }
606
607         /* Create a ZUC device if required */
608         if (gbl_driver_id == rte_cryptodev_driver_id_get(
609                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) {
610                 nb_devs = rte_cryptodev_device_count_by_driver(
611                                 rte_cryptodev_driver_id_get(
612                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD)));
613                 if (nb_devs < 1) {
614                         TEST_ASSERT_SUCCESS(rte_vdev_init(
615                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL),
616                                 "Failed to create instance of"
617                                 " pmd : %s",
618                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
619                 }
620         }
621
622         /* Create a NULL device if required */
623         if (gbl_driver_id == rte_cryptodev_driver_id_get(
624                         RTE_STR(CRYPTODEV_NAME_NULL_PMD))) {
625                 nb_devs = rte_cryptodev_device_count_by_driver(
626                                 rte_cryptodev_driver_id_get(
627                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD)));
628                 if (nb_devs < 1) {
629                         ret = rte_vdev_init(
630                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL);
631
632                         TEST_ASSERT(ret == 0,
633                                 "Failed to create instance of"
634                                 " pmd : %s",
635                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD));
636                 }
637         }
638
639         /* Create an OPENSSL device if required */
640         if (gbl_driver_id == rte_cryptodev_driver_id_get(
641                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) {
642                 nb_devs = rte_cryptodev_device_count_by_driver(
643                                 rte_cryptodev_driver_id_get(
644                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)));
645                 if (nb_devs < 1) {
646                         ret = rte_vdev_init(
647                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),
648                                 NULL);
649
650                         TEST_ASSERT(ret == 0, "Failed to create "
651                                 "instance of pmd : %s",
652                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
653                 }
654         }
655
656         /* Create a ARMv8 device if required */
657         if (gbl_driver_id == rte_cryptodev_driver_id_get(
658                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) {
659                 nb_devs = rte_cryptodev_device_count_by_driver(
660                                 rte_cryptodev_driver_id_get(
661                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)));
662                 if (nb_devs < 1) {
663                         ret = rte_vdev_init(
664                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD),
665                                 NULL);
666
667                         TEST_ASSERT(ret == 0, "Failed to create "
668                                 "instance of pmd : %s",
669                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
670                 }
671         }
672
673         /* Create a MVSAM device if required */
674         if (gbl_driver_id == rte_cryptodev_driver_id_get(
675                         RTE_STR(CRYPTODEV_NAME_MVSAM_PMD))) {
676                 nb_devs = rte_cryptodev_device_count_by_driver(
677                                 rte_cryptodev_driver_id_get(
678                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)));
679                 if (nb_devs < 1) {
680                         ret = rte_vdev_init(
681                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD),
682                                 NULL);
683
684                         TEST_ASSERT(ret == 0, "Failed to create "
685                                 "instance of pmd : %s",
686                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
687                 }
688         }
689
690         /* Create an CCP device if required */
691         if (gbl_driver_id == rte_cryptodev_driver_id_get(
692                         RTE_STR(CRYPTODEV_NAME_CCP_PMD))) {
693                 nb_devs = rte_cryptodev_device_count_by_driver(
694                                 rte_cryptodev_driver_id_get(
695                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD)));
696                 if (nb_devs < 1) {
697                         ret = rte_vdev_init(
698                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD),
699                                 NULL);
700
701                         TEST_ASSERT(ret == 0, "Failed to create "
702                                 "instance of pmd : %s",
703                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD));
704                 }
705         }
706
707 #ifdef RTE_CRYPTO_SCHEDULER
708         char vdev_args[VDEV_ARGS_SIZE] = {""};
709         char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
710                 "ordering=enable,name=cryptodev_test_scheduler,corelist="};
711         uint16_t worker_core_count = 0;
712         uint16_t socket_id = 0;
713
714         if (gbl_driver_id == rte_cryptodev_driver_id_get(
715                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
716
717                 /* Identify the Worker Cores
718                  * Use 2 worker cores for the device args
719                  */
720                 RTE_LCORE_FOREACH_WORKER(i) {
721                         if (worker_core_count > 1)
722                                 break;
723                         snprintf(vdev_args, sizeof(vdev_args),
724                                         "%s%d", temp_str, i);
725                         strcpy(temp_str, vdev_args);
726                         strlcat(temp_str, ";", sizeof(temp_str));
727                         worker_core_count++;
728                         socket_id = rte_lcore_to_socket_id(i);
729                 }
730                 if (worker_core_count != 2) {
731                         RTE_LOG(ERR, USER1,
732                                 "Cryptodev scheduler test require at least "
733                                 "two worker cores to run. "
734                                 "Please use the correct coremask.\n");
735                         return TEST_FAILED;
736                 }
737                 strcpy(temp_str, vdev_args);
738                 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
739                                 temp_str, socket_id);
740                 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
741                 nb_devs = rte_cryptodev_device_count_by_driver(
742                                 rte_cryptodev_driver_id_get(
743                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
744                 if (nb_devs < 1) {
745                         ret = rte_vdev_init(
746                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
747                                         vdev_args);
748                         TEST_ASSERT(ret == 0,
749                                 "Failed to create instance %u of"
750                                 " pmd : %s",
751                                 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
752                 }
753         }
754 #endif /* RTE_CRYPTO_SCHEDULER */
755
756         nb_devs = rte_cryptodev_count();
757         if (nb_devs < 1) {
758                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
759                 return TEST_SKIPPED;
760         }
761
762         /* Create list of valid crypto devs */
763         for (i = 0; i < nb_devs; i++) {
764                 rte_cryptodev_info_get(i, &info);
765                 if (info.driver_id == gbl_driver_id)
766                         ts_params->valid_devs[ts_params->valid_dev_count++] = i;
767         }
768
769         if (ts_params->valid_dev_count < 1)
770                 return TEST_FAILED;
771
772         /* Set up all the qps on the first of the valid devices found */
773
774         dev_id = ts_params->valid_devs[0];
775
776         rte_cryptodev_info_get(dev_id, &info);
777
778         ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
779         ts_params->conf.socket_id = SOCKET_ID_ANY;
780         ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
781
782         unsigned int session_size =
783                 rte_cryptodev_sym_get_private_session_size(dev_id);
784
785 #ifdef RTE_LIB_SECURITY
786         unsigned int security_session_size = rte_security_session_get_size(
787                         rte_cryptodev_get_sec_ctx(dev_id));
788
789         if (session_size < security_session_size)
790                 session_size = security_session_size;
791 #endif
792         /*
793          * Create mempool with maximum number of sessions.
794          */
795         if (info.sym.max_nb_sessions != 0 &&
796                         info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
797                 RTE_LOG(ERR, USER1, "Device does not support "
798                                 "at least %u sessions\n",
799                                 MAX_NB_SESSIONS);
800                 return TEST_FAILED;
801         }
802
803         ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
804                         "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
805                         SOCKET_ID_ANY);
806         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
807                         "session mempool allocation failed");
808
809         ts_params->session_priv_mpool = rte_mempool_create(
810                         "test_sess_mp_priv",
811                         MAX_NB_SESSIONS,
812                         session_size,
813                         0, 0, NULL, NULL, NULL,
814                         NULL, SOCKET_ID_ANY,
815                         0);
816         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
817                         "session mempool allocation failed");
818
819
820
821         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
822                         &ts_params->conf),
823                         "Failed to configure cryptodev %u with %u qps",
824                         dev_id, ts_params->conf.nb_queue_pairs);
825
826         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
827         ts_params->qp_conf.mp_session = ts_params->session_mpool;
828         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
829
830         for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
831                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
832                         dev_id, qp_id, &ts_params->qp_conf,
833                         rte_cryptodev_socket_id(dev_id)),
834                         "Failed to setup queue pair %u on cryptodev %u",
835                         qp_id, dev_id);
836         }
837
838         return TEST_SUCCESS;
839 }
840
841 static void
842 testsuite_teardown(void)
843 {
844         struct crypto_testsuite_params *ts_params = &testsuite_params;
845         int res;
846
847         if (ts_params->mbuf_pool != NULL) {
848                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
849                 rte_mempool_avail_count(ts_params->mbuf_pool));
850         }
851
852         if (ts_params->op_mpool != NULL) {
853                 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
854                 rte_mempool_avail_count(ts_params->op_mpool));
855         }
856
857         /* Free session mempools */
858         if (ts_params->session_priv_mpool != NULL) {
859                 rte_mempool_free(ts_params->session_priv_mpool);
860                 ts_params->session_priv_mpool = NULL;
861         }
862
863         if (ts_params->session_mpool != NULL) {
864                 rte_mempool_free(ts_params->session_mpool);
865                 ts_params->session_mpool = NULL;
866         }
867
868         res = rte_cryptodev_close(ts_params->valid_devs[0]);
869         if (res)
870                 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
871 }
872
873 static int
874 dev_configure_and_start(uint64_t ff_disable)
875 {
876         struct crypto_testsuite_params *ts_params = &testsuite_params;
877         struct crypto_unittest_params *ut_params = &unittest_params;
878
879         uint16_t qp_id;
880
881         /* Clear unit test parameters before running test */
882         memset(ut_params, 0, sizeof(*ut_params));
883
884         /* Reconfigure device to default parameters */
885         ts_params->conf.socket_id = SOCKET_ID_ANY;
886         ts_params->conf.ff_disable = ff_disable;
887         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
888         ts_params->qp_conf.mp_session = ts_params->session_mpool;
889         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
890
891         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
892                         &ts_params->conf),
893                         "Failed to configure cryptodev %u",
894                         ts_params->valid_devs[0]);
895
896         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
897                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
898                         ts_params->valid_devs[0], qp_id,
899                         &ts_params->qp_conf,
900                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
901                         "Failed to setup queue pair %u on cryptodev %u",
902                         qp_id, ts_params->valid_devs[0]);
903         }
904
905
906         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
907
908         /* Start the device */
909         TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
910                         "Failed to start cryptodev %u",
911                         ts_params->valid_devs[0]);
912
913         return TEST_SUCCESS;
914 }
915
916 static int
917 ut_setup(void)
918 {
919         /* Configure and start the device with security feature disabled */
920         return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
921 }
922
923 static int
924 ut_setup_security(void)
925 {
926         /* Configure and start the device with no features disabled */
927         return dev_configure_and_start(0);
928 }
929
930 static void
931 ut_teardown(void)
932 {
933         struct crypto_testsuite_params *ts_params = &testsuite_params;
934         struct crypto_unittest_params *ut_params = &unittest_params;
935         struct rte_cryptodev_stats stats;
936
937         /* free crypto session structure */
938 #ifdef RTE_LIB_SECURITY
939         if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
940                 if (ut_params->sec_session) {
941                         rte_security_session_destroy(rte_cryptodev_get_sec_ctx
942                                                 (ts_params->valid_devs[0]),
943                                                 ut_params->sec_session);
944                         ut_params->sec_session = NULL;
945                 }
946         } else
947 #endif
948         {
949                 if (ut_params->sess) {
950                         rte_cryptodev_sym_session_clear(
951                                         ts_params->valid_devs[0],
952                                         ut_params->sess);
953                         rte_cryptodev_sym_session_free(ut_params->sess);
954                         ut_params->sess = NULL;
955                 }
956         }
957
958         /* free crypto operation structure */
959         if (ut_params->op)
960                 rte_crypto_op_free(ut_params->op);
961
962         /*
963          * free mbuf - both obuf and ibuf are usually the same,
964          * so check if they point at the same address is necessary,
965          * to avoid freeing the mbuf twice.
966          */
967         if (ut_params->obuf) {
968                 rte_pktmbuf_free(ut_params->obuf);
969                 if (ut_params->ibuf == ut_params->obuf)
970                         ut_params->ibuf = 0;
971                 ut_params->obuf = 0;
972         }
973         if (ut_params->ibuf) {
974                 rte_pktmbuf_free(ut_params->ibuf);
975                 ut_params->ibuf = 0;
976         }
977
978         if (ts_params->mbuf_pool != NULL)
979                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
980                         rte_mempool_avail_count(ts_params->mbuf_pool));
981
982         rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
983
984         /* Stop the device */
985         rte_cryptodev_stop(ts_params->valid_devs[0]);
986 }
987
988 static int
989 test_device_configure_invalid_dev_id(void)
990 {
991         struct crypto_testsuite_params *ts_params = &testsuite_params;
992         uint16_t dev_id, num_devs = 0;
993
994         TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
995                         "Need at least %d devices for test", 1);
996
997         /* valid dev_id values */
998         dev_id = ts_params->valid_devs[0];
999
1000         /* Stop the device in case it's started so it can be configured */
1001         rte_cryptodev_stop(dev_id);
1002
1003         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1004                         "Failed test for rte_cryptodev_configure: "
1005                         "invalid dev_num %u", dev_id);
1006
1007         /* invalid dev_id values */
1008         dev_id = num_devs;
1009
1010         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1011                         "Failed test for rte_cryptodev_configure: "
1012                         "invalid dev_num %u", dev_id);
1013
1014         dev_id = 0xff;
1015
1016         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1017                         "Failed test for rte_cryptodev_configure:"
1018                         "invalid dev_num %u", dev_id);
1019
1020         return TEST_SUCCESS;
1021 }
1022
1023 static int
1024 test_device_configure_invalid_queue_pair_ids(void)
1025 {
1026         struct crypto_testsuite_params *ts_params = &testsuite_params;
1027         uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1028
1029         /* Stop the device in case it's started so it can be configured */
1030         rte_cryptodev_stop(ts_params->valid_devs[0]);
1031
1032         /* valid - max value queue pairs */
1033         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1034
1035         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1036                         &ts_params->conf),
1037                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1038                         ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1039
1040         /* valid - one queue pairs */
1041         ts_params->conf.nb_queue_pairs = 1;
1042
1043         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1044                         &ts_params->conf),
1045                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1046                         ts_params->valid_devs[0],
1047                         ts_params->conf.nb_queue_pairs);
1048
1049
1050         /* invalid - zero queue pairs */
1051         ts_params->conf.nb_queue_pairs = 0;
1052
1053         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1054                         &ts_params->conf),
1055                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1056                         " invalid qps: %u",
1057                         ts_params->valid_devs[0],
1058                         ts_params->conf.nb_queue_pairs);
1059
1060
1061         /* invalid - max value supported by field queue pairs */
1062         ts_params->conf.nb_queue_pairs = UINT16_MAX;
1063
1064         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1065                         &ts_params->conf),
1066                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1067                         " invalid qps: %u",
1068                         ts_params->valid_devs[0],
1069                         ts_params->conf.nb_queue_pairs);
1070
1071
1072         /* invalid - max value + 1 queue pairs */
1073         ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1074
1075         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1076                         &ts_params->conf),
1077                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1078                         " invalid qps: %u",
1079                         ts_params->valid_devs[0],
1080                         ts_params->conf.nb_queue_pairs);
1081
1082         /* revert to original testsuite value */
1083         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1084
1085         return TEST_SUCCESS;
1086 }
1087
1088 static int
1089 test_queue_pair_descriptor_setup(void)
1090 {
1091         struct crypto_testsuite_params *ts_params = &testsuite_params;
1092         struct rte_cryptodev_qp_conf qp_conf = {
1093                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
1094         };
1095         uint16_t qp_id;
1096
1097         /* Stop the device in case it's started so it can be configured */
1098         rte_cryptodev_stop(ts_params->valid_devs[0]);
1099
1100         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1101                         &ts_params->conf),
1102                         "Failed to configure cryptodev %u",
1103                         ts_params->valid_devs[0]);
1104
1105         /*
1106          * Test various ring sizes on this device. memzones can't be
1107          * freed so are re-used if ring is released and re-created.
1108          */
1109         qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1110         qp_conf.mp_session = ts_params->session_mpool;
1111         qp_conf.mp_session_private = ts_params->session_priv_mpool;
1112
1113         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1114                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1115                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1116                                 rte_cryptodev_socket_id(
1117                                                 ts_params->valid_devs[0])),
1118                                 "Failed test for "
1119                                 "rte_cryptodev_queue_pair_setup: num_inflights "
1120                                 "%u on qp %u on cryptodev %u",
1121                                 qp_conf.nb_descriptors, qp_id,
1122                                 ts_params->valid_devs[0]);
1123         }
1124
1125         qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1126
1127         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1128                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1129                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1130                                 rte_cryptodev_socket_id(
1131                                                 ts_params->valid_devs[0])),
1132                                 "Failed test for"
1133                                 " rte_cryptodev_queue_pair_setup: num_inflights"
1134                                 " %u on qp %u on cryptodev %u",
1135                                 qp_conf.nb_descriptors, qp_id,
1136                                 ts_params->valid_devs[0]);
1137         }
1138
1139         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1140
1141         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1142                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1143                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1144                                 rte_cryptodev_socket_id(
1145                                                 ts_params->valid_devs[0])),
1146                                 "Failed test for "
1147                                 "rte_cryptodev_queue_pair_setup: num_inflights"
1148                                 " %u on qp %u on cryptodev %u",
1149                                 qp_conf.nb_descriptors, qp_id,
1150                                 ts_params->valid_devs[0]);
1151         }
1152
1153         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1154
1155         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1156                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1157                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1158                                 rte_cryptodev_socket_id(
1159                                                 ts_params->valid_devs[0])),
1160                                 "Failed test for"
1161                                 " rte_cryptodev_queue_pair_setup:"
1162                                 "num_inflights %u on qp %u on cryptodev %u",
1163                                 qp_conf.nb_descriptors, qp_id,
1164                                 ts_params->valid_devs[0]);
1165         }
1166
1167         /* test invalid queue pair id */
1168         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;      /*valid */
1169
1170         qp_id = ts_params->conf.nb_queue_pairs;         /*invalid */
1171
1172         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1173                         ts_params->valid_devs[0],
1174                         qp_id, &qp_conf,
1175                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1176                         "Failed test for rte_cryptodev_queue_pair_setup:"
1177                         "invalid qp %u on cryptodev %u",
1178                         qp_id, ts_params->valid_devs[0]);
1179
1180         qp_id = 0xffff; /*invalid*/
1181
1182         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1183                         ts_params->valid_devs[0],
1184                         qp_id, &qp_conf,
1185                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1186                         "Failed test for rte_cryptodev_queue_pair_setup:"
1187                         "invalid qp %u on cryptodev %u",
1188                         qp_id, ts_params->valid_devs[0]);
1189
1190         return TEST_SUCCESS;
1191 }
1192
1193 /* ***** Plaintext data for tests ***** */
1194
1195 const char catch_22_quote_1[] =
1196                 "There was only one catch and that was Catch-22, which "
1197                 "specified that a concern for one's safety in the face of "
1198                 "dangers that were real and immediate was the process of a "
1199                 "rational mind. Orr was crazy and could be grounded. All he "
1200                 "had to do was ask; and as soon as he did, he would no longer "
1201                 "be crazy and would have to fly more missions. Orr would be "
1202                 "crazy to fly more missions and sane if he didn't, but if he "
1203                 "was sane he had to fly them. If he flew them he was crazy "
1204                 "and didn't have to; but if he didn't want to he was sane and "
1205                 "had to. Yossarian was moved very deeply by the absolute "
1206                 "simplicity of this clause of Catch-22 and let out a "
1207                 "respectful whistle. \"That's some catch, that Catch-22\", he "
1208                 "observed. \"It's the best there is,\" Doc Daneeka agreed.";
1209
1210 const char catch_22_quote[] =
1211                 "What a lousy earth! He wondered how many people were "
1212                 "destitute that same night even in his own prosperous country, "
1213                 "how many homes were shanties, how many husbands were drunk "
1214                 "and wives socked, and how many children were bullied, abused, "
1215                 "or abandoned. How many families hungered for food they could "
1216                 "not afford to buy? How many hearts were broken? How many "
1217                 "suicides would take place that same night, how many people "
1218                 "would go insane? How many cockroaches and landlords would "
1219                 "triumph? How many winners were losers, successes failures, "
1220                 "and rich men poor men? How many wise guys were stupid? How "
1221                 "many happy endings were unhappy endings? How many honest men "
1222                 "were liars, brave men cowards, loyal men traitors, how many "
1223                 "sainted men were corrupt, how many people in positions of "
1224                 "trust had sold their souls to bodyguards, how many had never "
1225                 "had souls? How many straight-and-narrow paths were crooked "
1226                 "paths? How many best families were worst families and how "
1227                 "many good people were bad people? When you added them all up "
1228                 "and then subtracted, you might be left with only the children, "
1229                 "and perhaps with Albert Einstein and an old violinist or "
1230                 "sculptor somewhere.";
1231
1232 #define QUOTE_480_BYTES         (480)
1233 #define QUOTE_512_BYTES         (512)
1234 #define QUOTE_768_BYTES         (768)
1235 #define QUOTE_1024_BYTES        (1024)
1236
1237
1238
1239 /* ***** SHA1 Hash Tests ***** */
1240
1241 #define HMAC_KEY_LENGTH_SHA1    (DIGEST_BYTE_LENGTH_SHA1)
1242
1243 static uint8_t hmac_sha1_key[] = {
1244         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1245         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1246         0xDE, 0xF4, 0xDE, 0xAD };
1247
1248 /* ***** SHA224 Hash Tests ***** */
1249
1250 #define HMAC_KEY_LENGTH_SHA224  (DIGEST_BYTE_LENGTH_SHA224)
1251
1252
1253 /* ***** AES-CBC Cipher Tests ***** */
1254
1255 #define CIPHER_KEY_LENGTH_AES_CBC       (16)
1256 #define CIPHER_IV_LENGTH_AES_CBC        (CIPHER_KEY_LENGTH_AES_CBC)
1257
1258 static uint8_t aes_cbc_key[] = {
1259         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1260         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1261
1262 static uint8_t aes_cbc_iv[] = {
1263         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1264         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1265
1266
1267 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1268
1269 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1270         0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1271         0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1272         0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1273         0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1274         0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1275         0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1276         0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1277         0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1278         0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1279         0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1280         0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1281         0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1282         0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1283         0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1284         0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1285         0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1286         0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1287         0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1288         0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1289         0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1290         0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1291         0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1292         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1293         0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1294         0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1295         0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1296         0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1297         0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1298         0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1299         0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1300         0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1301         0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1302         0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1303         0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1304         0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1305         0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1306         0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1307         0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1308         0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1309         0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1310         0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1311         0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1312         0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1313         0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1314         0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1315         0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1316         0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1317         0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1318         0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1319         0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1320         0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1321         0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1322         0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1323         0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1324         0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1325         0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1326         0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1327         0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1328         0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1329         0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1330         0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1331         0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1332         0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1333         0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1334 };
1335
1336 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1337         0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1338         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1339         0x18, 0x8c, 0x1d, 0x32
1340 };
1341
1342
1343 /* Multisession Vector context Test */
1344 /*Begin Session 0 */
1345 static uint8_t ms_aes_cbc_key0[] = {
1346         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1347         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1348 };
1349
1350 static uint8_t ms_aes_cbc_iv0[] = {
1351         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1352         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1353 };
1354
1355 static const uint8_t ms_aes_cbc_cipher0[] = {
1356                 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1357                 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1358                 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1359                 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1360                 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1361                 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1362                 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1363                 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1364                 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1365                 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1366                 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1367                 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1368                 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1369                 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1370                 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1371                 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1372                 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1373                 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1374                 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1375                 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1376                 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1377                 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1378                 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1379                 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1380                 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1381                 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1382                 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1383                 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1384                 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1385                 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1386                 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1387                 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1388                 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1389                 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1390                 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1391                 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1392                 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1393                 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1394                 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1395                 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1396                 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1397                 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1398                 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1399                 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1400                 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1401                 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1402                 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1403                 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1404                 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1405                 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1406                 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1407                 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1408                 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1409                 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1410                 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1411                 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1412                 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1413                 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1414                 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1415                 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1416                 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1417                 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1418                 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1419                 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1420 };
1421
1422
1423 static  uint8_t ms_hmac_key0[] = {
1424                 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1425                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1426                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1427                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1428                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1429                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1430                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1431                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1432 };
1433
1434 static const uint8_t ms_hmac_digest0[] = {
1435                 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1436                 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1437                 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1438                 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1439                 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1440                 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1441                 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1442                 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1443                 };
1444
1445 /* End Session 0 */
1446 /* Begin session 1 */
1447
1448 static  uint8_t ms_aes_cbc_key1[] = {
1449                 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1450                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1451 };
1452
1453 static  uint8_t ms_aes_cbc_iv1[] = {
1454         0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1455         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1456 };
1457
1458 static const uint8_t ms_aes_cbc_cipher1[] = {
1459                 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1460                 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1461                 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1462                 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1463                 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1464                 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1465                 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1466                 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1467                 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1468                 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1469                 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1470                 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1471                 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1472                 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1473                 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1474                 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1475                 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1476                 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1477                 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1478                 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1479                 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1480                 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1481                 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1482                 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1483                 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1484                 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1485                 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1486                 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1487                 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1488                 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1489                 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1490                 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1491                 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1492                 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1493                 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1494                 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1495                 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1496                 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1497                 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1498                 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1499                 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1500                 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1501                 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1502                 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1503                 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1504                 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1505                 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1506                 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1507                 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1508                 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1509                 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1510                 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1511                 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1512                 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1513                 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1514                 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1515                 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1516                 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1517                 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1518                 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1519                 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1520                 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1521                 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1522                 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1523
1524 };
1525
1526 static uint8_t ms_hmac_key1[] = {
1527                 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1528                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1529                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1530                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1531                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1532                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1533                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1534                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1535 };
1536
1537 static const uint8_t ms_hmac_digest1[] = {
1538                 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1539                 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1540                 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1541                 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1542                 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1543                 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1544                 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1545                 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1546 };
1547 /* End Session 1  */
1548 /* Begin Session 2 */
1549 static  uint8_t ms_aes_cbc_key2[] = {
1550                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1551                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1552 };
1553
1554 static  uint8_t ms_aes_cbc_iv2[] = {
1555                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1556                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1557 };
1558
1559 static const uint8_t ms_aes_cbc_cipher2[] = {
1560                 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
1561                 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
1562                 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
1563                 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
1564                 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
1565                 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
1566                 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
1567                 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
1568                 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
1569                 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
1570                 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
1571                 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
1572                 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
1573                 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
1574                 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
1575                 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
1576                 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
1577                 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
1578                 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
1579                 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
1580                 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
1581                 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
1582                 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
1583                 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
1584                 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
1585                 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
1586                 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
1587                 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
1588                 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
1589                 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
1590                 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
1591                 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
1592                 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
1593                 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
1594                 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
1595                 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
1596                 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
1597                 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
1598                 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
1599                 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
1600                 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
1601                 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
1602                 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
1603                 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
1604                 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
1605                 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
1606                 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
1607                 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
1608                 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
1609                 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
1610                 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
1611                 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
1612                 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
1613                 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
1614                 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
1615                 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
1616                 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
1617                 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
1618                 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
1619                 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
1620                 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
1621                 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
1622                 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
1623                 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
1624 };
1625
1626 static  uint8_t ms_hmac_key2[] = {
1627                 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1628                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1629                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1630                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1631                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1632                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1633                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1634                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1635 };
1636
1637 static const uint8_t ms_hmac_digest2[] = {
1638                 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
1639                 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
1640                 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
1641                 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
1642                 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
1643                 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
1644                 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
1645                 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
1646 };
1647
1648 /* End Session 2 */
1649
1650
1651 static int
1652 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
1653 {
1654         struct crypto_testsuite_params *ts_params = &testsuite_params;
1655         struct crypto_unittest_params *ut_params = &unittest_params;
1656
1657         /* Verify the capabilities */
1658         struct rte_cryptodev_sym_capability_idx cap_idx;
1659         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1660         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
1661         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1662                         &cap_idx) == NULL)
1663                 return -ENOTSUP;
1664         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1665         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
1666         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1667                         &cap_idx) == NULL)
1668                 return -ENOTSUP;
1669
1670         /* Generate test mbuf data and space for digest */
1671         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1672                         catch_22_quote, QUOTE_512_BYTES, 0);
1673
1674         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1675                         DIGEST_BYTE_LENGTH_SHA1);
1676         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1677
1678         /* Setup Cipher Parameters */
1679         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1680         ut_params->cipher_xform.next = &ut_params->auth_xform;
1681
1682         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1683         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
1684         ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
1685         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1686         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1687         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1688
1689         /* Setup HMAC Parameters */
1690         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1691
1692         ut_params->auth_xform.next = NULL;
1693
1694         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
1695         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
1696         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
1697         ut_params->auth_xform.auth.key.data = hmac_sha1_key;
1698         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
1699
1700         ut_params->sess = rte_cryptodev_sym_session_create(
1701                         ts_params->session_mpool);
1702
1703         /* Create crypto session*/
1704         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
1705                         ut_params->sess, &ut_params->cipher_xform,
1706                         ts_params->session_priv_mpool);
1707         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1708
1709         /* Generate crypto op data structure */
1710         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1711                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1712         TEST_ASSERT_NOT_NULL(ut_params->op,
1713                         "Failed to allocate symmetric crypto operation struct");
1714
1715         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1716
1717         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1718
1719         /* set crypto operation source mbuf */
1720         sym_op->m_src = ut_params->ibuf;
1721
1722         /* Set crypto operation authentication parameters */
1723         sym_op->auth.digest.data = ut_params->digest;
1724         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1725                         ut_params->ibuf, QUOTE_512_BYTES);
1726
1727         sym_op->auth.data.offset = 0;
1728         sym_op->auth.data.length = QUOTE_512_BYTES;
1729
1730         /* Copy IV at the end of the crypto operation */
1731         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1732                         aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
1733
1734         /* Set crypto operation cipher parameters */
1735         sym_op->cipher.data.offset = 0;
1736         sym_op->cipher.data.length = QUOTE_512_BYTES;
1737
1738         /* Process crypto operation */
1739         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1740                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1741                         ut_params->op);
1742         else
1743                 TEST_ASSERT_NOT_NULL(
1744                         process_crypto_request(ts_params->valid_devs[0],
1745                                 ut_params->op),
1746                                 "failed to process sym crypto op");
1747
1748         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1749                         "crypto op processing failed");
1750
1751         /* Validate obuf */
1752         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
1753                         uint8_t *);
1754
1755         TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
1756                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
1757                         QUOTE_512_BYTES,
1758                         "ciphertext data not as expected");
1759
1760         uint8_t *digest = ciphertext + QUOTE_512_BYTES;
1761
1762         TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
1763                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
1764                         gbl_driver_id == rte_cryptodev_driver_id_get(
1765                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
1766                                         TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
1767                                         DIGEST_BYTE_LENGTH_SHA1,
1768                         "Generated digest data not as expected");
1769
1770         return TEST_SUCCESS;
1771 }
1772
1773 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
1774
1775 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
1776
1777 static uint8_t hmac_sha512_key[] = {
1778         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1779         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1780         0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1781         0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
1782         0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
1783         0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1784         0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
1785         0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
1786
1787 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
1788         0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
1789         0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
1790         0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
1791         0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
1792         0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
1793         0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
1794         0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
1795         0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
1796
1797
1798
1799 static int
1800 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1801                 struct crypto_unittest_params *ut_params,
1802                 uint8_t *cipher_key,
1803                 uint8_t *hmac_key);
1804
1805 static int
1806 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1807                 struct crypto_unittest_params *ut_params,
1808                 struct crypto_testsuite_params *ts_params,
1809                 const uint8_t *cipher,
1810                 const uint8_t *digest,
1811                 const uint8_t *iv);
1812
1813
1814 static int
1815 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1816                 struct crypto_unittest_params *ut_params,
1817                 uint8_t *cipher_key,
1818                 uint8_t *hmac_key)
1819 {
1820
1821         /* Setup Cipher Parameters */
1822         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1823         ut_params->cipher_xform.next = NULL;
1824
1825         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1826         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
1827         ut_params->cipher_xform.cipher.key.data = cipher_key;
1828         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1829         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1830         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1831
1832         /* Setup HMAC Parameters */
1833         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1834         ut_params->auth_xform.next = &ut_params->cipher_xform;
1835
1836         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
1837         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
1838         ut_params->auth_xform.auth.key.data = hmac_key;
1839         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
1840         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
1841
1842         return TEST_SUCCESS;
1843 }
1844
1845
1846 static int
1847 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1848                 struct crypto_unittest_params *ut_params,
1849                 struct crypto_testsuite_params *ts_params,
1850                 const uint8_t *cipher,
1851                 const uint8_t *digest,
1852                 const uint8_t *iv)
1853 {
1854         /* Generate test mbuf data and digest */
1855         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1856                         (const char *)
1857                         cipher,
1858                         QUOTE_512_BYTES, 0);
1859
1860         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1861                         DIGEST_BYTE_LENGTH_SHA512);
1862         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1863
1864         rte_memcpy(ut_params->digest,
1865                         digest,
1866                         DIGEST_BYTE_LENGTH_SHA512);
1867
1868         /* Generate Crypto op data structure */
1869         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1870                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1871         TEST_ASSERT_NOT_NULL(ut_params->op,
1872                         "Failed to allocate symmetric crypto operation struct");
1873
1874         rte_crypto_op_attach_sym_session(ut_params->op, sess);
1875
1876         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1877
1878         /* set crypto operation source mbuf */
1879         sym_op->m_src = ut_params->ibuf;
1880
1881         sym_op->auth.digest.data = ut_params->digest;
1882         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1883                         ut_params->ibuf, QUOTE_512_BYTES);
1884
1885         sym_op->auth.data.offset = 0;
1886         sym_op->auth.data.length = QUOTE_512_BYTES;
1887
1888         /* Copy IV at the end of the crypto operation */
1889         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1890                         iv, CIPHER_IV_LENGTH_AES_CBC);
1891
1892         sym_op->cipher.data.offset = 0;
1893         sym_op->cipher.data.length = QUOTE_512_BYTES;
1894
1895         /* Process crypto operation */
1896         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1897                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1898                         ut_params->op);
1899         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1900                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
1901                                 ut_params->op, 1, 1, 0, 0);
1902         else
1903                 TEST_ASSERT_NOT_NULL(
1904                                 process_crypto_request(ts_params->valid_devs[0],
1905                                         ut_params->op),
1906                                         "failed to process sym crypto op");
1907
1908         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1909                         "crypto op processing failed");
1910
1911         ut_params->obuf = ut_params->op->sym->m_src;
1912
1913         /* Validate obuf */
1914         TEST_ASSERT_BUFFERS_ARE_EQUAL(
1915                         rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
1916                         catch_22_quote,
1917                         QUOTE_512_BYTES,
1918                         "Plaintext data not as expected");
1919
1920         /* Validate obuf */
1921         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1922                         "Digest verification failed");
1923
1924         return TEST_SUCCESS;
1925 }
1926
1927 static int
1928 test_blockcipher(enum blockcipher_test_type test_type)
1929 {
1930         struct crypto_testsuite_params *ts_params = &testsuite_params;
1931         int status;
1932
1933         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1934                 ts_params->op_mpool,
1935                 ts_params->session_mpool, ts_params->session_priv_mpool,
1936                 ts_params->valid_devs[0],
1937                 test_type);
1938
1939         if (status == -ENOTSUP)
1940                 return status;
1941
1942         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1943
1944         return TEST_SUCCESS;
1945 }
1946
1947 static int
1948 test_AES_cipheronly_all(void)
1949 {
1950         return test_blockcipher(BLKCIPHER_AES_CIPHERONLY_TYPE);
1951 }
1952
1953 static int
1954 test_AES_docsis_all(void)
1955 {
1956         /* Data-path service does not support DOCSIS yet */
1957         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1958                 return -ENOTSUP;
1959         return test_blockcipher(BLKCIPHER_AES_DOCSIS_TYPE);
1960 }
1961
1962 static int
1963 test_DES_docsis_all(void)
1964 {
1965         /* Data-path service does not support DOCSIS yet */
1966         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1967                 return -ENOTSUP;
1968         return test_blockcipher(BLKCIPHER_DES_DOCSIS_TYPE);
1969 }
1970
1971 static int
1972 test_DES_cipheronly_all(void)
1973 {
1974         return test_blockcipher(BLKCIPHER_DES_CIPHERONLY_TYPE);
1975 }
1976
1977 static int
1978 test_authonly_all(void)
1979 {
1980         return test_blockcipher(BLKCIPHER_AUTHONLY_TYPE);
1981 }
1982
1983 static int
1984 test_AES_chain_all(void)
1985 {
1986         return test_blockcipher(BLKCIPHER_AES_CHAIN_TYPE);
1987 }
1988
1989 static int
1990 test_3DES_chain_all(void)
1991 {
1992         return test_blockcipher(BLKCIPHER_3DES_CHAIN_TYPE);
1993 }
1994
1995 static int
1996 test_3DES_cipheronly_all(void)
1997 {
1998         return test_blockcipher(BLKCIPHER_3DES_CIPHERONLY_TYPE);
1999 }
2000
2001 /* ***** SNOW 3G Tests ***** */
2002 static int
2003 create_wireless_algo_hash_session(uint8_t dev_id,
2004         const uint8_t *key, const uint8_t key_len,
2005         const uint8_t iv_len, const uint8_t auth_len,
2006         enum rte_crypto_auth_operation op,
2007         enum rte_crypto_auth_algorithm algo)
2008 {
2009         uint8_t hash_key[key_len];
2010         int status;
2011
2012         struct crypto_testsuite_params *ts_params = &testsuite_params;
2013         struct crypto_unittest_params *ut_params = &unittest_params;
2014
2015         memcpy(hash_key, key, key_len);
2016
2017         debug_hexdump(stdout, "key:", key, key_len);
2018
2019         /* Setup Authentication Parameters */
2020         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2021         ut_params->auth_xform.next = NULL;
2022
2023         ut_params->auth_xform.auth.op = op;
2024         ut_params->auth_xform.auth.algo = algo;
2025         ut_params->auth_xform.auth.key.length = key_len;
2026         ut_params->auth_xform.auth.key.data = hash_key;
2027         ut_params->auth_xform.auth.digest_length = auth_len;
2028         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2029         ut_params->auth_xform.auth.iv.length = iv_len;
2030         ut_params->sess = rte_cryptodev_sym_session_create(
2031                         ts_params->session_mpool);
2032
2033         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2034                         &ut_params->auth_xform,
2035                         ts_params->session_priv_mpool);
2036         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2037         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2038         return 0;
2039 }
2040
2041 static int
2042 create_wireless_algo_cipher_session(uint8_t dev_id,
2043                         enum rte_crypto_cipher_operation op,
2044                         enum rte_crypto_cipher_algorithm algo,
2045                         const uint8_t *key, const uint8_t key_len,
2046                         uint8_t iv_len)
2047 {
2048         uint8_t cipher_key[key_len];
2049         int status;
2050         struct crypto_testsuite_params *ts_params = &testsuite_params;
2051         struct crypto_unittest_params *ut_params = &unittest_params;
2052
2053         memcpy(cipher_key, key, key_len);
2054
2055         /* Setup Cipher Parameters */
2056         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2057         ut_params->cipher_xform.next = NULL;
2058
2059         ut_params->cipher_xform.cipher.algo = algo;
2060         ut_params->cipher_xform.cipher.op = op;
2061         ut_params->cipher_xform.cipher.key.data = cipher_key;
2062         ut_params->cipher_xform.cipher.key.length = key_len;
2063         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2064         ut_params->cipher_xform.cipher.iv.length = iv_len;
2065
2066         debug_hexdump(stdout, "key:", key, key_len);
2067
2068         /* Create Crypto session */
2069         ut_params->sess = rte_cryptodev_sym_session_create(
2070                         ts_params->session_mpool);
2071
2072         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2073                         &ut_params->cipher_xform,
2074                         ts_params->session_priv_mpool);
2075         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2076         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2077         return 0;
2078 }
2079
2080 static int
2081 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2082                         unsigned int cipher_len,
2083                         unsigned int cipher_offset)
2084 {
2085         struct crypto_testsuite_params *ts_params = &testsuite_params;
2086         struct crypto_unittest_params *ut_params = &unittest_params;
2087
2088         /* Generate Crypto op data structure */
2089         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2090                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2091         TEST_ASSERT_NOT_NULL(ut_params->op,
2092                                 "Failed to allocate pktmbuf offload");
2093
2094         /* Set crypto operation data parameters */
2095         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2096
2097         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2098
2099         /* set crypto operation source mbuf */
2100         sym_op->m_src = ut_params->ibuf;
2101
2102         /* iv */
2103         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2104                         iv, iv_len);
2105         sym_op->cipher.data.length = cipher_len;
2106         sym_op->cipher.data.offset = cipher_offset;
2107         return 0;
2108 }
2109
2110 static int
2111 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2112                         unsigned int cipher_len,
2113                         unsigned int cipher_offset)
2114 {
2115         struct crypto_testsuite_params *ts_params = &testsuite_params;
2116         struct crypto_unittest_params *ut_params = &unittest_params;
2117
2118         /* Generate Crypto op data structure */
2119         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2120                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2121         TEST_ASSERT_NOT_NULL(ut_params->op,
2122                                 "Failed to allocate pktmbuf offload");
2123
2124         /* Set crypto operation data parameters */
2125         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2126
2127         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2128
2129         /* set crypto operation source mbuf */
2130         sym_op->m_src = ut_params->ibuf;
2131         sym_op->m_dst = ut_params->obuf;
2132
2133         /* iv */
2134         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2135                         iv, iv_len);
2136         sym_op->cipher.data.length = cipher_len;
2137         sym_op->cipher.data.offset = cipher_offset;
2138         return 0;
2139 }
2140
2141 static int
2142 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2143                 enum rte_crypto_cipher_operation cipher_op,
2144                 enum rte_crypto_auth_operation auth_op,
2145                 enum rte_crypto_auth_algorithm auth_algo,
2146                 enum rte_crypto_cipher_algorithm cipher_algo,
2147                 const uint8_t *key, uint8_t key_len,
2148                 uint8_t auth_iv_len, uint8_t auth_len,
2149                 uint8_t cipher_iv_len)
2150
2151 {
2152         uint8_t cipher_auth_key[key_len];
2153         int status;
2154
2155         struct crypto_testsuite_params *ts_params = &testsuite_params;
2156         struct crypto_unittest_params *ut_params = &unittest_params;
2157
2158         memcpy(cipher_auth_key, key, key_len);
2159
2160         /* Setup Authentication Parameters */
2161         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2162         ut_params->auth_xform.next = NULL;
2163
2164         ut_params->auth_xform.auth.op = auth_op;
2165         ut_params->auth_xform.auth.algo = auth_algo;
2166         ut_params->auth_xform.auth.key.length = key_len;
2167         /* Hash key = cipher key */
2168         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2169         ut_params->auth_xform.auth.digest_length = auth_len;
2170         /* Auth IV will be after cipher IV */
2171         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2172         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2173
2174         /* Setup Cipher Parameters */
2175         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2176         ut_params->cipher_xform.next = &ut_params->auth_xform;
2177
2178         ut_params->cipher_xform.cipher.algo = cipher_algo;
2179         ut_params->cipher_xform.cipher.op = cipher_op;
2180         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2181         ut_params->cipher_xform.cipher.key.length = key_len;
2182         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2183         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2184
2185         debug_hexdump(stdout, "key:", key, key_len);
2186
2187         /* Create Crypto session*/
2188         ut_params->sess = rte_cryptodev_sym_session_create(
2189                         ts_params->session_mpool);
2190         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2191
2192         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2193                         &ut_params->cipher_xform,
2194                         ts_params->session_priv_mpool);
2195         if (status == -ENOTSUP)
2196                 return status;
2197
2198         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2199         return 0;
2200 }
2201
2202 static int
2203 create_wireless_cipher_auth_session(uint8_t dev_id,
2204                 enum rte_crypto_cipher_operation cipher_op,
2205                 enum rte_crypto_auth_operation auth_op,
2206                 enum rte_crypto_auth_algorithm auth_algo,
2207                 enum rte_crypto_cipher_algorithm cipher_algo,
2208                 const struct wireless_test_data *tdata)
2209 {
2210         const uint8_t key_len = tdata->key.len;
2211         uint8_t cipher_auth_key[key_len];
2212         int status;
2213
2214         struct crypto_testsuite_params *ts_params = &testsuite_params;
2215         struct crypto_unittest_params *ut_params = &unittest_params;
2216         const uint8_t *key = tdata->key.data;
2217         const uint8_t auth_len = tdata->digest.len;
2218         uint8_t cipher_iv_len = tdata->cipher_iv.len;
2219         uint8_t auth_iv_len = tdata->auth_iv.len;
2220
2221         memcpy(cipher_auth_key, key, key_len);
2222
2223         /* Setup Authentication Parameters */
2224         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2225         ut_params->auth_xform.next = NULL;
2226
2227         ut_params->auth_xform.auth.op = auth_op;
2228         ut_params->auth_xform.auth.algo = auth_algo;
2229         ut_params->auth_xform.auth.key.length = key_len;
2230         /* Hash key = cipher key */
2231         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2232         ut_params->auth_xform.auth.digest_length = auth_len;
2233         /* Auth IV will be after cipher IV */
2234         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2235         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2236
2237         /* Setup Cipher Parameters */
2238         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2239         ut_params->cipher_xform.next = &ut_params->auth_xform;
2240
2241         ut_params->cipher_xform.cipher.algo = cipher_algo;
2242         ut_params->cipher_xform.cipher.op = cipher_op;
2243         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2244         ut_params->cipher_xform.cipher.key.length = key_len;
2245         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2246         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2247
2248
2249         debug_hexdump(stdout, "key:", key, key_len);
2250
2251         /* Create Crypto session*/
2252         ut_params->sess = rte_cryptodev_sym_session_create(
2253                         ts_params->session_mpool);
2254
2255         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2256                         &ut_params->cipher_xform,
2257                         ts_params->session_priv_mpool);
2258         if (status == -ENOTSUP)
2259                 return status;
2260
2261         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2262         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2263         return 0;
2264 }
2265
2266 static int
2267 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2268                 const struct wireless_test_data *tdata)
2269 {
2270         return create_wireless_cipher_auth_session(dev_id,
2271                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2272                 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2273                 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2274 }
2275
2276 static int
2277 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2278                 enum rte_crypto_cipher_operation cipher_op,
2279                 enum rte_crypto_auth_operation auth_op,
2280                 enum rte_crypto_auth_algorithm auth_algo,
2281                 enum rte_crypto_cipher_algorithm cipher_algo,
2282                 const uint8_t *key, const uint8_t key_len,
2283                 uint8_t auth_iv_len, uint8_t auth_len,
2284                 uint8_t cipher_iv_len)
2285 {
2286         uint8_t auth_cipher_key[key_len];
2287         int status;
2288         struct crypto_testsuite_params *ts_params = &testsuite_params;
2289         struct crypto_unittest_params *ut_params = &unittest_params;
2290
2291         memcpy(auth_cipher_key, key, key_len);
2292
2293         /* Setup Authentication Parameters */
2294         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2295         ut_params->auth_xform.auth.op = auth_op;
2296         ut_params->auth_xform.next = &ut_params->cipher_xform;
2297         ut_params->auth_xform.auth.algo = auth_algo;
2298         ut_params->auth_xform.auth.key.length = key_len;
2299         ut_params->auth_xform.auth.key.data = auth_cipher_key;
2300         ut_params->auth_xform.auth.digest_length = auth_len;
2301         /* Auth IV will be after cipher IV */
2302         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2303         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2304
2305         /* Setup Cipher Parameters */
2306         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2307         ut_params->cipher_xform.next = NULL;
2308         ut_params->cipher_xform.cipher.algo = cipher_algo;
2309         ut_params->cipher_xform.cipher.op = cipher_op;
2310         ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2311         ut_params->cipher_xform.cipher.key.length = key_len;
2312         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2313         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2314
2315         debug_hexdump(stdout, "key:", key, key_len);
2316
2317         /* Create Crypto session*/
2318         ut_params->sess = rte_cryptodev_sym_session_create(
2319                         ts_params->session_mpool);
2320         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2321
2322         if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2323                 ut_params->auth_xform.next = NULL;
2324                 ut_params->cipher_xform.next = &ut_params->auth_xform;
2325                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2326                                 &ut_params->cipher_xform,
2327                                 ts_params->session_priv_mpool);
2328
2329         } else
2330                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2331                                 &ut_params->auth_xform,
2332                                 ts_params->session_priv_mpool);
2333
2334         if (status == -ENOTSUP)
2335                 return status;
2336
2337         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2338
2339         return 0;
2340 }
2341
2342 static int
2343 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2344                 unsigned int auth_tag_len,
2345                 const uint8_t *iv, unsigned int iv_len,
2346                 unsigned int data_pad_len,
2347                 enum rte_crypto_auth_operation op,
2348                 unsigned int auth_len, unsigned int auth_offset)
2349 {
2350         struct crypto_testsuite_params *ts_params = &testsuite_params;
2351
2352         struct crypto_unittest_params *ut_params = &unittest_params;
2353
2354         /* Generate Crypto op data structure */
2355         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2356                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2357         TEST_ASSERT_NOT_NULL(ut_params->op,
2358                 "Failed to allocate pktmbuf offload");
2359
2360         /* Set crypto operation data parameters */
2361         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2362
2363         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2364
2365         /* set crypto operation source mbuf */
2366         sym_op->m_src = ut_params->ibuf;
2367
2368         /* iv */
2369         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2370                         iv, iv_len);
2371         /* digest */
2372         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2373                                         ut_params->ibuf, auth_tag_len);
2374
2375         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2376                                 "no room to append auth tag");
2377         ut_params->digest = sym_op->auth.digest.data;
2378         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2379                         ut_params->ibuf, data_pad_len);
2380         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2381                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2382         else
2383                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2384
2385         debug_hexdump(stdout, "digest:",
2386                 sym_op->auth.digest.data,
2387                 auth_tag_len);
2388
2389         sym_op->auth.data.length = auth_len;
2390         sym_op->auth.data.offset = auth_offset;
2391
2392         return 0;
2393 }
2394
2395 static int
2396 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2397         enum rte_crypto_auth_operation op)
2398 {
2399         struct crypto_testsuite_params *ts_params = &testsuite_params;
2400         struct crypto_unittest_params *ut_params = &unittest_params;
2401
2402         const uint8_t *auth_tag = tdata->digest.data;
2403         const unsigned int auth_tag_len = tdata->digest.len;
2404         unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2405         unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2406
2407         const uint8_t *cipher_iv = tdata->cipher_iv.data;
2408         const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2409         const uint8_t *auth_iv = tdata->auth_iv.data;
2410         const uint8_t auth_iv_len = tdata->auth_iv.len;
2411         const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2412         const unsigned int auth_len = tdata->validAuthLenInBits.len;
2413
2414         /* Generate Crypto op data structure */
2415         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2416                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2417         TEST_ASSERT_NOT_NULL(ut_params->op,
2418                         "Failed to allocate pktmbuf offload");
2419         /* Set crypto operation data parameters */
2420         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2421
2422         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2423
2424         /* set crypto operation source mbuf */
2425         sym_op->m_src = ut_params->ibuf;
2426
2427         /* digest */
2428         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2429                         ut_params->ibuf, auth_tag_len);
2430
2431         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2432                         "no room to append auth tag");
2433         ut_params->digest = sym_op->auth.digest.data;
2434         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2435                         ut_params->ibuf, data_pad_len);
2436         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2437                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2438         else
2439                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2440
2441         debug_hexdump(stdout, "digest:",
2442                 sym_op->auth.digest.data,
2443                 auth_tag_len);
2444
2445         /* Copy cipher and auth IVs at the end of the crypto operation */
2446         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2447                                                 IV_OFFSET);
2448         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2449         iv_ptr += cipher_iv_len;
2450         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2451
2452         sym_op->cipher.data.length = cipher_len;
2453         sym_op->cipher.data.offset = 0;
2454         sym_op->auth.data.length = auth_len;
2455         sym_op->auth.data.offset = 0;
2456
2457         return 0;
2458 }
2459
2460 static int
2461 create_zuc_cipher_hash_generate_operation(
2462                 const struct wireless_test_data *tdata)
2463 {
2464         return create_wireless_cipher_hash_operation(tdata,
2465                 RTE_CRYPTO_AUTH_OP_GENERATE);
2466 }
2467
2468 static int
2469 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2470                 const unsigned auth_tag_len,
2471                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2472                 unsigned data_pad_len,
2473                 enum rte_crypto_auth_operation op,
2474                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2475                 const unsigned cipher_len, const unsigned cipher_offset,
2476                 const unsigned auth_len, const unsigned auth_offset)
2477 {
2478         struct crypto_testsuite_params *ts_params = &testsuite_params;
2479         struct crypto_unittest_params *ut_params = &unittest_params;
2480
2481         enum rte_crypto_cipher_algorithm cipher_algo =
2482                         ut_params->cipher_xform.cipher.algo;
2483         enum rte_crypto_auth_algorithm auth_algo =
2484                         ut_params->auth_xform.auth.algo;
2485
2486         /* Generate Crypto op data structure */
2487         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2488                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2489         TEST_ASSERT_NOT_NULL(ut_params->op,
2490                         "Failed to allocate pktmbuf offload");
2491         /* Set crypto operation data parameters */
2492         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2493
2494         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2495
2496         /* set crypto operation source mbuf */
2497         sym_op->m_src = ut_params->ibuf;
2498
2499         /* digest */
2500         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2501                         ut_params->ibuf, auth_tag_len);
2502
2503         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2504                         "no room to append auth tag");
2505         ut_params->digest = sym_op->auth.digest.data;
2506
2507         if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2508                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2509                                 ut_params->ibuf, data_pad_len);
2510         } else {
2511                 struct rte_mbuf *m = ut_params->ibuf;
2512                 unsigned int offset = data_pad_len;
2513
2514                 while (offset > m->data_len && m->next != NULL) {
2515                         offset -= m->data_len;
2516                         m = m->next;
2517                 }
2518                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2519                         m, offset);
2520         }
2521
2522         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2523                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2524         else
2525                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2526
2527         debug_hexdump(stdout, "digest:",
2528                 sym_op->auth.digest.data,
2529                 auth_tag_len);
2530
2531         /* Copy cipher and auth IVs at the end of the crypto operation */
2532         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2533                                                 IV_OFFSET);
2534         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2535         iv_ptr += cipher_iv_len;
2536         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2537
2538         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2539                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2540                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2541                 sym_op->cipher.data.length = cipher_len;
2542                 sym_op->cipher.data.offset = cipher_offset;
2543         } else {
2544                 sym_op->cipher.data.length = cipher_len >> 3;
2545                 sym_op->cipher.data.offset = cipher_offset >> 3;
2546         }
2547
2548         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2549                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2550                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2551                 sym_op->auth.data.length = auth_len;
2552                 sym_op->auth.data.offset = auth_offset;
2553         } else {
2554                 sym_op->auth.data.length = auth_len >> 3;
2555                 sym_op->auth.data.offset = auth_offset >> 3;
2556         }
2557
2558         return 0;
2559 }
2560
2561 static int
2562 create_wireless_algo_auth_cipher_operation(
2563                 const uint8_t *auth_tag, unsigned int auth_tag_len,
2564                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2565                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2566                 unsigned int data_pad_len,
2567                 unsigned int cipher_len, unsigned int cipher_offset,
2568                 unsigned int auth_len, unsigned int auth_offset,
2569                 uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2570 {
2571         struct crypto_testsuite_params *ts_params = &testsuite_params;
2572         struct crypto_unittest_params *ut_params = &unittest_params;
2573
2574         enum rte_crypto_cipher_algorithm cipher_algo =
2575                         ut_params->cipher_xform.cipher.algo;
2576         enum rte_crypto_auth_algorithm auth_algo =
2577                         ut_params->auth_xform.auth.algo;
2578
2579         /* Generate Crypto op data structure */
2580         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2581                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2582         TEST_ASSERT_NOT_NULL(ut_params->op,
2583                         "Failed to allocate pktmbuf offload");
2584
2585         /* Set crypto operation data parameters */
2586         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2587
2588         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2589
2590         /* set crypto operation mbufs */
2591         sym_op->m_src = ut_params->ibuf;
2592         if (op_mode == OUT_OF_PLACE)
2593                 sym_op->m_dst = ut_params->obuf;
2594
2595         /* digest */
2596         if (!do_sgl) {
2597                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2598                         (op_mode == IN_PLACE ?
2599                                 ut_params->ibuf : ut_params->obuf),
2600                         uint8_t *, data_pad_len);
2601                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2602                         (op_mode == IN_PLACE ?
2603                                 ut_params->ibuf : ut_params->obuf),
2604                         data_pad_len);
2605                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2606         } else {
2607                 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
2608                 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
2609                                 sym_op->m_src : sym_op->m_dst);
2610                 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
2611                         remaining_off -= rte_pktmbuf_data_len(sgl_buf);
2612                         sgl_buf = sgl_buf->next;
2613                 }
2614                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
2615                                 uint8_t *, remaining_off);
2616                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
2617                                 remaining_off);
2618                 memset(sym_op->auth.digest.data, 0, remaining_off);
2619                 while (sgl_buf->next != NULL) {
2620                         memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
2621                                 0, rte_pktmbuf_data_len(sgl_buf));
2622                         sgl_buf = sgl_buf->next;
2623                 }
2624         }
2625
2626         /* Copy digest for the verification */
2627         if (verify)
2628                 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2629
2630         /* Copy cipher and auth IVs at the end of the crypto operation */
2631         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
2632                         ut_params->op, uint8_t *, IV_OFFSET);
2633
2634         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2635         iv_ptr += cipher_iv_len;
2636         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2637
2638         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2639                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2640                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2641                 sym_op->cipher.data.length = cipher_len;
2642                 sym_op->cipher.data.offset = cipher_offset;
2643         } else {
2644                 sym_op->cipher.data.length = cipher_len >> 3;
2645                 sym_op->cipher.data.offset = cipher_offset >> 3;
2646         }
2647
2648         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2649                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2650                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2651                 sym_op->auth.data.length = auth_len;
2652                 sym_op->auth.data.offset = auth_offset;
2653         } else {
2654                 sym_op->auth.data.length = auth_len >> 3;
2655                 sym_op->auth.data.offset = auth_offset >> 3;
2656         }
2657
2658         return 0;
2659 }
2660
2661 static int
2662 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
2663 {
2664         struct crypto_testsuite_params *ts_params = &testsuite_params;
2665         struct crypto_unittest_params *ut_params = &unittest_params;
2666
2667         int retval;
2668         unsigned plaintext_pad_len;
2669         unsigned plaintext_len;
2670         uint8_t *plaintext;
2671         struct rte_cryptodev_info dev_info;
2672
2673         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2674         uint64_t feat_flags = dev_info.feature_flags;
2675
2676         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
2677                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
2678                 printf("Device doesn't support NON-Byte Aligned Data.\n");
2679                 return -ENOTSUP;
2680         }
2681
2682         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2683                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2684                 printf("Device doesn't support RAW data-path APIs.\n");
2685                 return -ENOTSUP;
2686         }
2687
2688         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2689                 return -ENOTSUP;
2690
2691         /* Verify the capabilities */
2692         struct rte_cryptodev_sym_capability_idx cap_idx;
2693         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2694         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2695         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2696                         &cap_idx) == NULL)
2697                 return -ENOTSUP;
2698
2699         /* Create SNOW 3G session */
2700         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2701                         tdata->key.data, tdata->key.len,
2702                         tdata->auth_iv.len, tdata->digest.len,
2703                         RTE_CRYPTO_AUTH_OP_GENERATE,
2704                         RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2705         if (retval < 0)
2706                 return retval;
2707
2708         /* alloc mbuf and set payload */
2709         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2710
2711         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2712         rte_pktmbuf_tailroom(ut_params->ibuf));
2713
2714         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2715         /* Append data which is padded to a multiple of */
2716         /* the algorithms block size */
2717         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2718         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2719                                 plaintext_pad_len);
2720         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2721
2722         /* Create SNOW 3G operation */
2723         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2724                         tdata->auth_iv.data, tdata->auth_iv.len,
2725                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2726                         tdata->validAuthLenInBits.len,
2727                         0);
2728         if (retval < 0)
2729                 return retval;
2730
2731         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2732                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2733                                 ut_params->op, 0, 1, 1, 0);
2734         else
2735                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2736                                 ut_params->op);
2737         ut_params->obuf = ut_params->op->sym->m_src;
2738         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2739         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2740                         + plaintext_pad_len;
2741
2742         /* Validate obuf */
2743         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2744         ut_params->digest,
2745         tdata->digest.data,
2746         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
2747         "SNOW 3G Generated auth tag not as expected");
2748
2749         return 0;
2750 }
2751
2752 static int
2753 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
2754 {
2755         struct crypto_testsuite_params *ts_params = &testsuite_params;
2756         struct crypto_unittest_params *ut_params = &unittest_params;
2757
2758         int retval;
2759         unsigned plaintext_pad_len;
2760         unsigned plaintext_len;
2761         uint8_t *plaintext;
2762         struct rte_cryptodev_info dev_info;
2763
2764         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2765         uint64_t feat_flags = dev_info.feature_flags;
2766
2767         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
2768                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
2769                 printf("Device doesn't support NON-Byte Aligned Data.\n");
2770                 return -ENOTSUP;
2771         }
2772
2773         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2774                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2775                 printf("Device doesn't support RAW data-path APIs.\n");
2776                 return -ENOTSUP;
2777         }
2778
2779         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2780                 return -ENOTSUP;
2781
2782         /* Verify the capabilities */
2783         struct rte_cryptodev_sym_capability_idx cap_idx;
2784         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2785         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2786         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2787                         &cap_idx) == NULL)
2788                 return -ENOTSUP;
2789
2790         /* Create SNOW 3G session */
2791         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2792                                 tdata->key.data, tdata->key.len,
2793                                 tdata->auth_iv.len, tdata->digest.len,
2794                                 RTE_CRYPTO_AUTH_OP_VERIFY,
2795                                 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2796         if (retval < 0)
2797                 return retval;
2798         /* alloc mbuf and set payload */
2799         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2800
2801         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2802         rte_pktmbuf_tailroom(ut_params->ibuf));
2803
2804         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2805         /* Append data which is padded to a multiple of */
2806         /* the algorithms block size */
2807         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2808         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2809                                 plaintext_pad_len);
2810         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2811
2812         /* Create SNOW 3G operation */
2813         retval = create_wireless_algo_hash_operation(tdata->digest.data,
2814                         tdata->digest.len,
2815                         tdata->auth_iv.data, tdata->auth_iv.len,
2816                         plaintext_pad_len,
2817                         RTE_CRYPTO_AUTH_OP_VERIFY,
2818                         tdata->validAuthLenInBits.len,
2819                         0);
2820         if (retval < 0)
2821                 return retval;
2822
2823         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2824                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2825                                 ut_params->op, 0, 1, 1, 0);
2826         else
2827                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2828                                 ut_params->op);
2829         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2830         ut_params->obuf = ut_params->op->sym->m_src;
2831         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2832                                 + plaintext_pad_len;
2833
2834         /* Validate obuf */
2835         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
2836                 return 0;
2837         else
2838                 return -1;
2839
2840         return 0;
2841 }
2842
2843 static int
2844 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
2845 {
2846         struct crypto_testsuite_params *ts_params = &testsuite_params;
2847         struct crypto_unittest_params *ut_params = &unittest_params;
2848
2849         int retval;
2850         unsigned plaintext_pad_len;
2851         unsigned plaintext_len;
2852         uint8_t *plaintext;
2853         struct rte_cryptodev_info dev_info;
2854
2855         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2856         uint64_t feat_flags = dev_info.feature_flags;
2857
2858         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2859                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2860                 printf("Device doesn't support RAW data-path APIs.\n");
2861                 return -ENOTSUP;
2862         }
2863
2864         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2865                 return -ENOTSUP;
2866
2867         /* Verify the capabilities */
2868         struct rte_cryptodev_sym_capability_idx cap_idx;
2869         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2870         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2871         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2872                         &cap_idx) == NULL)
2873                 return -ENOTSUP;
2874
2875         /* Create KASUMI session */
2876         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2877                         tdata->key.data, tdata->key.len,
2878                         0, tdata->digest.len,
2879                         RTE_CRYPTO_AUTH_OP_GENERATE,
2880                         RTE_CRYPTO_AUTH_KASUMI_F9);
2881         if (retval < 0)
2882                 return retval;
2883
2884         /* alloc mbuf and set payload */
2885         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2886
2887         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2888         rte_pktmbuf_tailroom(ut_params->ibuf));
2889
2890         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2891         /* Append data which is padded to a multiple of */
2892         /* the algorithms block size */
2893         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2894         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2895                                 plaintext_pad_len);
2896         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2897
2898         /* Create KASUMI operation */
2899         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2900                         NULL, 0,
2901                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2902                         tdata->plaintext.len,
2903                         0);
2904         if (retval < 0)
2905                 return retval;
2906
2907         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2908                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2909                         ut_params->op);
2910         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2911                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2912                                 ut_params->op, 0, 1, 1, 0);
2913         else
2914                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2915                         ut_params->op);
2916
2917         ut_params->obuf = ut_params->op->sym->m_src;
2918         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2919         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2920                         + plaintext_pad_len;
2921
2922         /* Validate obuf */
2923         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2924         ut_params->digest,
2925         tdata->digest.data,
2926         DIGEST_BYTE_LENGTH_KASUMI_F9,
2927         "KASUMI Generated auth tag not as expected");
2928
2929         return 0;
2930 }
2931
2932 static int
2933 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
2934 {
2935         struct crypto_testsuite_params *ts_params = &testsuite_params;
2936         struct crypto_unittest_params *ut_params = &unittest_params;
2937
2938         int retval;
2939         unsigned plaintext_pad_len;
2940         unsigned plaintext_len;
2941         uint8_t *plaintext;
2942         struct rte_cryptodev_info dev_info;
2943
2944         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2945         uint64_t feat_flags = dev_info.feature_flags;
2946
2947         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2948                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2949                 printf("Device doesn't support RAW data-path APIs.\n");
2950                 return -ENOTSUP;
2951         }
2952
2953         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2954                 return -ENOTSUP;
2955
2956         /* Verify the capabilities */
2957         struct rte_cryptodev_sym_capability_idx cap_idx;
2958         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2959         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2960         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2961                         &cap_idx) == NULL)
2962                 return -ENOTSUP;
2963
2964         /* Create KASUMI session */
2965         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2966                                 tdata->key.data, tdata->key.len,
2967                                 0, tdata->digest.len,
2968                                 RTE_CRYPTO_AUTH_OP_VERIFY,
2969                                 RTE_CRYPTO_AUTH_KASUMI_F9);
2970         if (retval < 0)
2971                 return retval;
2972         /* alloc mbuf and set payload */
2973         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2974
2975         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2976         rte_pktmbuf_tailroom(ut_params->ibuf));
2977
2978         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2979         /* Append data which is padded to a multiple */
2980         /* of the algorithms block size */
2981         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2982         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2983                                 plaintext_pad_len);
2984         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2985
2986         /* Create KASUMI operation */
2987         retval = create_wireless_algo_hash_operation(tdata->digest.data,
2988                         tdata->digest.len,
2989                         NULL, 0,
2990                         plaintext_pad_len,
2991                         RTE_CRYPTO_AUTH_OP_VERIFY,
2992                         tdata->plaintext.len,
2993                         0);
2994         if (retval < 0)
2995                 return retval;
2996
2997         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2998                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2999                                 ut_params->op, 0, 1, 1, 0);
3000         else
3001                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3002                                 ut_params->op);
3003         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3004         ut_params->obuf = ut_params->op->sym->m_src;
3005         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3006                                 + plaintext_pad_len;
3007
3008         /* Validate obuf */
3009         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3010                 return 0;
3011         else
3012                 return -1;
3013
3014         return 0;
3015 }
3016
3017 static int
3018 test_snow3g_hash_generate_test_case_1(void)
3019 {
3020         return test_snow3g_authentication(&snow3g_hash_test_case_1);
3021 }
3022
3023 static int
3024 test_snow3g_hash_generate_test_case_2(void)
3025 {
3026         return test_snow3g_authentication(&snow3g_hash_test_case_2);
3027 }
3028
3029 static int
3030 test_snow3g_hash_generate_test_case_3(void)
3031 {
3032         return test_snow3g_authentication(&snow3g_hash_test_case_3);
3033 }
3034
3035 static int
3036 test_snow3g_hash_generate_test_case_4(void)
3037 {
3038         return test_snow3g_authentication(&snow3g_hash_test_case_4);
3039 }
3040
3041 static int
3042 test_snow3g_hash_generate_test_case_5(void)
3043 {
3044         return test_snow3g_authentication(&snow3g_hash_test_case_5);
3045 }
3046
3047 static int
3048 test_snow3g_hash_generate_test_case_6(void)
3049 {
3050         return test_snow3g_authentication(&snow3g_hash_test_case_6);
3051 }
3052
3053 static int
3054 test_snow3g_hash_verify_test_case_1(void)
3055 {
3056         return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3057
3058 }
3059
3060 static int
3061 test_snow3g_hash_verify_test_case_2(void)
3062 {
3063         return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3064 }
3065
3066 static int
3067 test_snow3g_hash_verify_test_case_3(void)
3068 {
3069         return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3070 }
3071
3072 static int
3073 test_snow3g_hash_verify_test_case_4(void)
3074 {
3075         return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3076 }
3077
3078 static int
3079 test_snow3g_hash_verify_test_case_5(void)
3080 {
3081         return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3082 }
3083
3084 static int
3085 test_snow3g_hash_verify_test_case_6(void)
3086 {
3087         return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3088 }
3089
3090 static int
3091 test_kasumi_hash_generate_test_case_1(void)
3092 {
3093         return test_kasumi_authentication(&kasumi_hash_test_case_1);
3094 }
3095
3096 static int
3097 test_kasumi_hash_generate_test_case_2(void)
3098 {
3099         return test_kasumi_authentication(&kasumi_hash_test_case_2);
3100 }
3101
3102 static int
3103 test_kasumi_hash_generate_test_case_3(void)
3104 {
3105         return test_kasumi_authentication(&kasumi_hash_test_case_3);
3106 }
3107
3108 static int
3109 test_kasumi_hash_generate_test_case_4(void)
3110 {
3111         return test_kasumi_authentication(&kasumi_hash_test_case_4);
3112 }
3113
3114 static int
3115 test_kasumi_hash_generate_test_case_5(void)
3116 {
3117         return test_kasumi_authentication(&kasumi_hash_test_case_5);
3118 }
3119
3120 static int
3121 test_kasumi_hash_generate_test_case_6(void)
3122 {
3123         return test_kasumi_authentication(&kasumi_hash_test_case_6);
3124 }
3125
3126 static int
3127 test_kasumi_hash_verify_test_case_1(void)
3128 {
3129         return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3130 }
3131
3132 static int
3133 test_kasumi_hash_verify_test_case_2(void)
3134 {
3135         return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3136 }
3137
3138 static int
3139 test_kasumi_hash_verify_test_case_3(void)
3140 {
3141         return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3142 }
3143
3144 static int
3145 test_kasumi_hash_verify_test_case_4(void)
3146 {
3147         return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3148 }
3149
3150 static int
3151 test_kasumi_hash_verify_test_case_5(void)
3152 {
3153         return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3154 }
3155
3156 static int
3157 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3158 {
3159         struct crypto_testsuite_params *ts_params = &testsuite_params;
3160         struct crypto_unittest_params *ut_params = &unittest_params;
3161
3162         int retval;
3163         uint8_t *plaintext, *ciphertext;
3164         unsigned plaintext_pad_len;
3165         unsigned plaintext_len;
3166         struct rte_cryptodev_info dev_info;
3167
3168         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3169         uint64_t feat_flags = dev_info.feature_flags;
3170
3171         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3172                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3173                 printf("Device doesn't support RAW data-path APIs.\n");
3174                 return -ENOTSUP;
3175         }
3176
3177         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3178                 return -ENOTSUP;
3179
3180         /* Verify the capabilities */
3181         struct rte_cryptodev_sym_capability_idx cap_idx;
3182         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3183         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3184         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3185                         &cap_idx) == NULL)
3186                 return -ENOTSUP;
3187
3188         /* Create KASUMI session */
3189         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3190                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3191                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3192                                         tdata->key.data, tdata->key.len,
3193                                         tdata->cipher_iv.len);
3194         if (retval < 0)
3195                 return retval;
3196
3197         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3198
3199         /* Clear mbuf payload */
3200         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3201                rte_pktmbuf_tailroom(ut_params->ibuf));
3202
3203         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3204         /* Append data which is padded to a multiple */
3205         /* of the algorithms block size */
3206         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3207         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3208                                 plaintext_pad_len);
3209         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3210
3211         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3212
3213         /* Create KASUMI operation */
3214         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3215                                 tdata->cipher_iv.len,
3216                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3217                                 tdata->validCipherOffsetInBits.len);
3218         if (retval < 0)
3219                 return retval;
3220
3221         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3222                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3223                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3224         else
3225                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3226                                 ut_params->op);
3227         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3228
3229         ut_params->obuf = ut_params->op->sym->m_dst;
3230         if (ut_params->obuf)
3231                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3232         else
3233                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3234
3235         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3236
3237         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3238                                 (tdata->validCipherOffsetInBits.len >> 3);
3239         /* Validate obuf */
3240         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3241                 ciphertext,
3242                 reference_ciphertext,
3243                 tdata->validCipherLenInBits.len,
3244                 "KASUMI Ciphertext data not as expected");
3245         return 0;
3246 }
3247
3248 static int
3249 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3250 {
3251         struct crypto_testsuite_params *ts_params = &testsuite_params;
3252         struct crypto_unittest_params *ut_params = &unittest_params;
3253
3254         int retval;
3255
3256         unsigned int plaintext_pad_len;
3257         unsigned int plaintext_len;
3258
3259         uint8_t buffer[10000];
3260         const uint8_t *ciphertext;
3261
3262         struct rte_cryptodev_info dev_info;
3263
3264         /* Verify the capabilities */
3265         struct rte_cryptodev_sym_capability_idx cap_idx;
3266         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3267         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3268         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3269                         &cap_idx) == NULL)
3270                 return -ENOTSUP;
3271
3272         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3273
3274         uint64_t feat_flags = dev_info.feature_flags;
3275
3276         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3277                 printf("Device doesn't support in-place scatter-gather. "
3278                                 "Test Skipped.\n");
3279                 return -ENOTSUP;
3280         }
3281
3282         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3283                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3284                 printf("Device doesn't support RAW data-path APIs.\n");
3285                 return -ENOTSUP;
3286         }
3287
3288         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3289                 return -ENOTSUP;
3290
3291         /* Create KASUMI session */
3292         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3293                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3294                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3295                                         tdata->key.data, tdata->key.len,
3296                                         tdata->cipher_iv.len);
3297         if (retval < 0)
3298                 return retval;
3299
3300         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3301
3302
3303         /* Append data which is padded to a multiple */
3304         /* of the algorithms block size */
3305         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3306
3307         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3308                         plaintext_pad_len, 10, 0);
3309
3310         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3311
3312         /* Create KASUMI operation */
3313         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3314                                 tdata->cipher_iv.len,
3315                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3316                                 tdata->validCipherOffsetInBits.len);
3317         if (retval < 0)
3318                 return retval;
3319
3320         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3321                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3322                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3323         else
3324                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3325                                                 ut_params->op);
3326         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3327
3328         ut_params->obuf = ut_params->op->sym->m_dst;
3329
3330         if (ut_params->obuf)
3331                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3332                                 plaintext_len, buffer);
3333         else
3334                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3335                                 tdata->validCipherOffsetInBits.len >> 3,
3336                                 plaintext_len, buffer);
3337
3338         /* Validate obuf */
3339         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3340
3341         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3342                                 (tdata->validCipherOffsetInBits.len >> 3);
3343         /* Validate obuf */
3344         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3345                 ciphertext,
3346                 reference_ciphertext,
3347                 tdata->validCipherLenInBits.len,
3348                 "KASUMI Ciphertext data not as expected");
3349         return 0;
3350 }
3351
3352 static int
3353 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3354 {
3355         struct crypto_testsuite_params *ts_params = &testsuite_params;
3356         struct crypto_unittest_params *ut_params = &unittest_params;
3357
3358         int retval;
3359         uint8_t *plaintext, *ciphertext;
3360         unsigned plaintext_pad_len;
3361         unsigned plaintext_len;
3362
3363         /* Verify the capabilities */
3364         struct rte_cryptodev_sym_capability_idx cap_idx;
3365         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3366         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3367         /* Data-path service does not support OOP */
3368         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3369                         &cap_idx) == NULL)
3370                 return -ENOTSUP;
3371
3372         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3373                 return -ENOTSUP;
3374
3375         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3376                 return -ENOTSUP;
3377
3378         /* Create KASUMI session */
3379         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3380                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3381                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3382                                         tdata->key.data, tdata->key.len,
3383                                         tdata->cipher_iv.len);
3384         if (retval < 0)
3385                 return retval;
3386
3387         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3388         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3389
3390         /* Clear mbuf payload */
3391         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3392                rte_pktmbuf_tailroom(ut_params->ibuf));
3393
3394         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3395         /* Append data which is padded to a multiple */
3396         /* of the algorithms block size */
3397         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3398         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3399                                 plaintext_pad_len);
3400         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3401         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3402
3403         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3404
3405         /* Create KASUMI operation */
3406         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3407                                 tdata->cipher_iv.len,
3408                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3409                                 tdata->validCipherOffsetInBits.len);
3410         if (retval < 0)
3411                 return retval;
3412
3413         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3414                                                 ut_params->op);
3415         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3416
3417         ut_params->obuf = ut_params->op->sym->m_dst;
3418         if (ut_params->obuf)
3419                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3420         else
3421                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3422
3423         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3424
3425         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3426                                 (tdata->validCipherOffsetInBits.len >> 3);
3427         /* Validate obuf */
3428         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3429                 ciphertext,
3430                 reference_ciphertext,
3431                 tdata->validCipherLenInBits.len,
3432                 "KASUMI Ciphertext data not as expected");
3433         return 0;
3434 }
3435
3436 static int
3437 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3438 {
3439         struct crypto_testsuite_params *ts_params = &testsuite_params;
3440         struct crypto_unittest_params *ut_params = &unittest_params;
3441
3442         int retval;
3443         unsigned int plaintext_pad_len;
3444         unsigned int plaintext_len;
3445
3446         const uint8_t *ciphertext;
3447         uint8_t buffer[2048];
3448
3449         struct rte_cryptodev_info dev_info;
3450
3451         /* Verify the capabilities */
3452         struct rte_cryptodev_sym_capability_idx cap_idx;
3453         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3454         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3455         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3456                         &cap_idx) == NULL)
3457                 return -ENOTSUP;
3458
3459         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3460                 return -ENOTSUP;
3461
3462         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3463                 return -ENOTSUP;
3464
3465         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3466
3467         uint64_t feat_flags = dev_info.feature_flags;
3468         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3469                 printf("Device doesn't support out-of-place scatter-gather "
3470                                 "in both input and output mbufs. "
3471                                 "Test Skipped.\n");
3472                 return -ENOTSUP;
3473         }
3474
3475         /* Create KASUMI session */
3476         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3477                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3478                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3479                                         tdata->key.data, tdata->key.len,
3480                                         tdata->cipher_iv.len);
3481         if (retval < 0)
3482                 return retval;
3483
3484         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3485         /* Append data which is padded to a multiple */
3486         /* of the algorithms block size */
3487         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3488
3489         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3490                         plaintext_pad_len, 10, 0);
3491         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3492                         plaintext_pad_len, 3, 0);
3493
3494         /* Append data which is padded to a multiple */
3495         /* of the algorithms block size */
3496         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3497
3498         /* Create KASUMI operation */
3499         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3500                                 tdata->cipher_iv.len,
3501                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3502                                 tdata->validCipherOffsetInBits.len);
3503         if (retval < 0)
3504                 return retval;
3505
3506         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3507                                                 ut_params->op);
3508         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3509
3510         ut_params->obuf = ut_params->op->sym->m_dst;
3511         if (ut_params->obuf)
3512                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3513                                 plaintext_pad_len, buffer);
3514         else
3515                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3516                                 tdata->validCipherOffsetInBits.len >> 3,
3517                                 plaintext_pad_len, buffer);
3518
3519         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3520                                 (tdata->validCipherOffsetInBits.len >> 3);
3521         /* Validate obuf */
3522         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3523                 ciphertext,
3524                 reference_ciphertext,
3525                 tdata->validCipherLenInBits.len,
3526                 "KASUMI Ciphertext data not as expected");
3527         return 0;
3528 }
3529
3530
3531 static int
3532 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3533 {
3534         struct crypto_testsuite_params *ts_params = &testsuite_params;
3535         struct crypto_unittest_params *ut_params = &unittest_params;
3536
3537         int retval;
3538         uint8_t *ciphertext, *plaintext;
3539         unsigned ciphertext_pad_len;
3540         unsigned ciphertext_len;
3541
3542         /* Verify the capabilities */
3543         struct rte_cryptodev_sym_capability_idx cap_idx;
3544         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3545         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3546         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3547                         &cap_idx) == NULL)
3548                 return -ENOTSUP;
3549
3550         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3551                 return -ENOTSUP;
3552
3553         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3554                 return -ENOTSUP;
3555
3556         /* Create KASUMI session */
3557         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3558                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3559                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3560                                         tdata->key.data, tdata->key.len,
3561                                         tdata->cipher_iv.len);
3562         if (retval < 0)
3563                 return retval;
3564
3565         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3566         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3567
3568         /* Clear mbuf payload */
3569         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3570                rte_pktmbuf_tailroom(ut_params->ibuf));
3571
3572         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3573         /* Append data which is padded to a multiple */
3574         /* of the algorithms block size */
3575         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3576         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3577                                 ciphertext_pad_len);
3578         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3579         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3580
3581         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3582
3583         /* Create KASUMI operation */
3584         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3585                                 tdata->cipher_iv.len,
3586                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3587                                 tdata->validCipherOffsetInBits.len);
3588         if (retval < 0)
3589                 return retval;
3590
3591         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3592                                                 ut_params->op);
3593         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3594
3595         ut_params->obuf = ut_params->op->sym->m_dst;
3596         if (ut_params->obuf)
3597                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3598         else
3599                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3600
3601         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3602
3603         const uint8_t *reference_plaintext = tdata->plaintext.data +
3604                                 (tdata->validCipherOffsetInBits.len >> 3);
3605         /* Validate obuf */
3606         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3607                 plaintext,
3608                 reference_plaintext,
3609                 tdata->validCipherLenInBits.len,
3610                 "KASUMI Plaintext data not as expected");
3611         return 0;
3612 }
3613
3614 static int
3615 test_kasumi_decryption(const struct kasumi_test_data *tdata)
3616 {
3617         struct crypto_testsuite_params *ts_params = &testsuite_params;
3618         struct crypto_unittest_params *ut_params = &unittest_params;
3619
3620         int retval;
3621         uint8_t *ciphertext, *plaintext;
3622         unsigned ciphertext_pad_len;
3623         unsigned ciphertext_len;
3624         struct rte_cryptodev_info dev_info;
3625
3626         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3627         uint64_t feat_flags = dev_info.feature_flags;
3628
3629         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3630                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3631                 printf("Device doesn't support RAW data-path APIs.\n");
3632                 return -ENOTSUP;
3633         }
3634
3635         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3636                 return -ENOTSUP;
3637
3638         /* Verify the capabilities */
3639         struct rte_cryptodev_sym_capability_idx cap_idx;
3640         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3641         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3642         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3643                         &cap_idx) == NULL)
3644                 return -ENOTSUP;
3645
3646         /* Create KASUMI session */
3647         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3648                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3649                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3650                                         tdata->key.data, tdata->key.len,
3651                                         tdata->cipher_iv.len);
3652         if (retval < 0)
3653                 return retval;
3654
3655         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3656
3657         /* Clear mbuf payload */
3658         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3659                rte_pktmbuf_tailroom(ut_params->ibuf));
3660
3661         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3662         /* Append data which is padded to a multiple */
3663         /* of the algorithms block size */
3664         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3665         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3666                                 ciphertext_pad_len);
3667         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3668
3669         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3670
3671         /* Create KASUMI operation */
3672         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3673                                         tdata->cipher_iv.len,
3674                                         tdata->ciphertext.len,
3675                                         tdata->validCipherOffsetInBits.len);
3676         if (retval < 0)
3677                 return retval;
3678
3679         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3680                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3681                                 ut_params->op, 1, 0, 1, 0);
3682         else
3683                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3684                                                 ut_params->op);
3685         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3686
3687         ut_params->obuf = ut_params->op->sym->m_dst;
3688         if (ut_params->obuf)
3689                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3690         else
3691                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3692
3693         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3694
3695         const uint8_t *reference_plaintext = tdata->plaintext.data +
3696                                 (tdata->validCipherOffsetInBits.len >> 3);
3697         /* Validate obuf */
3698         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3699                 plaintext,
3700                 reference_plaintext,
3701                 tdata->validCipherLenInBits.len,
3702                 "KASUMI Plaintext data not as expected");
3703         return 0;
3704 }
3705
3706 static int
3707 test_snow3g_encryption(const struct snow3g_test_data *tdata)
3708 {
3709         struct crypto_testsuite_params *ts_params = &testsuite_params;
3710         struct crypto_unittest_params *ut_params = &unittest_params;
3711
3712         int retval;
3713         uint8_t *plaintext, *ciphertext;
3714         unsigned plaintext_pad_len;
3715         unsigned plaintext_len;
3716         struct rte_cryptodev_info dev_info;
3717
3718         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3719         uint64_t feat_flags = dev_info.feature_flags;
3720
3721         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3722                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3723                 printf("Device doesn't support RAW data-path APIs.\n");
3724                 return -ENOTSUP;
3725         }
3726
3727         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3728                 return -ENOTSUP;
3729
3730         /* Verify the capabilities */
3731         struct rte_cryptodev_sym_capability_idx cap_idx;
3732         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3733         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3734         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3735                         &cap_idx) == NULL)
3736                 return -ENOTSUP;
3737
3738         /* Create SNOW 3G session */
3739         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3740                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3741                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3742                                         tdata->key.data, tdata->key.len,
3743                                         tdata->cipher_iv.len);
3744         if (retval < 0)
3745                 return retval;
3746
3747         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3748
3749         /* Clear mbuf payload */
3750         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3751                rte_pktmbuf_tailroom(ut_params->ibuf));
3752
3753         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3754         /* Append data which is padded to a multiple of */
3755         /* the algorithms block size */
3756         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3757         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3758                                 plaintext_pad_len);
3759         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3760
3761         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3762
3763         /* Create SNOW 3G operation */
3764         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3765                                         tdata->cipher_iv.len,
3766                                         tdata->validCipherLenInBits.len,
3767                                         0);
3768         if (retval < 0)
3769                 return retval;
3770
3771         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3772                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3773                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3774         else
3775                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3776                                                 ut_params->op);
3777         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3778
3779         ut_params->obuf = ut_params->op->sym->m_dst;
3780         if (ut_params->obuf)
3781                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3782         else
3783                 ciphertext = plaintext;
3784
3785         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3786
3787         /* Validate obuf */
3788         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3789                 ciphertext,
3790                 tdata->ciphertext.data,
3791                 tdata->validDataLenInBits.len,
3792                 "SNOW 3G Ciphertext data not as expected");
3793         return 0;
3794 }
3795
3796
3797 static int
3798 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
3799 {
3800         struct crypto_testsuite_params *ts_params = &testsuite_params;
3801         struct crypto_unittest_params *ut_params = &unittest_params;
3802         uint8_t *plaintext, *ciphertext;
3803
3804         int retval;
3805         unsigned plaintext_pad_len;
3806         unsigned plaintext_len;
3807
3808         /* Verify the capabilities */
3809         struct rte_cryptodev_sym_capability_idx cap_idx;
3810         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3811         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3812         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3813                         &cap_idx) == NULL)
3814                 return -ENOTSUP;
3815
3816         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3817                 return -ENOTSUP;
3818
3819         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3820                 return -ENOTSUP;
3821
3822         /* Create SNOW 3G session */
3823         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3824                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3825                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3826                                         tdata->key.data, tdata->key.len,
3827                                         tdata->cipher_iv.len);
3828         if (retval < 0)
3829                 return retval;
3830
3831         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3832         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3833
3834         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3835                         "Failed to allocate input buffer in mempool");
3836         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3837                         "Failed to allocate output buffer in mempool");
3838
3839         /* Clear mbuf payload */
3840         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3841                rte_pktmbuf_tailroom(ut_params->ibuf));
3842
3843         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3844         /* Append data which is padded to a multiple of */
3845         /* the algorithms block size */
3846         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3847         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3848                                 plaintext_pad_len);
3849         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3850         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3851
3852         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3853
3854         /* Create SNOW 3G operation */
3855         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3856                                         tdata->cipher_iv.len,
3857                                         tdata->validCipherLenInBits.len,
3858                                         0);
3859         if (retval < 0)
3860                 return retval;
3861
3862         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3863                                                 ut_params->op);
3864         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3865
3866         ut_params->obuf = ut_params->op->sym->m_dst;
3867         if (ut_params->obuf)
3868                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3869         else
3870                 ciphertext = plaintext;
3871
3872         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3873
3874         /* Validate obuf */
3875         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3876                 ciphertext,
3877                 tdata->ciphertext.data,
3878                 tdata->validDataLenInBits.len,
3879                 "SNOW 3G Ciphertext data not as expected");
3880         return 0;
3881 }
3882
3883 static int
3884 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
3885 {
3886         struct crypto_testsuite_params *ts_params = &testsuite_params;
3887         struct crypto_unittest_params *ut_params = &unittest_params;
3888
3889         int retval;
3890         unsigned int plaintext_pad_len;
3891         unsigned int plaintext_len;
3892         uint8_t buffer[10000];
3893         const uint8_t *ciphertext;
3894
3895         struct rte_cryptodev_info dev_info;
3896
3897         /* Verify the capabilities */
3898         struct rte_cryptodev_sym_capability_idx cap_idx;
3899         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3900         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3901         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3902                         &cap_idx) == NULL)
3903                 return -ENOTSUP;
3904
3905         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3906                 return -ENOTSUP;
3907
3908         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3909                 return -ENOTSUP;
3910
3911         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3912
3913         uint64_t feat_flags = dev_info.feature_flags;
3914
3915         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3916                 printf("Device doesn't support out-of-place scatter-gather "
3917                                 "in both input and output mbufs. "
3918                                 "Test Skipped.\n");
3919                 return -ENOTSUP;
3920         }
3921
3922         /* Create SNOW 3G session */
3923         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3924                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3925                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3926                                         tdata->key.data, tdata->key.len,
3927                                         tdata->cipher_iv.len);
3928         if (retval < 0)
3929                 return retval;
3930
3931         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3932         /* Append data which is padded to a multiple of */
3933         /* the algorithms block size */
3934         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3935
3936         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3937                         plaintext_pad_len, 10, 0);
3938         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3939                         plaintext_pad_len, 3, 0);
3940
3941         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3942                         "Failed to allocate input buffer in mempool");
3943         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3944                         "Failed to allocate output buffer in mempool");
3945
3946         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3947
3948         /* Create SNOW 3G operation */
3949         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3950                                         tdata->cipher_iv.len,
3951                                         tdata->validCipherLenInBits.len,
3952                                         0);
3953         if (retval < 0)
3954                 return retval;
3955
3956         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3957                                                 ut_params->op);
3958         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3959
3960         ut_params->obuf = ut_params->op->sym->m_dst;
3961         if (ut_params->obuf)
3962                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3963                                 plaintext_len, buffer);
3964         else
3965                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
3966                                 plaintext_len, buffer);
3967
3968         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3969
3970         /* Validate obuf */
3971         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3972                 ciphertext,
3973                 tdata->ciphertext.data,
3974                 tdata->validDataLenInBits.len,
3975                 "SNOW 3G Ciphertext data not as expected");
3976
3977         return 0;
3978 }
3979
3980 /* Shift right a buffer by "offset" bits, "offset" < 8 */
3981 static void
3982 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
3983 {
3984         uint8_t curr_byte, prev_byte;
3985         uint32_t length_in_bytes = ceil_byte_length(length + offset);
3986         uint8_t lower_byte_mask = (1 << offset) - 1;
3987         unsigned i;
3988
3989         prev_byte = buffer[0];
3990         buffer[0] >>= offset;
3991
3992         for (i = 1; i < length_in_bytes; i++) {
3993                 curr_byte = buffer[i];
3994                 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
3995                                 (curr_byte >> offset);
3996                 prev_byte = curr_byte;
3997         }
3998 }
3999
4000 static int
4001 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4002 {
4003         struct crypto_testsuite_params *ts_params = &testsuite_params;
4004         struct crypto_unittest_params *ut_params = &unittest_params;
4005         uint8_t *plaintext, *ciphertext;
4006         int retval;
4007         uint32_t plaintext_len;
4008         uint32_t plaintext_pad_len;
4009         uint8_t extra_offset = 4;
4010         uint8_t *expected_ciphertext_shifted;
4011         struct rte_cryptodev_info dev_info;
4012
4013         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4014         uint64_t feat_flags = dev_info.feature_flags;
4015
4016         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4017                         ((tdata->validDataLenInBits.len % 8) != 0)) {
4018                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4019                 return -ENOTSUP;
4020         }
4021
4022         /* Verify the capabilities */
4023         struct rte_cryptodev_sym_capability_idx cap_idx;
4024         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4025         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4026         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4027                         &cap_idx) == NULL)
4028                 return -ENOTSUP;
4029
4030         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4031                 return -ENOTSUP;
4032
4033         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4034                 return -ENOTSUP;
4035
4036         /* Create SNOW 3G session */
4037         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4038                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4039                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4040                                         tdata->key.data, tdata->key.len,
4041                                         tdata->cipher_iv.len);
4042         if (retval < 0)
4043                 return retval;
4044
4045         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4046         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4047
4048         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4049                         "Failed to allocate input buffer in mempool");
4050         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4051                         "Failed to allocate output buffer in mempool");
4052
4053         /* Clear mbuf payload */
4054         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4055                rte_pktmbuf_tailroom(ut_params->ibuf));
4056
4057         plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4058         /*
4059          * Append data which is padded to a
4060          * multiple of the algorithms block size
4061          */
4062         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4063
4064         plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4065                                                 plaintext_pad_len);
4066
4067         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4068
4069         memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4070         buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4071
4072 #ifdef RTE_APP_TEST_DEBUG
4073         rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4074 #endif
4075         /* Create SNOW 3G operation */
4076         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4077                                         tdata->cipher_iv.len,
4078                                         tdata->validCipherLenInBits.len,
4079                                         extra_offset);
4080         if (retval < 0)
4081                 return retval;
4082
4083         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4084                                                 ut_params->op);
4085         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4086
4087         ut_params->obuf = ut_params->op->sym->m_dst;
4088         if (ut_params->obuf)
4089                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4090         else
4091                 ciphertext = plaintext;
4092
4093 #ifdef RTE_APP_TEST_DEBUG
4094         rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4095 #endif
4096
4097         expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4098
4099         TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4100                         "failed to reserve memory for ciphertext shifted\n");
4101
4102         memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4103                         ceil_byte_length(tdata->ciphertext.len));
4104         buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4105                         extra_offset);
4106         /* Validate obuf */
4107         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4108                 ciphertext,
4109                 expected_ciphertext_shifted,
4110                 tdata->validDataLenInBits.len,
4111                 extra_offset,
4112                 "SNOW 3G Ciphertext data not as expected");
4113         return 0;
4114 }
4115
4116 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4117 {
4118         struct crypto_testsuite_params *ts_params = &testsuite_params;
4119         struct crypto_unittest_params *ut_params = &unittest_params;
4120
4121         int retval;
4122
4123         uint8_t *plaintext, *ciphertext;
4124         unsigned ciphertext_pad_len;
4125         unsigned ciphertext_len;
4126         struct rte_cryptodev_info dev_info;
4127
4128         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4129         uint64_t feat_flags = dev_info.feature_flags;
4130
4131         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4132                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4133                 printf("Device doesn't support RAW data-path APIs.\n");
4134                 return -ENOTSUP;
4135         }
4136
4137         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4138                 return -ENOTSUP;
4139
4140         /* Verify the capabilities */
4141         struct rte_cryptodev_sym_capability_idx cap_idx;
4142         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4143         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4144         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4145                         &cap_idx) == NULL)
4146                 return -ENOTSUP;
4147
4148         /* Create SNOW 3G session */
4149         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4150                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4151                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4152                                         tdata->key.data, tdata->key.len,
4153                                         tdata->cipher_iv.len);
4154         if (retval < 0)
4155                 return retval;
4156
4157         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4158
4159         /* Clear mbuf payload */
4160         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4161                rte_pktmbuf_tailroom(ut_params->ibuf));
4162
4163         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4164         /* Append data which is padded to a multiple of */
4165         /* the algorithms block size */
4166         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4167         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4168                                 ciphertext_pad_len);
4169         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4170
4171         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4172
4173         /* Create SNOW 3G operation */
4174         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4175                                         tdata->cipher_iv.len,
4176                                         tdata->validCipherLenInBits.len,
4177                                         tdata->cipher.offset_bits);
4178         if (retval < 0)
4179                 return retval;
4180
4181         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4182                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4183                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4184         else
4185                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4186                                                 ut_params->op);
4187         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4188         ut_params->obuf = ut_params->op->sym->m_dst;
4189         if (ut_params->obuf)
4190                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4191         else
4192                 plaintext = ciphertext;
4193
4194         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4195
4196         /* Validate obuf */
4197         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4198                                 tdata->plaintext.data,
4199                                 tdata->validDataLenInBits.len,
4200                                 "SNOW 3G Plaintext data not as expected");
4201         return 0;
4202 }
4203
4204 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4205 {
4206         struct crypto_testsuite_params *ts_params = &testsuite_params;
4207         struct crypto_unittest_params *ut_params = &unittest_params;
4208
4209         int retval;
4210
4211         uint8_t *plaintext, *ciphertext;
4212         unsigned ciphertext_pad_len;
4213         unsigned ciphertext_len;
4214
4215         /* Verify the capabilities */
4216         struct rte_cryptodev_sym_capability_idx cap_idx;
4217         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4218         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4219         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4220                         &cap_idx) == NULL)
4221                 return -ENOTSUP;
4222
4223         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4224                 return -ENOTSUP;
4225
4226         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4227                 return -ENOTSUP;
4228
4229         /* Create SNOW 3G session */
4230         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4231                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4232                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4233                                         tdata->key.data, tdata->key.len,
4234                                         tdata->cipher_iv.len);
4235         if (retval < 0)
4236                 return retval;
4237
4238         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4239         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4240
4241         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4242                         "Failed to allocate input buffer");
4243         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4244                         "Failed to allocate output buffer");
4245
4246         /* Clear mbuf payload */
4247         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4248                rte_pktmbuf_tailroom(ut_params->ibuf));
4249
4250         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4251                        rte_pktmbuf_tailroom(ut_params->obuf));
4252
4253         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4254         /* Append data which is padded to a multiple of */
4255         /* the algorithms block size */
4256         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4257         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4258                                 ciphertext_pad_len);
4259         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4260         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4261
4262         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4263
4264         /* Create SNOW 3G operation */
4265         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4266                                         tdata->cipher_iv.len,
4267                                         tdata->validCipherLenInBits.len,
4268                                         0);
4269         if (retval < 0)
4270                 return retval;
4271
4272         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4273                                                 ut_params->op);
4274         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4275         ut_params->obuf = ut_params->op->sym->m_dst;
4276         if (ut_params->obuf)
4277                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4278         else
4279                 plaintext = ciphertext;
4280
4281         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4282
4283         /* Validate obuf */
4284         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4285                                 tdata->plaintext.data,
4286                                 tdata->validDataLenInBits.len,
4287                                 "SNOW 3G Plaintext data not as expected");
4288         return 0;
4289 }
4290
4291 static int
4292 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4293 {
4294         struct crypto_testsuite_params *ts_params = &testsuite_params;
4295         struct crypto_unittest_params *ut_params = &unittest_params;
4296
4297         int retval;
4298
4299         uint8_t *plaintext, *ciphertext;
4300         unsigned int plaintext_pad_len;
4301         unsigned int plaintext_len;
4302
4303         struct rte_cryptodev_info dev_info;
4304         struct rte_cryptodev_sym_capability_idx cap_idx;
4305
4306         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4307         uint64_t feat_flags = dev_info.feature_flags;
4308
4309         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4310                         ((tdata->validAuthLenInBits.len % 8 != 0) ||
4311                         (tdata->validDataLenInBits.len % 8 != 0))) {
4312                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4313                 return -ENOTSUP;
4314         }
4315
4316         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4317                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4318                 printf("Device doesn't support RAW data-path APIs.\n");
4319                 return -ENOTSUP;
4320         }
4321
4322         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4323                 return -ENOTSUP;
4324
4325         /* Check if device supports ZUC EEA3 */
4326         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4327         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4328
4329         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4330                         &cap_idx) == NULL)
4331                 return -ENOTSUP;
4332
4333         /* Check if device supports ZUC EIA3 */
4334         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4335         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4336
4337         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4338                         &cap_idx) == NULL)
4339                 return -ENOTSUP;
4340
4341         /* Create ZUC session */
4342         retval = create_zuc_cipher_auth_encrypt_generate_session(
4343                         ts_params->valid_devs[0],
4344                         tdata);
4345         if (retval < 0)
4346                 return retval;
4347         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4348
4349         /* clear mbuf payload */
4350         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4351                         rte_pktmbuf_tailroom(ut_params->ibuf));
4352
4353         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4354         /* Append data which is padded to a multiple of */
4355         /* the algorithms block size */
4356         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4357         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4358                                 plaintext_pad_len);
4359         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4360
4361         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4362
4363         /* Create ZUC operation */
4364         retval = create_zuc_cipher_hash_generate_operation(tdata);
4365         if (retval < 0)
4366                 return retval;
4367
4368         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4369                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4370                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4371         else
4372                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4373                         ut_params->op);
4374         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4375         ut_params->obuf = ut_params->op->sym->m_src;
4376         if (ut_params->obuf)
4377                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4378         else
4379                 ciphertext = plaintext;
4380
4381         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4382         /* Validate obuf */
4383         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4384                         ciphertext,
4385                         tdata->ciphertext.data,
4386                         tdata->validDataLenInBits.len,
4387                         "ZUC Ciphertext data not as expected");
4388
4389         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4390             + plaintext_pad_len;
4391
4392         /* Validate obuf */
4393         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4394                         ut_params->digest,
4395                         tdata->digest.data,
4396                         4,
4397                         "ZUC Generated auth tag not as expected");
4398         return 0;
4399 }
4400
4401 static int
4402 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4403 {
4404         struct crypto_testsuite_params *ts_params = &testsuite_params;
4405         struct crypto_unittest_params *ut_params = &unittest_params;
4406
4407         int retval;
4408
4409         uint8_t *plaintext, *ciphertext;
4410         unsigned plaintext_pad_len;
4411         unsigned plaintext_len;
4412         struct rte_cryptodev_info dev_info;
4413
4414         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4415         uint64_t feat_flags = dev_info.feature_flags;
4416
4417         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4418                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4419                 printf("Device doesn't support RAW data-path APIs.\n");
4420                 return -ENOTSUP;
4421         }
4422
4423         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4424                 return -ENOTSUP;
4425
4426         /* Verify the capabilities */
4427         struct rte_cryptodev_sym_capability_idx cap_idx;
4428         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4429         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4430         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4431                         &cap_idx) == NULL)
4432                 return -ENOTSUP;
4433         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4434         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4435         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4436                         &cap_idx) == NULL)
4437                 return -ENOTSUP;
4438
4439         /* Create SNOW 3G session */
4440         retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4441                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4442                         RTE_CRYPTO_AUTH_OP_GENERATE,
4443                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4444                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4445                         tdata->key.data, tdata->key.len,
4446                         tdata->auth_iv.len, tdata->digest.len,
4447                         tdata->cipher_iv.len);
4448         if (retval < 0)
4449                 return retval;
4450         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4451
4452         /* clear mbuf payload */
4453         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4454                         rte_pktmbuf_tailroom(ut_params->ibuf));
4455
4456         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4457         /* Append data which is padded to a multiple of */
4458         /* the algorithms block size */
4459         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4460         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4461                                 plaintext_pad_len);
4462         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4463
4464         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4465
4466         /* Create SNOW 3G operation */
4467         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4468                         tdata->digest.len, tdata->auth_iv.data,
4469                         tdata->auth_iv.len,
4470                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4471                         tdata->cipher_iv.data, tdata->cipher_iv.len,
4472                         tdata->validCipherLenInBits.len,
4473                         0,
4474                         tdata->validAuthLenInBits.len,
4475                         0
4476                         );
4477         if (retval < 0)
4478                 return retval;
4479
4480         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4481                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4482                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4483         else
4484                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4485                         ut_params->op);
4486         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4487         ut_params->obuf = ut_params->op->sym->m_src;
4488         if (ut_params->obuf)
4489                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4490         else
4491                 ciphertext = plaintext;
4492
4493         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4494         /* Validate obuf */
4495         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4496                         ciphertext,
4497                         tdata->ciphertext.data,
4498                         tdata->validDataLenInBits.len,
4499                         "SNOW 3G Ciphertext data not as expected");
4500
4501         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4502             + plaintext_pad_len;
4503
4504         /* Validate obuf */
4505         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4506                         ut_params->digest,
4507                         tdata->digest.data,
4508                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4509                         "SNOW 3G Generated auth tag not as expected");
4510         return 0;
4511 }
4512
4513 static int
4514 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4515         uint8_t op_mode, uint8_t verify)
4516 {
4517         struct crypto_testsuite_params *ts_params = &testsuite_params;
4518         struct crypto_unittest_params *ut_params = &unittest_params;
4519
4520         int retval;
4521
4522         uint8_t *plaintext = NULL, *ciphertext = NULL;
4523         unsigned int plaintext_pad_len;
4524         unsigned int plaintext_len;
4525         unsigned int ciphertext_pad_len;
4526         unsigned int ciphertext_len;
4527
4528         struct rte_cryptodev_info dev_info;
4529
4530         /* Verify the capabilities */
4531         struct rte_cryptodev_sym_capability_idx cap_idx;
4532         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4533         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4534         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4535                         &cap_idx) == NULL)
4536                 return -ENOTSUP;
4537         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4538         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4539         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4540                         &cap_idx) == NULL)
4541                 return -ENOTSUP;
4542
4543         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4544                 return -ENOTSUP;
4545
4546         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4547
4548         uint64_t feat_flags = dev_info.feature_flags;
4549
4550         if (op_mode == OUT_OF_PLACE) {
4551                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4552                         printf("Device doesn't support digest encrypted.\n");
4553                         return -ENOTSUP;
4554                 }
4555                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4556                         return -ENOTSUP;
4557         }
4558
4559         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4560                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4561                 printf("Device doesn't support RAW data-path APIs.\n");
4562                 return -ENOTSUP;
4563         }
4564
4565         /* Create SNOW 3G session */
4566         retval = create_wireless_algo_auth_cipher_session(
4567                         ts_params->valid_devs[0],
4568                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4569                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4570                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4571                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4572                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4573                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4574                         tdata->key.data, tdata->key.len,
4575                         tdata->auth_iv.len, tdata->digest.len,
4576                         tdata->cipher_iv.len);
4577
4578         if (retval < 0)
4579                 return retval;
4580
4581         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4582         if (op_mode == OUT_OF_PLACE)
4583                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4584
4585         /* clear mbuf payload */
4586         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4587                 rte_pktmbuf_tailroom(ut_params->ibuf));
4588         if (op_mode == OUT_OF_PLACE)
4589                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4590                         rte_pktmbuf_tailroom(ut_params->obuf));
4591
4592         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4593         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4594         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4595         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4596
4597         if (verify) {
4598                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4599                                         ciphertext_pad_len);
4600                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4601                 if (op_mode == OUT_OF_PLACE)
4602                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4603                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4604                         ciphertext_len);
4605         } else {
4606                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4607                                         plaintext_pad_len);
4608                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4609                 if (op_mode == OUT_OF_PLACE)
4610                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4611                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4612         }
4613
4614         /* Create SNOW 3G operation */
4615         retval = create_wireless_algo_auth_cipher_operation(
4616                 tdata->digest.data, tdata->digest.len,
4617                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4618                 tdata->auth_iv.data, tdata->auth_iv.len,
4619                 (tdata->digest.offset_bytes == 0 ?
4620                 (verify ? ciphertext_pad_len : plaintext_pad_len)
4621                         : tdata->digest.offset_bytes),
4622                 tdata->validCipherLenInBits.len,
4623                 tdata->cipher.offset_bits,
4624                 tdata->validAuthLenInBits.len,
4625                 tdata->auth.offset_bits,
4626                 op_mode, 0, verify);
4627
4628         if (retval < 0)
4629                 return retval;
4630
4631         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4632                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4633                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4634         else
4635                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4636                         ut_params->op);
4637
4638         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4639
4640         ut_params->obuf = (op_mode == IN_PLACE ?
4641                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4642
4643         if (verify) {
4644                 if (ut_params->obuf)
4645                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
4646                                                         uint8_t *);
4647                 else
4648                         plaintext = ciphertext +
4649                                 (tdata->cipher.offset_bits >> 3);
4650
4651                 debug_hexdump(stdout, "plaintext:", plaintext,
4652                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4653                 debug_hexdump(stdout, "plaintext expected:",
4654                         tdata->plaintext.data,
4655                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4656         } else {
4657                 if (ut_params->obuf)
4658                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
4659                                                         uint8_t *);
4660                 else
4661                         ciphertext = plaintext;
4662
4663                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4664                         ciphertext_len);
4665                 debug_hexdump(stdout, "ciphertext expected:",
4666                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4667
4668                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4669                         + (tdata->digest.offset_bytes == 0 ?
4670                 plaintext_pad_len : tdata->digest.offset_bytes);
4671
4672                 debug_hexdump(stdout, "digest:", ut_params->digest,
4673                         tdata->digest.len);
4674                 debug_hexdump(stdout, "digest expected:", tdata->digest.data,
4675                                 tdata->digest.len);
4676         }
4677
4678         /* Validate obuf */
4679         if (verify) {
4680                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4681                         plaintext,
4682                         tdata->plaintext.data,
4683                         tdata->plaintext.len >> 3,
4684                         "SNOW 3G Plaintext data not as expected");
4685         } else {
4686                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4687                         ciphertext,
4688                         tdata->ciphertext.data,
4689                         tdata->validDataLenInBits.len,
4690                         "SNOW 3G Ciphertext data not as expected");
4691
4692                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4693                         ut_params->digest,
4694                         tdata->digest.data,
4695                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4696                         "SNOW 3G Generated auth tag not as expected");
4697         }
4698         return 0;
4699 }
4700
4701 static int
4702 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
4703         uint8_t op_mode, uint8_t verify)
4704 {
4705         struct crypto_testsuite_params *ts_params = &testsuite_params;
4706         struct crypto_unittest_params *ut_params = &unittest_params;
4707
4708         int retval;
4709
4710         const uint8_t *plaintext = NULL;
4711         const uint8_t *ciphertext = NULL;
4712         const uint8_t *digest = NULL;
4713         unsigned int plaintext_pad_len;
4714         unsigned int plaintext_len;
4715         unsigned int ciphertext_pad_len;
4716         unsigned int ciphertext_len;
4717         uint8_t buffer[10000];
4718         uint8_t digest_buffer[10000];
4719
4720         struct rte_cryptodev_info dev_info;
4721
4722         /* Verify the capabilities */
4723         struct rte_cryptodev_sym_capability_idx cap_idx;
4724         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4725         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4726         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4727                         &cap_idx) == NULL)
4728                 return -ENOTSUP;
4729         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4730         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4731         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4732                         &cap_idx) == NULL)
4733                 return -ENOTSUP;
4734
4735         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4736                 return -ENOTSUP;
4737
4738         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4739
4740         uint64_t feat_flags = dev_info.feature_flags;
4741
4742         if (op_mode == IN_PLACE) {
4743                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
4744                         printf("Device doesn't support in-place scatter-gather "
4745                                         "in both input and output mbufs.\n");
4746                         return -ENOTSUP;
4747                 }
4748                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4749                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4750                         printf("Device doesn't support RAW data-path APIs.\n");
4751                         return -ENOTSUP;
4752                 }
4753         } else {
4754                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4755                         return -ENOTSUP;
4756                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4757                         printf("Device doesn't support out-of-place scatter-gather "
4758                                         "in both input and output mbufs.\n");
4759                         return -ENOTSUP;
4760                 }
4761                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4762                         printf("Device doesn't support digest encrypted.\n");
4763                         return -ENOTSUP;
4764                 }
4765         }
4766
4767         /* Create SNOW 3G session */
4768         retval = create_wireless_algo_auth_cipher_session(
4769                         ts_params->valid_devs[0],
4770                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4771                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4772                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4773                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4774                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4775                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4776                         tdata->key.data, tdata->key.len,
4777                         tdata->auth_iv.len, tdata->digest.len,
4778                         tdata->cipher_iv.len);
4779
4780         if (retval < 0)
4781                 return retval;
4782
4783         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4784         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4785         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4786         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4787
4788         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4789                         plaintext_pad_len, 15, 0);
4790         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4791                         "Failed to allocate input buffer in mempool");
4792
4793         if (op_mode == OUT_OF_PLACE) {
4794                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4795                                 plaintext_pad_len, 15, 0);
4796                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4797                                 "Failed to allocate output buffer in mempool");
4798         }
4799
4800         if (verify) {
4801                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
4802                         tdata->ciphertext.data);
4803                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4804                                         ciphertext_len, buffer);
4805                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4806                         ciphertext_len);
4807         } else {
4808                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
4809                         tdata->plaintext.data);
4810                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4811                                         plaintext_len, buffer);
4812                 debug_hexdump(stdout, "plaintext:", plaintext,
4813                         plaintext_len);
4814         }
4815         memset(buffer, 0, sizeof(buffer));
4816
4817         /* Create SNOW 3G operation */
4818         retval = create_wireless_algo_auth_cipher_operation(
4819                 tdata->digest.data, tdata->digest.len,
4820                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4821                 tdata->auth_iv.data, tdata->auth_iv.len,
4822                 (tdata->digest.offset_bytes == 0 ?
4823                 (verify ? ciphertext_pad_len : plaintext_pad_len)
4824                         : tdata->digest.offset_bytes),
4825                 tdata->validCipherLenInBits.len,
4826                 tdata->cipher.offset_bits,
4827                 tdata->validAuthLenInBits.len,
4828                 tdata->auth.offset_bits,
4829                 op_mode, 1, verify);
4830
4831         if (retval < 0)
4832                 return retval;
4833
4834         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4835                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4836                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4837         else
4838                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4839                         ut_params->op);
4840
4841         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4842
4843         ut_params->obuf = (op_mode == IN_PLACE ?
4844                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4845
4846         if (verify) {
4847                 if (ut_params->obuf)
4848                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
4849                                         plaintext_len, buffer);
4850                 else
4851                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4852                                         plaintext_len, buffer);
4853
4854                 debug_hexdump(stdout, "plaintext:", plaintext,
4855                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4856                 debug_hexdump(stdout, "plaintext expected:",
4857                         tdata->plaintext.data,
4858                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4859         } else {
4860                 if (ut_params->obuf)
4861                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4862                                         ciphertext_len, buffer);
4863                 else
4864                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4865                                         ciphertext_len, buffer);
4866
4867                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4868                         ciphertext_len);
4869                 debug_hexdump(stdout, "ciphertext expected:",
4870                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4871
4872                 if (ut_params->obuf)
4873                         digest = rte_pktmbuf_read(ut_params->obuf,
4874                                 (tdata->digest.offset_bytes == 0 ?
4875                                 plaintext_pad_len : tdata->digest.offset_bytes),
4876                                 tdata->digest.len, digest_buffer);
4877                 else
4878                         digest = rte_pktmbuf_read(ut_params->ibuf,
4879                                 (tdata->digest.offset_bytes == 0 ?
4880                                 plaintext_pad_len : tdata->digest.offset_bytes),
4881                                 tdata->digest.len, digest_buffer);
4882
4883                 debug_hexdump(stdout, "digest:", digest,
4884                         tdata->digest.len);
4885                 debug_hexdump(stdout, "digest expected:",
4886                         tdata->digest.data, tdata->digest.len);
4887         }
4888
4889         /* Validate obuf */
4890         if (verify) {
4891                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4892                         plaintext,
4893                         tdata->plaintext.data,
4894                         tdata->plaintext.len >> 3,
4895                         "SNOW 3G Plaintext data not as expected");
4896         } else {
4897                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4898                         ciphertext,
4899                         tdata->ciphertext.data,
4900                         tdata->validDataLenInBits.len,
4901                         "SNOW 3G Ciphertext data not as expected");
4902
4903                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4904                         digest,
4905                         tdata->digest.data,
4906                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4907                         "SNOW 3G Generated auth tag not as expected");
4908         }
4909         return 0;
4910 }
4911
4912 static int
4913 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
4914         uint8_t op_mode, uint8_t verify)
4915 {
4916         struct crypto_testsuite_params *ts_params = &testsuite_params;
4917         struct crypto_unittest_params *ut_params = &unittest_params;
4918
4919         int retval;
4920
4921         uint8_t *plaintext = NULL, *ciphertext = NULL;
4922         unsigned int plaintext_pad_len;
4923         unsigned int plaintext_len;
4924         unsigned int ciphertext_pad_len;
4925         unsigned int ciphertext_len;
4926
4927         struct rte_cryptodev_info dev_info;
4928
4929         /* Verify the capabilities */
4930         struct rte_cryptodev_sym_capability_idx cap_idx;
4931         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4932         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
4933         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4934                         &cap_idx) == NULL)
4935                 return -ENOTSUP;
4936         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4937         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4938         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4939                         &cap_idx) == NULL)
4940                 return -ENOTSUP;
4941
4942         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4943
4944         uint64_t feat_flags = dev_info.feature_flags;
4945
4946         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4947                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4948                 printf("Device doesn't support RAW data-path APIs.\n");
4949                 return -ENOTSUP;
4950         }
4951
4952         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4953                 return -ENOTSUP;
4954
4955         if (op_mode == OUT_OF_PLACE) {
4956                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4957                         return -ENOTSUP;
4958                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4959                         printf("Device doesn't support digest encrypted.\n");
4960                         return -ENOTSUP;
4961                 }
4962         }
4963
4964         /* Create KASUMI session */
4965         retval = create_wireless_algo_auth_cipher_session(
4966                         ts_params->valid_devs[0],
4967                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4968                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4969                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4970                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4971                         RTE_CRYPTO_AUTH_KASUMI_F9,
4972                         RTE_CRYPTO_CIPHER_KASUMI_F8,
4973                         tdata->key.data, tdata->key.len,
4974                         0, tdata->digest.len,
4975                         tdata->cipher_iv.len);
4976
4977         if (retval < 0)
4978                 return retval;
4979
4980         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4981         if (op_mode == OUT_OF_PLACE)
4982                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4983
4984         /* clear mbuf payload */
4985         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4986                 rte_pktmbuf_tailroom(ut_params->ibuf));
4987         if (op_mode == OUT_OF_PLACE)
4988                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4989                         rte_pktmbuf_tailroom(ut_params->obuf));
4990
4991         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4992         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4993         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4994         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4995
4996         if (verify) {
4997                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4998                                         ciphertext_pad_len);
4999                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5000                 if (op_mode == OUT_OF_PLACE)
5001                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5002                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5003                         ciphertext_len);
5004         } else {
5005                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5006                                         plaintext_pad_len);
5007                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5008                 if (op_mode == OUT_OF_PLACE)
5009                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5010                 debug_hexdump(stdout, "plaintext:", plaintext,
5011                         plaintext_len);
5012         }
5013
5014         /* Create KASUMI operation */
5015         retval = create_wireless_algo_auth_cipher_operation(
5016                 tdata->digest.data, tdata->digest.len,
5017                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5018                 NULL, 0,
5019                 (tdata->digest.offset_bytes == 0 ?
5020                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5021                         : tdata->digest.offset_bytes),
5022                 tdata->validCipherLenInBits.len,
5023                 tdata->validCipherOffsetInBits.len,
5024                 tdata->validAuthLenInBits.len,
5025                 0,
5026                 op_mode, 0, verify);
5027
5028         if (retval < 0)
5029                 return retval;
5030
5031         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5032                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5033                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5034         else
5035                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5036                         ut_params->op);
5037
5038         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5039
5040         ut_params->obuf = (op_mode == IN_PLACE ?
5041                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5042
5043
5044         if (verify) {
5045                 if (ut_params->obuf)
5046                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5047                                                         uint8_t *);
5048                 else
5049                         plaintext = ciphertext;
5050
5051                 debug_hexdump(stdout, "plaintext:", plaintext,
5052                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5053                 debug_hexdump(stdout, "plaintext expected:",
5054                         tdata->plaintext.data,
5055                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5056         } else {
5057                 if (ut_params->obuf)
5058                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5059                                                         uint8_t *);
5060                 else
5061                         ciphertext = plaintext;
5062
5063                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5064                         ciphertext_len);
5065                 debug_hexdump(stdout, "ciphertext expected:",
5066                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5067
5068                 ut_params->digest = rte_pktmbuf_mtod(
5069                         ut_params->obuf, uint8_t *) +
5070                         (tdata->digest.offset_bytes == 0 ?
5071                         plaintext_pad_len : tdata->digest.offset_bytes);
5072
5073                 debug_hexdump(stdout, "digest:", ut_params->digest,
5074                         tdata->digest.len);
5075                 debug_hexdump(stdout, "digest expected:",
5076                         tdata->digest.data, tdata->digest.len);
5077         }
5078
5079         /* Validate obuf */
5080         if (verify) {
5081                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5082                         plaintext,
5083                         tdata->plaintext.data,
5084                         tdata->plaintext.len >> 3,
5085                         "KASUMI Plaintext data not as expected");
5086         } else {
5087                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5088                         ciphertext,
5089                         tdata->ciphertext.data,
5090                         tdata->ciphertext.len >> 3,
5091                         "KASUMI Ciphertext data not as expected");
5092
5093                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5094                         ut_params->digest,
5095                         tdata->digest.data,
5096                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5097                         "KASUMI Generated auth tag not as expected");
5098         }
5099         return 0;
5100 }
5101
5102 static int
5103 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5104         uint8_t op_mode, uint8_t verify)
5105 {
5106         struct crypto_testsuite_params *ts_params = &testsuite_params;
5107         struct crypto_unittest_params *ut_params = &unittest_params;
5108
5109         int retval;
5110
5111         const uint8_t *plaintext = NULL;
5112         const uint8_t *ciphertext = NULL;
5113         const uint8_t *digest = NULL;
5114         unsigned int plaintext_pad_len;
5115         unsigned int plaintext_len;
5116         unsigned int ciphertext_pad_len;
5117         unsigned int ciphertext_len;
5118         uint8_t buffer[10000];
5119         uint8_t digest_buffer[10000];
5120
5121         struct rte_cryptodev_info dev_info;
5122
5123         /* Verify the capabilities */
5124         struct rte_cryptodev_sym_capability_idx cap_idx;
5125         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5126         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5127         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5128                         &cap_idx) == NULL)
5129                 return -ENOTSUP;
5130         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5131         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5132         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5133                         &cap_idx) == NULL)
5134                 return -ENOTSUP;
5135
5136         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5137                 return -ENOTSUP;
5138
5139         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5140
5141         uint64_t feat_flags = dev_info.feature_flags;
5142
5143         if (op_mode == IN_PLACE) {
5144                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5145                         printf("Device doesn't support in-place scatter-gather "
5146                                         "in both input and output mbufs.\n");
5147                         return -ENOTSUP;
5148                 }
5149                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5150                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5151                         printf("Device doesn't support RAW data-path APIs.\n");
5152                         return -ENOTSUP;
5153                 }
5154         } else {
5155                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5156                         return -ENOTSUP;
5157                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5158                         printf("Device doesn't support out-of-place scatter-gather "
5159                                         "in both input and output mbufs.\n");
5160                         return -ENOTSUP;
5161                 }
5162                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5163                         printf("Device doesn't support digest encrypted.\n");
5164                         return -ENOTSUP;
5165                 }
5166         }
5167
5168         /* Create KASUMI session */
5169         retval = create_wireless_algo_auth_cipher_session(
5170                         ts_params->valid_devs[0],
5171                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5172                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5173                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5174                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5175                         RTE_CRYPTO_AUTH_KASUMI_F9,
5176                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5177                         tdata->key.data, tdata->key.len,
5178                         0, tdata->digest.len,
5179                         tdata->cipher_iv.len);
5180
5181         if (retval < 0)
5182                 return retval;
5183
5184         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5185         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5186         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5187         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5188
5189         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5190                         plaintext_pad_len, 15, 0);
5191         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5192                         "Failed to allocate input buffer in mempool");
5193
5194         if (op_mode == OUT_OF_PLACE) {
5195                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5196                                 plaintext_pad_len, 15, 0);
5197                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5198                                 "Failed to allocate output buffer in mempool");
5199         }
5200
5201         if (verify) {
5202                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5203                         tdata->ciphertext.data);
5204                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5205                                         ciphertext_len, buffer);
5206                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5207                         ciphertext_len);
5208         } else {
5209                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5210                         tdata->plaintext.data);
5211                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5212                                         plaintext_len, buffer);
5213                 debug_hexdump(stdout, "plaintext:", plaintext,
5214                         plaintext_len);
5215         }
5216         memset(buffer, 0, sizeof(buffer));
5217
5218         /* Create KASUMI operation */
5219         retval = create_wireless_algo_auth_cipher_operation(
5220                 tdata->digest.data, tdata->digest.len,
5221                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5222                 NULL, 0,
5223                 (tdata->digest.offset_bytes == 0 ?
5224                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5225                         : tdata->digest.offset_bytes),
5226                 tdata->validCipherLenInBits.len,
5227                 tdata->validCipherOffsetInBits.len,
5228                 tdata->validAuthLenInBits.len,
5229                 0,
5230                 op_mode, 1, verify);
5231
5232         if (retval < 0)
5233                 return retval;
5234
5235         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5236                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5237                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5238         else
5239                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5240                         ut_params->op);
5241
5242         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5243
5244         ut_params->obuf = (op_mode == IN_PLACE ?
5245                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5246
5247         if (verify) {
5248                 if (ut_params->obuf)
5249                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5250                                         plaintext_len, buffer);
5251                 else
5252                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5253                                         plaintext_len, buffer);
5254
5255                 debug_hexdump(stdout, "plaintext:", plaintext,
5256                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5257                 debug_hexdump(stdout, "plaintext expected:",
5258                         tdata->plaintext.data,
5259                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5260         } else {
5261                 if (ut_params->obuf)
5262                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5263                                         ciphertext_len, buffer);
5264                 else
5265                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5266                                         ciphertext_len, buffer);
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                 if (ut_params->obuf)
5274                         digest = rte_pktmbuf_read(ut_params->obuf,
5275                                 (tdata->digest.offset_bytes == 0 ?
5276                                 plaintext_pad_len : tdata->digest.offset_bytes),
5277                                 tdata->digest.len, digest_buffer);
5278                 else
5279                         digest = rte_pktmbuf_read(ut_params->ibuf,
5280                                 (tdata->digest.offset_bytes == 0 ?
5281                                 plaintext_pad_len : tdata->digest.offset_bytes),
5282                                 tdata->digest.len, digest_buffer);
5283
5284                 debug_hexdump(stdout, "digest:", digest,
5285                         tdata->digest.len);
5286                 debug_hexdump(stdout, "digest expected:",
5287                         tdata->digest.data, tdata->digest.len);
5288         }
5289
5290         /* Validate obuf */
5291         if (verify) {
5292                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5293                         plaintext,
5294                         tdata->plaintext.data,
5295                         tdata->plaintext.len >> 3,
5296                         "KASUMI Plaintext data not as expected");
5297         } else {
5298                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5299                         ciphertext,
5300                         tdata->ciphertext.data,
5301                         tdata->validDataLenInBits.len,
5302                         "KASUMI Ciphertext data not as expected");
5303
5304                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5305                         digest,
5306                         tdata->digest.data,
5307                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5308                         "KASUMI Generated auth tag not as expected");
5309         }
5310         return 0;
5311 }
5312
5313 static int
5314 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5315 {
5316         struct crypto_testsuite_params *ts_params = &testsuite_params;
5317         struct crypto_unittest_params *ut_params = &unittest_params;
5318
5319         int retval;
5320
5321         uint8_t *plaintext, *ciphertext;
5322         unsigned plaintext_pad_len;
5323         unsigned plaintext_len;
5324         struct rte_cryptodev_info dev_info;
5325
5326         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5327         uint64_t feat_flags = dev_info.feature_flags;
5328
5329         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5330                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5331                 printf("Device doesn't support RAW data-path APIs.\n");
5332                 return -ENOTSUP;
5333         }
5334
5335         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5336                 return -ENOTSUP;
5337
5338         /* Verify the capabilities */
5339         struct rte_cryptodev_sym_capability_idx cap_idx;
5340         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5341         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5342         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5343                         &cap_idx) == NULL)
5344                 return -ENOTSUP;
5345         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5346         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5347         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5348                         &cap_idx) == NULL)
5349                 return -ENOTSUP;
5350
5351         /* Create KASUMI session */
5352         retval = create_wireless_algo_cipher_auth_session(
5353                         ts_params->valid_devs[0],
5354                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5355                         RTE_CRYPTO_AUTH_OP_GENERATE,
5356                         RTE_CRYPTO_AUTH_KASUMI_F9,
5357                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5358                         tdata->key.data, tdata->key.len,
5359                         0, tdata->digest.len,
5360                         tdata->cipher_iv.len);
5361         if (retval < 0)
5362                 return retval;
5363
5364         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5365
5366         /* clear mbuf payload */
5367         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5368                         rte_pktmbuf_tailroom(ut_params->ibuf));
5369
5370         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5371         /* Append data which is padded to a multiple of */
5372         /* the algorithms block size */
5373         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5374         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5375                                 plaintext_pad_len);
5376         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5377
5378         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5379
5380         /* Create KASUMI operation */
5381         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5382                                 tdata->digest.len, NULL, 0,
5383                                 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5384                                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5385                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5386                                 tdata->validCipherOffsetInBits.len,
5387                                 tdata->validAuthLenInBits.len,
5388                                 0
5389                                 );
5390         if (retval < 0)
5391                 return retval;
5392
5393         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5394                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5395                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5396         else
5397                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5398                         ut_params->op);
5399         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5400
5401         if (ut_params->op->sym->m_dst)
5402                 ut_params->obuf = ut_params->op->sym->m_dst;
5403         else
5404                 ut_params->obuf = ut_params->op->sym->m_src;
5405
5406         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5407                                 tdata->validCipherOffsetInBits.len >> 3);
5408
5409         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5410                         + plaintext_pad_len;
5411
5412         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5413                                 (tdata->validCipherOffsetInBits.len >> 3);
5414         /* Validate obuf */
5415         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5416                 ciphertext,
5417                 reference_ciphertext,
5418                 tdata->validCipherLenInBits.len,
5419                 "KASUMI Ciphertext data not as expected");
5420
5421         /* Validate obuf */
5422         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5423                 ut_params->digest,
5424                 tdata->digest.data,
5425                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5426                 "KASUMI Generated auth tag not as expected");
5427         return 0;
5428 }
5429
5430 static int
5431 test_zuc_encryption(const struct wireless_test_data *tdata)
5432 {
5433         struct crypto_testsuite_params *ts_params = &testsuite_params;
5434         struct crypto_unittest_params *ut_params = &unittest_params;
5435
5436         int retval;
5437         uint8_t *plaintext, *ciphertext;
5438         unsigned plaintext_pad_len;
5439         unsigned plaintext_len;
5440         struct rte_cryptodev_info dev_info;
5441
5442         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5443         uint64_t feat_flags = dev_info.feature_flags;
5444
5445         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5446                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5447                 printf("Device doesn't support RAW data-path APIs.\n");
5448                 return -ENOTSUP;
5449         }
5450
5451         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5452                 return -ENOTSUP;
5453
5454         struct rte_cryptodev_sym_capability_idx cap_idx;
5455
5456         /* Check if device supports ZUC EEA3 */
5457         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5458         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5459
5460         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5461                         &cap_idx) == NULL)
5462                 return -ENOTSUP;
5463
5464         /* Create ZUC session */
5465         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5466                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5467                                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5468                                         tdata->key.data, tdata->key.len,
5469                                         tdata->cipher_iv.len);
5470         if (retval < 0)
5471                 return retval;
5472
5473         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5474
5475         /* Clear mbuf payload */
5476         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5477                rte_pktmbuf_tailroom(ut_params->ibuf));
5478
5479         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5480         /* Append data which is padded to a multiple */
5481         /* of the algorithms block size */
5482         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5483         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5484                                 plaintext_pad_len);
5485         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5486
5487         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5488
5489         /* Create ZUC operation */
5490         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5491                                         tdata->cipher_iv.len,
5492                                         tdata->plaintext.len,
5493                                         0);
5494         if (retval < 0)
5495                 return retval;
5496
5497         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5498                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5499                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5500         else
5501                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5502                                                 ut_params->op);
5503         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5504
5505         ut_params->obuf = ut_params->op->sym->m_dst;
5506         if (ut_params->obuf)
5507                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5508         else
5509                 ciphertext = plaintext;
5510
5511         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5512
5513         /* Validate obuf */
5514         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5515                 ciphertext,
5516                 tdata->ciphertext.data,
5517                 tdata->validCipherLenInBits.len,
5518                 "ZUC Ciphertext data not as expected");
5519         return 0;
5520 }
5521
5522 static int
5523 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
5524 {
5525         struct crypto_testsuite_params *ts_params = &testsuite_params;
5526         struct crypto_unittest_params *ut_params = &unittest_params;
5527
5528         int retval;
5529
5530         unsigned int plaintext_pad_len;
5531         unsigned int plaintext_len;
5532         const uint8_t *ciphertext;
5533         uint8_t ciphertext_buffer[2048];
5534         struct rte_cryptodev_info dev_info;
5535
5536         struct rte_cryptodev_sym_capability_idx cap_idx;
5537
5538         /* Check if device supports ZUC EEA3 */
5539         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5540         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5541
5542         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5543                         &cap_idx) == NULL)
5544                 return -ENOTSUP;
5545
5546         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5547                 return -ENOTSUP;
5548
5549         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5550
5551         uint64_t feat_flags = dev_info.feature_flags;
5552
5553         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5554                 printf("Device doesn't support in-place scatter-gather. "
5555                                 "Test Skipped.\n");
5556                 return -ENOTSUP;
5557         }
5558
5559         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5560                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5561                 printf("Device doesn't support RAW data-path APIs.\n");
5562                 return -ENOTSUP;
5563         }
5564
5565         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5566
5567         /* Append data which is padded to a multiple */
5568         /* of the algorithms block size */
5569         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5570
5571         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5572                         plaintext_pad_len, 10, 0);
5573
5574         pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5575                         tdata->plaintext.data);
5576
5577         /* Create ZUC session */
5578         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5579                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5580                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5581                         tdata->key.data, tdata->key.len,
5582                         tdata->cipher_iv.len);
5583         if (retval < 0)
5584                 return retval;
5585
5586         /* Clear mbuf payload */
5587
5588         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
5589
5590         /* Create ZUC operation */
5591         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5592                         tdata->cipher_iv.len, tdata->plaintext.len,
5593                         0);
5594         if (retval < 0)
5595                 return retval;
5596
5597         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5598                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5599                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5600         else
5601                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5602                                                 ut_params->op);
5603         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5604
5605         ut_params->obuf = ut_params->op->sym->m_dst;
5606         if (ut_params->obuf)
5607                 ciphertext = rte_pktmbuf_read(ut_params->obuf,
5608                         0, plaintext_len, ciphertext_buffer);
5609         else
5610                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
5611                         0, plaintext_len, ciphertext_buffer);
5612
5613         /* Validate obuf */
5614         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5615
5616         /* Validate obuf */
5617         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5618                 ciphertext,
5619                 tdata->ciphertext.data,
5620                 tdata->validCipherLenInBits.len,
5621                 "ZUC Ciphertext data not as expected");
5622
5623         return 0;
5624 }
5625
5626 static int
5627 test_zuc_authentication(const struct wireless_test_data *tdata)
5628 {
5629         struct crypto_testsuite_params *ts_params = &testsuite_params;
5630         struct crypto_unittest_params *ut_params = &unittest_params;
5631
5632         int retval;
5633         unsigned plaintext_pad_len;
5634         unsigned plaintext_len;
5635         uint8_t *plaintext;
5636
5637         struct rte_cryptodev_sym_capability_idx cap_idx;
5638         struct rte_cryptodev_info dev_info;
5639
5640         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5641         uint64_t feat_flags = dev_info.feature_flags;
5642
5643         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
5644                         (tdata->validAuthLenInBits.len % 8 != 0)) {
5645                 printf("Device doesn't support NON-Byte Aligned Data.\n");
5646                 return -ENOTSUP;
5647         }
5648
5649         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5650                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5651                 printf("Device doesn't support RAW data-path APIs.\n");
5652                 return -ENOTSUP;
5653         }
5654
5655         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5656                 return -ENOTSUP;
5657
5658         /* Check if device supports ZUC EIA3 */
5659         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5660         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5661
5662         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5663                         &cap_idx) == NULL)
5664                 return -ENOTSUP;
5665
5666         /* Create ZUC session */
5667         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
5668                         tdata->key.data, tdata->key.len,
5669                         tdata->auth_iv.len, tdata->digest.len,
5670                         RTE_CRYPTO_AUTH_OP_GENERATE,
5671                         RTE_CRYPTO_AUTH_ZUC_EIA3);
5672         if (retval < 0)
5673                 return retval;
5674
5675         /* alloc mbuf and set payload */
5676         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5677
5678         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5679         rte_pktmbuf_tailroom(ut_params->ibuf));
5680
5681         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5682         /* Append data which is padded to a multiple of */
5683         /* the algorithms block size */
5684         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5685         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5686                                 plaintext_pad_len);
5687         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5688
5689         /* Create ZUC operation */
5690         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
5691                         tdata->auth_iv.data, tdata->auth_iv.len,
5692                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5693                         tdata->validAuthLenInBits.len,
5694                         0);
5695         if (retval < 0)
5696                 return retval;
5697
5698         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5699                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5700                                 ut_params->op, 0, 1, 1, 0);
5701         else
5702                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5703                                 ut_params->op);
5704         ut_params->obuf = ut_params->op->sym->m_src;
5705         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5706         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5707                         + plaintext_pad_len;
5708
5709         /* Validate obuf */
5710         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5711         ut_params->digest,
5712         tdata->digest.data,
5713         tdata->digest.len,
5714         "ZUC Generated auth tag not as expected");
5715
5716         return 0;
5717 }
5718
5719 static int
5720 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
5721         uint8_t op_mode, uint8_t verify)
5722 {
5723         struct crypto_testsuite_params *ts_params = &testsuite_params;
5724         struct crypto_unittest_params *ut_params = &unittest_params;
5725
5726         int retval;
5727
5728         uint8_t *plaintext = NULL, *ciphertext = NULL;
5729         unsigned int plaintext_pad_len;
5730         unsigned int plaintext_len;
5731         unsigned int ciphertext_pad_len;
5732         unsigned int ciphertext_len;
5733
5734         struct rte_cryptodev_info dev_info;
5735         struct rte_cryptodev_sym_capability_idx cap_idx;
5736
5737         /* Check if device supports ZUC EIA3 */
5738         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5739         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5740
5741         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5742                         &cap_idx) == NULL)
5743                 return -ENOTSUP;
5744
5745         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5746
5747         uint64_t feat_flags = dev_info.feature_flags;
5748
5749         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5750                 printf("Device doesn't support digest encrypted.\n");
5751                 return -ENOTSUP;
5752         }
5753         if (op_mode == IN_PLACE) {
5754                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5755                         printf("Device doesn't support in-place scatter-gather "
5756                                         "in both input and output mbufs.\n");
5757                         return -ENOTSUP;
5758                 }
5759
5760                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5761                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5762                         printf("Device doesn't support RAW data-path APIs.\n");
5763                         return -ENOTSUP;
5764                 }
5765         } else {
5766                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5767                         return -ENOTSUP;
5768                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5769                         printf("Device doesn't support out-of-place scatter-gather "
5770                                         "in both input and output mbufs.\n");
5771                         return -ENOTSUP;
5772                 }
5773         }
5774
5775         /* Create ZUC session */
5776         retval = create_wireless_algo_auth_cipher_session(
5777                         ts_params->valid_devs[0],
5778                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5779                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5780                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5781                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5782                         RTE_CRYPTO_AUTH_ZUC_EIA3,
5783                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5784                         tdata->key.data, tdata->key.len,
5785                         tdata->auth_iv.len, tdata->digest.len,
5786                         tdata->cipher_iv.len);
5787
5788         if (retval < 0)
5789                 return retval;
5790
5791         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5792         if (op_mode == OUT_OF_PLACE)
5793                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5794
5795         /* clear mbuf payload */
5796         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5797                 rte_pktmbuf_tailroom(ut_params->ibuf));
5798         if (op_mode == OUT_OF_PLACE)
5799                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5800                         rte_pktmbuf_tailroom(ut_params->obuf));
5801
5802         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5803         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5804         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5805         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5806
5807         if (verify) {
5808                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5809                                         ciphertext_pad_len);
5810                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5811                 if (op_mode == OUT_OF_PLACE)
5812                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5813                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5814                         ciphertext_len);
5815         } else {
5816                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5817                                         plaintext_pad_len);
5818                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5819                 if (op_mode == OUT_OF_PLACE)
5820                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5821                 debug_hexdump(stdout, "plaintext:", plaintext,
5822                         plaintext_len);
5823         }
5824
5825         /* Create ZUC operation */
5826         retval = create_wireless_algo_auth_cipher_operation(
5827                 tdata->digest.data, tdata->digest.len,
5828                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5829                 tdata->auth_iv.data, tdata->auth_iv.len,
5830                 (tdata->digest.offset_bytes == 0 ?
5831                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5832                         : tdata->digest.offset_bytes),
5833                 tdata->validCipherLenInBits.len,
5834                 tdata->validCipherOffsetInBits.len,
5835                 tdata->validAuthLenInBits.len,
5836                 0,
5837                 op_mode, 0, verify);
5838
5839         if (retval < 0)
5840                 return retval;
5841
5842         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5843                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5844                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5845         else
5846                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5847                         ut_params->op);
5848
5849         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5850
5851         ut_params->obuf = (op_mode == IN_PLACE ?
5852                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5853
5854
5855         if (verify) {
5856                 if (ut_params->obuf)
5857                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5858                                                         uint8_t *);
5859                 else
5860                         plaintext = ciphertext;
5861
5862                 debug_hexdump(stdout, "plaintext:", plaintext,
5863                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5864                 debug_hexdump(stdout, "plaintext expected:",
5865                         tdata->plaintext.data,
5866                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5867         } else {
5868                 if (ut_params->obuf)
5869                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5870                                                         uint8_t *);
5871                 else
5872                         ciphertext = plaintext;
5873
5874                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5875                         ciphertext_len);
5876                 debug_hexdump(stdout, "ciphertext expected:",
5877                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5878
5879                 ut_params->digest = rte_pktmbuf_mtod(
5880                         ut_params->obuf, uint8_t *) +
5881                         (tdata->digest.offset_bytes == 0 ?
5882                         plaintext_pad_len : tdata->digest.offset_bytes);
5883
5884                 debug_hexdump(stdout, "digest:", ut_params->digest,
5885                         tdata->digest.len);
5886                 debug_hexdump(stdout, "digest expected:",
5887                         tdata->digest.data, tdata->digest.len);
5888         }
5889
5890         /* Validate obuf */
5891         if (verify) {
5892                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5893                         plaintext,
5894                         tdata->plaintext.data,
5895                         tdata->plaintext.len >> 3,
5896                         "ZUC Plaintext data not as expected");
5897         } else {
5898                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5899                         ciphertext,
5900                         tdata->ciphertext.data,
5901                         tdata->ciphertext.len >> 3,
5902                         "ZUC Ciphertext data not as expected");
5903
5904                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5905                         ut_params->digest,
5906                         tdata->digest.data,
5907                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5908                         "ZUC Generated auth tag not as expected");
5909         }
5910         return 0;
5911 }
5912
5913 static int
5914 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
5915         uint8_t op_mode, uint8_t verify)
5916 {
5917         struct crypto_testsuite_params *ts_params = &testsuite_params;
5918         struct crypto_unittest_params *ut_params = &unittest_params;
5919
5920         int retval;
5921
5922         const uint8_t *plaintext = NULL;
5923         const uint8_t *ciphertext = NULL;
5924         const uint8_t *digest = NULL;
5925         unsigned int plaintext_pad_len;
5926         unsigned int plaintext_len;
5927         unsigned int ciphertext_pad_len;
5928         unsigned int ciphertext_len;
5929         uint8_t buffer[10000];
5930         uint8_t digest_buffer[10000];
5931
5932         struct rte_cryptodev_info dev_info;
5933         struct rte_cryptodev_sym_capability_idx cap_idx;
5934
5935         /* Check if device supports ZUC EIA3 */
5936         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5937         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5938
5939         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5940                         &cap_idx) == NULL)
5941                 return -ENOTSUP;
5942
5943         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5944
5945         uint64_t feat_flags = dev_info.feature_flags;
5946
5947         if (op_mode == IN_PLACE) {
5948                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5949                         printf("Device doesn't support in-place scatter-gather "
5950                                         "in both input and output mbufs.\n");
5951                         return -ENOTSUP;
5952                 }
5953
5954                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5955                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5956                         printf("Device doesn't support RAW data-path APIs.\n");
5957                         return -ENOTSUP;
5958                 }
5959         } else {
5960                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5961                         return -ENOTSUP;
5962                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5963                         printf("Device doesn't support out-of-place scatter-gather "
5964                                         "in both input and output mbufs.\n");
5965                         return -ENOTSUP;
5966                 }
5967                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5968                         printf("Device doesn't support digest encrypted.\n");
5969                         return -ENOTSUP;
5970                 }
5971         }
5972
5973         /* Create ZUC session */
5974         retval = create_wireless_algo_auth_cipher_session(
5975                         ts_params->valid_devs[0],
5976                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5977                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5978                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5979                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5980                         RTE_CRYPTO_AUTH_ZUC_EIA3,
5981                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5982                         tdata->key.data, tdata->key.len,
5983                         tdata->auth_iv.len, tdata->digest.len,
5984                         tdata->cipher_iv.len);
5985
5986         if (retval < 0)
5987                 return retval;
5988
5989         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5990         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5991         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5992         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5993
5994         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5995                         plaintext_pad_len, 15, 0);
5996         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5997                         "Failed to allocate input buffer in mempool");
5998
5999         if (op_mode == OUT_OF_PLACE) {
6000                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6001                                 plaintext_pad_len, 15, 0);
6002                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
6003                                 "Failed to allocate output buffer in mempool");
6004         }
6005
6006         if (verify) {
6007                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6008                         tdata->ciphertext.data);
6009                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6010                                         ciphertext_len, buffer);
6011                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6012                         ciphertext_len);
6013         } else {
6014                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6015                         tdata->plaintext.data);
6016                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6017                                         plaintext_len, buffer);
6018                 debug_hexdump(stdout, "plaintext:", plaintext,
6019                         plaintext_len);
6020         }
6021         memset(buffer, 0, sizeof(buffer));
6022
6023         /* Create ZUC operation */
6024         retval = create_wireless_algo_auth_cipher_operation(
6025                 tdata->digest.data, tdata->digest.len,
6026                 tdata->cipher_iv.data, tdata->cipher_iv.len,
6027                 NULL, 0,
6028                 (tdata->digest.offset_bytes == 0 ?
6029                 (verify ? ciphertext_pad_len : plaintext_pad_len)
6030                         : tdata->digest.offset_bytes),
6031                 tdata->validCipherLenInBits.len,
6032                 tdata->validCipherOffsetInBits.len,
6033                 tdata->validAuthLenInBits.len,
6034                 0,
6035                 op_mode, 1, verify);
6036
6037         if (retval < 0)
6038                 return retval;
6039
6040         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6041                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6042                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6043         else
6044                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6045                         ut_params->op);
6046
6047         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6048
6049         ut_params->obuf = (op_mode == IN_PLACE ?
6050                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6051
6052         if (verify) {
6053                 if (ut_params->obuf)
6054                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6055                                         plaintext_len, buffer);
6056                 else
6057                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6058                                         plaintext_len, buffer);
6059
6060                 debug_hexdump(stdout, "plaintext:", plaintext,
6061                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6062                 debug_hexdump(stdout, "plaintext expected:",
6063                         tdata->plaintext.data,
6064                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6065         } else {
6066                 if (ut_params->obuf)
6067                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6068                                         ciphertext_len, buffer);
6069                 else
6070                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6071                                         ciphertext_len, buffer);
6072
6073                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6074                         ciphertext_len);
6075                 debug_hexdump(stdout, "ciphertext expected:",
6076                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6077
6078                 if (ut_params->obuf)
6079                         digest = rte_pktmbuf_read(ut_params->obuf,
6080                                 (tdata->digest.offset_bytes == 0 ?
6081                                 plaintext_pad_len : tdata->digest.offset_bytes),
6082                                 tdata->digest.len, digest_buffer);
6083                 else
6084                         digest = rte_pktmbuf_read(ut_params->ibuf,
6085                                 (tdata->digest.offset_bytes == 0 ?
6086                                 plaintext_pad_len : tdata->digest.offset_bytes),
6087                                 tdata->digest.len, digest_buffer);
6088
6089                 debug_hexdump(stdout, "digest:", digest,
6090                         tdata->digest.len);
6091                 debug_hexdump(stdout, "digest expected:",
6092                         tdata->digest.data, tdata->digest.len);
6093         }
6094
6095         /* Validate obuf */
6096         if (verify) {
6097                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6098                         plaintext,
6099                         tdata->plaintext.data,
6100                         tdata->plaintext.len >> 3,
6101                         "ZUC Plaintext data not as expected");
6102         } else {
6103                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6104                         ciphertext,
6105                         tdata->ciphertext.data,
6106                         tdata->validDataLenInBits.len,
6107                         "ZUC Ciphertext data not as expected");
6108
6109                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6110                         digest,
6111                         tdata->digest.data,
6112                         DIGEST_BYTE_LENGTH_KASUMI_F9,
6113                         "ZUC Generated auth tag not as expected");
6114         }
6115         return 0;
6116 }
6117
6118 static int
6119 test_kasumi_encryption_test_case_1(void)
6120 {
6121         return test_kasumi_encryption(&kasumi_test_case_1);
6122 }
6123
6124 static int
6125 test_kasumi_encryption_test_case_1_sgl(void)
6126 {
6127         return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6128 }
6129
6130 static int
6131 test_kasumi_encryption_test_case_1_oop(void)
6132 {
6133         return test_kasumi_encryption_oop(&kasumi_test_case_1);
6134 }
6135
6136 static int
6137 test_kasumi_encryption_test_case_1_oop_sgl(void)
6138 {
6139         return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6140 }
6141
6142 static int
6143 test_kasumi_encryption_test_case_2(void)
6144 {
6145         return test_kasumi_encryption(&kasumi_test_case_2);
6146 }
6147
6148 static int
6149 test_kasumi_encryption_test_case_3(void)
6150 {
6151         return test_kasumi_encryption(&kasumi_test_case_3);
6152 }
6153
6154 static int
6155 test_kasumi_encryption_test_case_4(void)
6156 {
6157         return test_kasumi_encryption(&kasumi_test_case_4);
6158 }
6159
6160 static int
6161 test_kasumi_encryption_test_case_5(void)
6162 {
6163         return test_kasumi_encryption(&kasumi_test_case_5);
6164 }
6165
6166 static int
6167 test_kasumi_decryption_test_case_1(void)
6168 {
6169         return test_kasumi_decryption(&kasumi_test_case_1);
6170 }
6171
6172 static int
6173 test_kasumi_decryption_test_case_1_oop(void)
6174 {
6175         return test_kasumi_decryption_oop(&kasumi_test_case_1);
6176 }
6177
6178 static int
6179 test_kasumi_decryption_test_case_2(void)
6180 {
6181         return test_kasumi_decryption(&kasumi_test_case_2);
6182 }
6183
6184 static int
6185 test_kasumi_decryption_test_case_3(void)
6186 {
6187         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6188         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6189                 return -ENOTSUP;
6190         return test_kasumi_decryption(&kasumi_test_case_3);
6191 }
6192
6193 static int
6194 test_kasumi_decryption_test_case_4(void)
6195 {
6196         return test_kasumi_decryption(&kasumi_test_case_4);
6197 }
6198
6199 static int
6200 test_kasumi_decryption_test_case_5(void)
6201 {
6202         return test_kasumi_decryption(&kasumi_test_case_5);
6203 }
6204 static int
6205 test_snow3g_encryption_test_case_1(void)
6206 {
6207         return test_snow3g_encryption(&snow3g_test_case_1);
6208 }
6209
6210 static int
6211 test_snow3g_encryption_test_case_1_oop(void)
6212 {
6213         return test_snow3g_encryption_oop(&snow3g_test_case_1);
6214 }
6215
6216 static int
6217 test_snow3g_encryption_test_case_1_oop_sgl(void)
6218 {
6219         return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6220 }
6221
6222
6223 static int
6224 test_snow3g_encryption_test_case_1_offset_oop(void)
6225 {
6226         return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6227 }
6228
6229 static int
6230 test_snow3g_encryption_test_case_2(void)
6231 {
6232         return test_snow3g_encryption(&snow3g_test_case_2);
6233 }
6234
6235 static int
6236 test_snow3g_encryption_test_case_3(void)
6237 {
6238         return test_snow3g_encryption(&snow3g_test_case_3);
6239 }
6240
6241 static int
6242 test_snow3g_encryption_test_case_4(void)
6243 {
6244         return test_snow3g_encryption(&snow3g_test_case_4);
6245 }
6246
6247 static int
6248 test_snow3g_encryption_test_case_5(void)
6249 {
6250         return test_snow3g_encryption(&snow3g_test_case_5);
6251 }
6252
6253 static int
6254 test_snow3g_decryption_test_case_1(void)
6255 {
6256         return test_snow3g_decryption(&snow3g_test_case_1);
6257 }
6258
6259 static int
6260 test_snow3g_decryption_test_case_1_oop(void)
6261 {
6262         return test_snow3g_decryption_oop(&snow3g_test_case_1);
6263 }
6264
6265 static int
6266 test_snow3g_decryption_test_case_2(void)
6267 {
6268         return test_snow3g_decryption(&snow3g_test_case_2);
6269 }
6270
6271 static int
6272 test_snow3g_decryption_test_case_3(void)
6273 {
6274         return test_snow3g_decryption(&snow3g_test_case_3);
6275 }
6276
6277 static int
6278 test_snow3g_decryption_test_case_4(void)
6279 {
6280         return test_snow3g_decryption(&snow3g_test_case_4);
6281 }
6282
6283 static int
6284 test_snow3g_decryption_test_case_5(void)
6285 {
6286         return test_snow3g_decryption(&snow3g_test_case_5);
6287 }
6288
6289 /*
6290  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6291  * Pattern digest from snow3g_test_data must be allocated as
6292  * 4 last bytes in plaintext.
6293  */
6294 static void
6295 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6296                 struct snow3g_hash_test_data *output)
6297 {
6298         if ((pattern != NULL) && (output != NULL)) {
6299                 output->key.len = pattern->key.len;
6300
6301                 memcpy(output->key.data,
6302                 pattern->key.data, pattern->key.len);
6303
6304                 output->auth_iv.len = pattern->auth_iv.len;
6305
6306                 memcpy(output->auth_iv.data,
6307                 pattern->auth_iv.data, pattern->auth_iv.len);
6308
6309                 output->plaintext.len = pattern->plaintext.len;
6310
6311                 memcpy(output->plaintext.data,
6312                 pattern->plaintext.data, pattern->plaintext.len >> 3);
6313
6314                 output->digest.len = pattern->digest.len;
6315
6316                 memcpy(output->digest.data,
6317                 &pattern->plaintext.data[pattern->digest.offset_bytes],
6318                 pattern->digest.len);
6319
6320                 output->validAuthLenInBits.len =
6321                 pattern->validAuthLenInBits.len;
6322         }
6323 }
6324
6325 /*
6326  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6327  */
6328 static int
6329 test_snow3g_decryption_with_digest_test_case_1(void)
6330 {
6331         struct snow3g_hash_test_data snow3g_hash_data;
6332         struct rte_cryptodev_info dev_info;
6333         struct crypto_testsuite_params *ts_params = &testsuite_params;
6334
6335         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6336         uint64_t feat_flags = dev_info.feature_flags;
6337
6338         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6339                 printf("Device doesn't support encrypted digest operations.\n");
6340                 return -ENOTSUP;
6341         }
6342
6343         /*
6344          * Function prepare data for hash veryfication test case.
6345          * Digest is allocated in 4 last bytes in plaintext, pattern.
6346          */
6347         snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6348
6349         return test_snow3g_decryption(&snow3g_test_case_7) &
6350                         test_snow3g_authentication_verify(&snow3g_hash_data);
6351 }
6352
6353 static int
6354 test_snow3g_cipher_auth_test_case_1(void)
6355 {
6356         return test_snow3g_cipher_auth(&snow3g_test_case_3);
6357 }
6358
6359 static int
6360 test_snow3g_auth_cipher_test_case_1(void)
6361 {
6362         return test_snow3g_auth_cipher(
6363                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6364 }
6365
6366 static int
6367 test_snow3g_auth_cipher_test_case_2(void)
6368 {
6369         return test_snow3g_auth_cipher(
6370                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6371 }
6372
6373 static int
6374 test_snow3g_auth_cipher_test_case_2_oop(void)
6375 {
6376         return test_snow3g_auth_cipher(
6377                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6378 }
6379
6380 static int
6381 test_snow3g_auth_cipher_part_digest_enc(void)
6382 {
6383         return test_snow3g_auth_cipher(
6384                 &snow3g_auth_cipher_partial_digest_encryption,
6385                         IN_PLACE, 0);
6386 }
6387
6388 static int
6389 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6390 {
6391         return test_snow3g_auth_cipher(
6392                 &snow3g_auth_cipher_partial_digest_encryption,
6393                         OUT_OF_PLACE, 0);
6394 }
6395
6396 static int
6397 test_snow3g_auth_cipher_test_case_3_sgl(void)
6398 {
6399         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6400         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6401                 return -ENOTSUP;
6402         return test_snow3g_auth_cipher_sgl(
6403                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6404 }
6405
6406 static int
6407 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6408 {
6409         return test_snow3g_auth_cipher_sgl(
6410                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6411 }
6412
6413 static int
6414 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6415 {
6416         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6417         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6418                 return -ENOTSUP;
6419         return test_snow3g_auth_cipher_sgl(
6420                 &snow3g_auth_cipher_partial_digest_encryption,
6421                         IN_PLACE, 0);
6422 }
6423
6424 static int
6425 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6426 {
6427         return test_snow3g_auth_cipher_sgl(
6428                 &snow3g_auth_cipher_partial_digest_encryption,
6429                         OUT_OF_PLACE, 0);
6430 }
6431
6432 static int
6433 test_snow3g_auth_cipher_verify_test_case_1(void)
6434 {
6435         return test_snow3g_auth_cipher(
6436                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6437 }
6438
6439 static int
6440 test_snow3g_auth_cipher_verify_test_case_2(void)
6441 {
6442         return test_snow3g_auth_cipher(
6443                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6444 }
6445
6446 static int
6447 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6448 {
6449         return test_snow3g_auth_cipher(
6450                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6451 }
6452
6453 static int
6454 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6455 {
6456         return test_snow3g_auth_cipher(
6457                 &snow3g_auth_cipher_partial_digest_encryption,
6458                         IN_PLACE, 1);
6459 }
6460
6461 static int
6462 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6463 {
6464         return test_snow3g_auth_cipher(
6465                 &snow3g_auth_cipher_partial_digest_encryption,
6466                         OUT_OF_PLACE, 1);
6467 }
6468
6469 static int
6470 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6471 {
6472         return test_snow3g_auth_cipher_sgl(
6473                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6474 }
6475
6476 static int
6477 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6478 {
6479         return test_snow3g_auth_cipher_sgl(
6480                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6481 }
6482
6483 static int
6484 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6485 {
6486         return test_snow3g_auth_cipher_sgl(
6487                 &snow3g_auth_cipher_partial_digest_encryption,
6488                         IN_PLACE, 1);
6489 }
6490
6491 static int
6492 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6493 {
6494         return test_snow3g_auth_cipher_sgl(
6495                 &snow3g_auth_cipher_partial_digest_encryption,
6496                         OUT_OF_PLACE, 1);
6497 }
6498
6499 static int
6500 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6501 {
6502         return test_snow3g_auth_cipher(
6503                 &snow3g_test_case_7, IN_PLACE, 0);
6504 }
6505
6506 static int
6507 test_kasumi_auth_cipher_test_case_1(void)
6508 {
6509         return test_kasumi_auth_cipher(
6510                 &kasumi_test_case_3, IN_PLACE, 0);
6511 }
6512
6513 static int
6514 test_kasumi_auth_cipher_test_case_2(void)
6515 {
6516         return test_kasumi_auth_cipher(
6517                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6518 }
6519
6520 static int
6521 test_kasumi_auth_cipher_test_case_2_oop(void)
6522 {
6523         return test_kasumi_auth_cipher(
6524                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6525 }
6526
6527 static int
6528 test_kasumi_auth_cipher_test_case_2_sgl(void)
6529 {
6530         return test_kasumi_auth_cipher_sgl(
6531                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6532 }
6533
6534 static int
6535 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6536 {
6537         return test_kasumi_auth_cipher_sgl(
6538                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6539 }
6540
6541 static int
6542 test_kasumi_auth_cipher_verify_test_case_1(void)
6543 {
6544         return test_kasumi_auth_cipher(
6545                 &kasumi_test_case_3, IN_PLACE, 1);
6546 }
6547
6548 static int
6549 test_kasumi_auth_cipher_verify_test_case_2(void)
6550 {
6551         return test_kasumi_auth_cipher(
6552                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6553 }
6554
6555 static int
6556 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
6557 {
6558         return test_kasumi_auth_cipher(
6559                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6560 }
6561
6562 static int
6563 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
6564 {
6565         return test_kasumi_auth_cipher_sgl(
6566                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6567 }
6568
6569 static int
6570 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
6571 {
6572         return test_kasumi_auth_cipher_sgl(
6573                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6574 }
6575
6576 static int
6577 test_kasumi_cipher_auth_test_case_1(void)
6578 {
6579         return test_kasumi_cipher_auth(&kasumi_test_case_6);
6580 }
6581
6582 static int
6583 test_zuc_encryption_test_case_1(void)
6584 {
6585         return test_zuc_encryption(&zuc_test_case_cipher_193b);
6586 }
6587
6588 static int
6589 test_zuc_encryption_test_case_2(void)
6590 {
6591         return test_zuc_encryption(&zuc_test_case_cipher_800b);
6592 }
6593
6594 static int
6595 test_zuc_encryption_test_case_3(void)
6596 {
6597         return test_zuc_encryption(&zuc_test_case_cipher_1570b);
6598 }
6599
6600 static int
6601 test_zuc_encryption_test_case_4(void)
6602 {
6603         return test_zuc_encryption(&zuc_test_case_cipher_2798b);
6604 }
6605
6606 static int
6607 test_zuc_encryption_test_case_5(void)
6608 {
6609         return test_zuc_encryption(&zuc_test_case_cipher_4019b);
6610 }
6611
6612 static int
6613 test_zuc_encryption_test_case_6_sgl(void)
6614 {
6615         return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
6616 }
6617
6618 static int
6619 test_zuc_hash_generate_test_case_1(void)
6620 {
6621         return test_zuc_authentication(&zuc_test_case_auth_1b);
6622 }
6623
6624 static int
6625 test_zuc_hash_generate_test_case_2(void)
6626 {
6627         return test_zuc_authentication(&zuc_test_case_auth_90b);
6628 }
6629
6630 static int
6631 test_zuc_hash_generate_test_case_3(void)
6632 {
6633         return test_zuc_authentication(&zuc_test_case_auth_577b);
6634 }
6635
6636 static int
6637 test_zuc_hash_generate_test_case_4(void)
6638 {
6639         return test_zuc_authentication(&zuc_test_case_auth_2079b);
6640 }
6641
6642 static int
6643 test_zuc_hash_generate_test_case_5(void)
6644 {
6645         return test_zuc_authentication(&zuc_test_auth_5670b);
6646 }
6647
6648 static int
6649 test_zuc_hash_generate_test_case_6(void)
6650 {
6651         return test_zuc_authentication(&zuc_test_case_auth_128b);
6652 }
6653
6654 static int
6655 test_zuc_hash_generate_test_case_7(void)
6656 {
6657         return test_zuc_authentication(&zuc_test_case_auth_2080b);
6658 }
6659
6660 static int
6661 test_zuc_hash_generate_test_case_8(void)
6662 {
6663         return test_zuc_authentication(&zuc_test_case_auth_584b);
6664 }
6665
6666 static int
6667 test_zuc_cipher_auth_test_case_1(void)
6668 {
6669         return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
6670 }
6671
6672 static int
6673 test_zuc_cipher_auth_test_case_2(void)
6674 {
6675         return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
6676 }
6677
6678 static int
6679 test_zuc_auth_cipher_test_case_1(void)
6680 {
6681         return test_zuc_auth_cipher(
6682                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6683 }
6684
6685 static int
6686 test_zuc_auth_cipher_test_case_1_oop(void)
6687 {
6688         return test_zuc_auth_cipher(
6689                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6690 }
6691
6692 static int
6693 test_zuc_auth_cipher_test_case_1_sgl(void)
6694 {
6695         return test_zuc_auth_cipher_sgl(
6696                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6697 }
6698
6699 static int
6700 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
6701 {
6702         return test_zuc_auth_cipher_sgl(
6703                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6704 }
6705
6706 static int
6707 test_zuc_auth_cipher_verify_test_case_1(void)
6708 {
6709         return test_zuc_auth_cipher(
6710                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6711 }
6712
6713 static int
6714 test_zuc_auth_cipher_verify_test_case_1_oop(void)
6715 {
6716         return test_zuc_auth_cipher(
6717                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6718 }
6719
6720 static int
6721 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
6722 {
6723         return test_zuc_auth_cipher_sgl(
6724                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6725 }
6726
6727 static int
6728 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
6729 {
6730         return test_zuc_auth_cipher_sgl(
6731                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6732 }
6733
6734 static int
6735 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
6736 {
6737         uint8_t dev_id = testsuite_params.valid_devs[0];
6738
6739         struct rte_cryptodev_sym_capability_idx cap_idx;
6740
6741         /* Check if device supports particular cipher algorithm */
6742         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6743         cap_idx.algo.cipher = tdata->cipher_algo;
6744         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6745                 return -ENOTSUP;
6746
6747         /* Check if device supports particular hash algorithm */
6748         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6749         cap_idx.algo.auth = tdata->auth_algo;
6750         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6751                 return -ENOTSUP;
6752
6753         return 0;
6754 }
6755
6756 static int
6757 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
6758         uint8_t op_mode, uint8_t verify)
6759 {
6760         struct crypto_testsuite_params *ts_params = &testsuite_params;
6761         struct crypto_unittest_params *ut_params = &unittest_params;
6762
6763         int retval;
6764
6765         uint8_t *plaintext = NULL, *ciphertext = NULL;
6766         unsigned int plaintext_pad_len;
6767         unsigned int plaintext_len;
6768         unsigned int ciphertext_pad_len;
6769         unsigned int ciphertext_len;
6770
6771         struct rte_cryptodev_info dev_info;
6772         struct rte_crypto_op *op;
6773
6774         /* Check if device supports particular algorithms separately */
6775         if (test_mixed_check_if_unsupported(tdata))
6776                 return -ENOTSUP;
6777         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6778                 return -ENOTSUP;
6779
6780         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6781
6782         uint64_t feat_flags = dev_info.feature_flags;
6783
6784         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6785                 printf("Device doesn't support digest encrypted.\n");
6786                 return -ENOTSUP;
6787         }
6788
6789         /* Create the session */
6790         if (verify)
6791                 retval = create_wireless_algo_cipher_auth_session(
6792                                 ts_params->valid_devs[0],
6793                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
6794                                 RTE_CRYPTO_AUTH_OP_VERIFY,
6795                                 tdata->auth_algo,
6796                                 tdata->cipher_algo,
6797                                 tdata->auth_key.data, tdata->auth_key.len,
6798                                 tdata->auth_iv.len, tdata->digest_enc.len,
6799                                 tdata->cipher_iv.len);
6800         else
6801                 retval = create_wireless_algo_auth_cipher_session(
6802                                 ts_params->valid_devs[0],
6803                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6804                                 RTE_CRYPTO_AUTH_OP_GENERATE,
6805                                 tdata->auth_algo,
6806                                 tdata->cipher_algo,
6807                                 tdata->auth_key.data, tdata->auth_key.len,
6808                                 tdata->auth_iv.len, tdata->digest_enc.len,
6809                                 tdata->cipher_iv.len);
6810         if (retval < 0)
6811                 return retval;
6812
6813         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6814         if (op_mode == OUT_OF_PLACE)
6815                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6816
6817         /* clear mbuf payload */
6818         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6819                 rte_pktmbuf_tailroom(ut_params->ibuf));
6820         if (op_mode == OUT_OF_PLACE) {
6821
6822                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6823                                 rte_pktmbuf_tailroom(ut_params->obuf));
6824         }
6825
6826         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
6827         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
6828         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6829         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6830
6831         if (verify) {
6832                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6833                                 ciphertext_pad_len);
6834                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6835                 if (op_mode == OUT_OF_PLACE)
6836                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6837                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6838                                 ciphertext_len);
6839         } else {
6840                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6841                                 plaintext_pad_len);
6842                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6843                 if (op_mode == OUT_OF_PLACE)
6844                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6845                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6846         }
6847
6848         /* Create the operation */
6849         retval = create_wireless_algo_auth_cipher_operation(
6850                         tdata->digest_enc.data, tdata->digest_enc.len,
6851                         tdata->cipher_iv.data, tdata->cipher_iv.len,
6852                         tdata->auth_iv.data, tdata->auth_iv.len,
6853                         (tdata->digest_enc.offset == 0 ?
6854                                 plaintext_pad_len
6855                                 : tdata->digest_enc.offset),
6856                         tdata->validCipherLen.len_bits,
6857                         tdata->cipher.offset_bits,
6858                         tdata->validAuthLen.len_bits,
6859                         tdata->auth.offset_bits,
6860                         op_mode, 0, verify);
6861
6862         if (retval < 0)
6863                 return retval;
6864
6865         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
6866
6867         /* Check if the op failed because the device doesn't */
6868         /* support this particular combination of algorithms */
6869         if (op == NULL && ut_params->op->status ==
6870                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
6871                 printf("Device doesn't support this mixed combination. "
6872                                 "Test Skipped.\n");
6873                 return -ENOTSUP;
6874         }
6875         ut_params->op = op;
6876
6877         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6878
6879         ut_params->obuf = (op_mode == IN_PLACE ?
6880                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6881
6882         if (verify) {
6883                 if (ut_params->obuf)
6884                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6885                                                         uint8_t *);
6886                 else
6887                         plaintext = ciphertext +
6888                                         (tdata->cipher.offset_bits >> 3);
6889
6890                 debug_hexdump(stdout, "plaintext:", plaintext,
6891                                 tdata->plaintext.len_bits >> 3);
6892                 debug_hexdump(stdout, "plaintext expected:",
6893                                 tdata->plaintext.data,
6894                                 tdata->plaintext.len_bits >> 3);
6895         } else {
6896                 if (ut_params->obuf)
6897                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6898                                         uint8_t *);
6899                 else
6900                         ciphertext = plaintext;
6901
6902                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6903                                 ciphertext_len);
6904                 debug_hexdump(stdout, "ciphertext expected:",
6905                                 tdata->ciphertext.data,
6906                                 tdata->ciphertext.len_bits >> 3);
6907
6908                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6909                                 + (tdata->digest_enc.offset == 0 ?
6910                 plaintext_pad_len : tdata->digest_enc.offset);
6911
6912                 debug_hexdump(stdout, "digest:", ut_params->digest,
6913                                 tdata->digest_enc.len);
6914                 debug_hexdump(stdout, "digest expected:",
6915                                 tdata->digest_enc.data,
6916                                 tdata->digest_enc.len);
6917         }
6918
6919         /* Validate obuf */
6920         if (verify) {
6921                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6922                                 plaintext,
6923                                 tdata->plaintext.data,
6924                                 tdata->plaintext.len_bits >> 3,
6925                                 "Plaintext data not as expected");
6926         } else {
6927                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6928                                 ciphertext,
6929                                 tdata->ciphertext.data,
6930                                 tdata->validDataLen.len_bits,
6931                                 "Ciphertext data not as expected");
6932
6933                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6934                                 ut_params->digest,
6935                                 tdata->digest_enc.data,
6936                                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
6937                                 "Generated auth tag not as expected");
6938         }
6939
6940         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6941                         "crypto op processing failed");
6942
6943         return 0;
6944 }
6945
6946 static int
6947 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
6948         uint8_t op_mode, uint8_t verify)
6949 {
6950         struct crypto_testsuite_params *ts_params = &testsuite_params;
6951         struct crypto_unittest_params *ut_params = &unittest_params;
6952
6953         int retval;
6954
6955         const uint8_t *plaintext = NULL;
6956         const uint8_t *ciphertext = NULL;
6957         const uint8_t *digest = NULL;
6958         unsigned int plaintext_pad_len;
6959         unsigned int plaintext_len;
6960         unsigned int ciphertext_pad_len;
6961         unsigned int ciphertext_len;
6962         uint8_t buffer[10000];
6963         uint8_t digest_buffer[10000];
6964
6965         struct rte_cryptodev_info dev_info;
6966         struct rte_crypto_op *op;
6967
6968         /* Check if device supports particular algorithms */
6969         if (test_mixed_check_if_unsupported(tdata))
6970                 return -ENOTSUP;
6971         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6972                 return -ENOTSUP;
6973
6974         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6975
6976         uint64_t feat_flags = dev_info.feature_flags;
6977
6978         if (op_mode == IN_PLACE) {
6979                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6980                         printf("Device doesn't support in-place scatter-gather "
6981                                         "in both input and output mbufs.\n");
6982                         return -ENOTSUP;
6983                 }
6984         } else {
6985                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6986                         printf("Device doesn't support out-of-place scatter-gather "
6987                                         "in both input and output mbufs.\n");
6988                         return -ENOTSUP;
6989                 }
6990                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6991                         printf("Device doesn't support digest encrypted.\n");
6992                         return -ENOTSUP;
6993                 }
6994         }
6995
6996         /* Create the session */
6997         if (verify)
6998                 retval = create_wireless_algo_cipher_auth_session(
6999                                 ts_params->valid_devs[0],
7000                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7001                                 RTE_CRYPTO_AUTH_OP_VERIFY,
7002                                 tdata->auth_algo,
7003                                 tdata->cipher_algo,
7004                                 tdata->auth_key.data, tdata->auth_key.len,
7005                                 tdata->auth_iv.len, tdata->digest_enc.len,
7006                                 tdata->cipher_iv.len);
7007         else
7008                 retval = create_wireless_algo_auth_cipher_session(
7009                                 ts_params->valid_devs[0],
7010                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7011                                 RTE_CRYPTO_AUTH_OP_GENERATE,
7012                                 tdata->auth_algo,
7013                                 tdata->cipher_algo,
7014                                 tdata->auth_key.data, tdata->auth_key.len,
7015                                 tdata->auth_iv.len, tdata->digest_enc.len,
7016                                 tdata->cipher_iv.len);
7017         if (retval < 0)
7018                 return retval;
7019
7020         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7021         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7022         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7023         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7024
7025         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7026                         ciphertext_pad_len, 15, 0);
7027         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7028                         "Failed to allocate input buffer in mempool");
7029
7030         if (op_mode == OUT_OF_PLACE) {
7031                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7032                                 plaintext_pad_len, 15, 0);
7033                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
7034                                 "Failed to allocate output buffer in mempool");
7035         }
7036
7037         if (verify) {
7038                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7039                         tdata->ciphertext.data);
7040                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7041                                         ciphertext_len, buffer);
7042                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7043                         ciphertext_len);
7044         } else {
7045                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7046                         tdata->plaintext.data);
7047                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7048                                         plaintext_len, buffer);
7049                 debug_hexdump(stdout, "plaintext:", plaintext,
7050                         plaintext_len);
7051         }
7052         memset(buffer, 0, sizeof(buffer));
7053
7054         /* Create the operation */
7055         retval = create_wireless_algo_auth_cipher_operation(
7056                         tdata->digest_enc.data, tdata->digest_enc.len,
7057                         tdata->cipher_iv.data, tdata->cipher_iv.len,
7058                         tdata->auth_iv.data, tdata->auth_iv.len,
7059                         (tdata->digest_enc.offset == 0 ?
7060                                 plaintext_pad_len
7061                                 : tdata->digest_enc.offset),
7062                         tdata->validCipherLen.len_bits,
7063                         tdata->cipher.offset_bits,
7064                         tdata->validAuthLen.len_bits,
7065                         tdata->auth.offset_bits,
7066                         op_mode, 1, verify);
7067
7068         if (retval < 0)
7069                 return retval;
7070
7071         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7072
7073         /* Check if the op failed because the device doesn't */
7074         /* support this particular combination of algorithms */
7075         if (op == NULL && ut_params->op->status ==
7076                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7077                 printf("Device doesn't support this mixed combination. "
7078                                 "Test Skipped.\n");
7079                 return -ENOTSUP;
7080         }
7081         ut_params->op = op;
7082
7083         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7084
7085         ut_params->obuf = (op_mode == IN_PLACE ?
7086                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7087
7088         if (verify) {
7089                 if (ut_params->obuf)
7090                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7091                                         plaintext_len, buffer);
7092                 else
7093                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7094                                         plaintext_len, buffer);
7095
7096                 debug_hexdump(stdout, "plaintext:", plaintext,
7097                                 (tdata->plaintext.len_bits >> 3) -
7098                                 tdata->digest_enc.len);
7099                 debug_hexdump(stdout, "plaintext expected:",
7100                                 tdata->plaintext.data,
7101                                 (tdata->plaintext.len_bits >> 3) -
7102                                 tdata->digest_enc.len);
7103         } else {
7104                 if (ut_params->obuf)
7105                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7106                                         ciphertext_len, buffer);
7107                 else
7108                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7109                                         ciphertext_len, buffer);
7110
7111                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7112                         ciphertext_len);
7113                 debug_hexdump(stdout, "ciphertext expected:",
7114                         tdata->ciphertext.data,
7115                         tdata->ciphertext.len_bits >> 3);
7116
7117                 if (ut_params->obuf)
7118                         digest = rte_pktmbuf_read(ut_params->obuf,
7119                                         (tdata->digest_enc.offset == 0 ?
7120                                                 plaintext_pad_len :
7121                                                 tdata->digest_enc.offset),
7122                                         tdata->digest_enc.len, digest_buffer);
7123                 else
7124                         digest = rte_pktmbuf_read(ut_params->ibuf,
7125                                         (tdata->digest_enc.offset == 0 ?
7126                                                 plaintext_pad_len :
7127                                                 tdata->digest_enc.offset),
7128                                         tdata->digest_enc.len, digest_buffer);
7129
7130                 debug_hexdump(stdout, "digest:", digest,
7131                                 tdata->digest_enc.len);
7132                 debug_hexdump(stdout, "digest expected:",
7133                                 tdata->digest_enc.data, tdata->digest_enc.len);
7134         }
7135
7136         /* Validate obuf */
7137         if (verify) {
7138                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7139                                 plaintext,
7140                                 tdata->plaintext.data,
7141                                 tdata->plaintext.len_bits >> 3,
7142                                 "Plaintext data not as expected");
7143         } else {
7144                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7145                                 ciphertext,
7146                                 tdata->ciphertext.data,
7147                                 tdata->validDataLen.len_bits,
7148                                 "Ciphertext data not as expected");
7149                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7150                                 digest,
7151                                 tdata->digest_enc.data,
7152                                 tdata->digest_enc.len,
7153                                 "Generated auth tag not as expected");
7154         }
7155
7156         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7157                         "crypto op processing failed");
7158
7159         return 0;
7160 }
7161
7162 /** AUTH AES CMAC + CIPHER AES CTR */
7163
7164 static int
7165 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7166 {
7167         return test_mixed_auth_cipher(
7168                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7169 }
7170
7171 static int
7172 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7173 {
7174         return test_mixed_auth_cipher(
7175                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7176 }
7177
7178 static int
7179 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7180 {
7181         return test_mixed_auth_cipher_sgl(
7182                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7183 }
7184
7185 static int
7186 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7187 {
7188         return test_mixed_auth_cipher_sgl(
7189                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7190 }
7191
7192 static int
7193 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7194 {
7195         return test_mixed_auth_cipher(
7196                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7197 }
7198
7199 static int
7200 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7201 {
7202         return test_mixed_auth_cipher(
7203                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7204 }
7205
7206 static int
7207 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7208 {
7209         return test_mixed_auth_cipher_sgl(
7210                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7211 }
7212
7213 static int
7214 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7215 {
7216         return test_mixed_auth_cipher_sgl(
7217                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7218 }
7219
7220 /** MIXED AUTH + CIPHER */
7221
7222 static int
7223 test_auth_zuc_cipher_snow_test_case_1(void)
7224 {
7225         return test_mixed_auth_cipher(
7226                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7227 }
7228
7229 static int
7230 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7231 {
7232         return test_mixed_auth_cipher(
7233                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7234 }
7235
7236 static int
7237 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7238 {
7239         return test_mixed_auth_cipher(
7240                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7241 }
7242
7243 static int
7244 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7245 {
7246         return test_mixed_auth_cipher(
7247                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7248 }
7249
7250 static int
7251 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7252 {
7253         return test_mixed_auth_cipher(
7254                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7255 }
7256
7257 static int
7258 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7259 {
7260         return test_mixed_auth_cipher(
7261                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7262 }
7263
7264 static int
7265 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7266 {
7267         return test_mixed_auth_cipher(
7268                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7269 }
7270
7271 static int
7272 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7273 {
7274         return test_mixed_auth_cipher(
7275                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7276 }
7277
7278 static int
7279 test_auth_snow_cipher_zuc_test_case_1(void)
7280 {
7281         return test_mixed_auth_cipher(
7282                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7283 }
7284
7285 static int
7286 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7287 {
7288         return test_mixed_auth_cipher(
7289                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7290 }
7291
7292 static int
7293 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7294 {
7295         return test_mixed_auth_cipher(
7296                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7297 }
7298
7299 static int
7300 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7301 {
7302         return test_mixed_auth_cipher(
7303                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7304 }
7305
7306 static int
7307 test_auth_null_cipher_snow_test_case_1(void)
7308 {
7309         return test_mixed_auth_cipher(
7310                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7311 }
7312
7313 static int
7314 test_verify_auth_null_cipher_snow_test_case_1(void)
7315 {
7316         return test_mixed_auth_cipher(
7317                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7318 }
7319
7320 static int
7321 test_auth_null_cipher_zuc_test_case_1(void)
7322 {
7323         return test_mixed_auth_cipher(
7324                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7325 }
7326
7327 static int
7328 test_verify_auth_null_cipher_zuc_test_case_1(void)
7329 {
7330         return test_mixed_auth_cipher(
7331                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7332 }
7333
7334 static int
7335 test_auth_snow_cipher_null_test_case_1(void)
7336 {
7337         return test_mixed_auth_cipher(
7338                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7339 }
7340
7341 static int
7342 test_verify_auth_snow_cipher_null_test_case_1(void)
7343 {
7344         return test_mixed_auth_cipher(
7345                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7346 }
7347
7348 static int
7349 test_auth_zuc_cipher_null_test_case_1(void)
7350 {
7351         return test_mixed_auth_cipher(
7352                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7353 }
7354
7355 static int
7356 test_verify_auth_zuc_cipher_null_test_case_1(void)
7357 {
7358         return test_mixed_auth_cipher(
7359                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7360 }
7361
7362 static int
7363 test_auth_null_cipher_aes_ctr_test_case_1(void)
7364 {
7365         return test_mixed_auth_cipher(
7366                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7367 }
7368
7369 static int
7370 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7371 {
7372         return test_mixed_auth_cipher(
7373                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7374 }
7375
7376 static int
7377 test_auth_aes_cmac_cipher_null_test_case_1(void)
7378 {
7379         return test_mixed_auth_cipher(
7380                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7381 }
7382
7383 static int
7384 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7385 {
7386         return test_mixed_auth_cipher(
7387                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7388 }
7389
7390 /* ***** AEAD algorithm Tests ***** */
7391
7392 static int
7393 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7394                 enum rte_crypto_aead_operation op,
7395                 const uint8_t *key, const uint8_t key_len,
7396                 const uint16_t aad_len, const uint8_t auth_len,
7397                 uint8_t iv_len)
7398 {
7399         uint8_t aead_key[key_len];
7400
7401         struct crypto_testsuite_params *ts_params = &testsuite_params;
7402         struct crypto_unittest_params *ut_params = &unittest_params;
7403
7404         memcpy(aead_key, key, key_len);
7405
7406         /* Setup AEAD Parameters */
7407         ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7408         ut_params->aead_xform.next = NULL;
7409         ut_params->aead_xform.aead.algo = algo;
7410         ut_params->aead_xform.aead.op = op;
7411         ut_params->aead_xform.aead.key.data = aead_key;
7412         ut_params->aead_xform.aead.key.length = key_len;
7413         ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7414         ut_params->aead_xform.aead.iv.length = iv_len;
7415         ut_params->aead_xform.aead.digest_length = auth_len;
7416         ut_params->aead_xform.aead.aad_length = aad_len;
7417
7418         debug_hexdump(stdout, "key:", key, key_len);
7419
7420         /* Create Crypto session*/
7421         ut_params->sess = rte_cryptodev_sym_session_create(
7422                         ts_params->session_mpool);
7423
7424         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7425                         &ut_params->aead_xform,
7426                         ts_params->session_priv_mpool);
7427
7428         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7429
7430         return 0;
7431 }
7432
7433 static int
7434 create_aead_xform(struct rte_crypto_op *op,
7435                 enum rte_crypto_aead_algorithm algo,
7436                 enum rte_crypto_aead_operation aead_op,
7437                 uint8_t *key, const uint8_t key_len,
7438                 const uint8_t aad_len, const uint8_t auth_len,
7439                 uint8_t iv_len)
7440 {
7441         TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7442                         "failed to allocate space for crypto transform");
7443
7444         struct rte_crypto_sym_op *sym_op = op->sym;
7445
7446         /* Setup AEAD Parameters */
7447         sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7448         sym_op->xform->next = NULL;
7449         sym_op->xform->aead.algo = algo;
7450         sym_op->xform->aead.op = aead_op;
7451         sym_op->xform->aead.key.data = key;
7452         sym_op->xform->aead.key.length = key_len;
7453         sym_op->xform->aead.iv.offset = IV_OFFSET;
7454         sym_op->xform->aead.iv.length = iv_len;
7455         sym_op->xform->aead.digest_length = auth_len;
7456         sym_op->xform->aead.aad_length = aad_len;
7457
7458         debug_hexdump(stdout, "key:", key, key_len);
7459
7460         return 0;
7461 }
7462
7463 static int
7464 create_aead_operation(enum rte_crypto_aead_operation op,
7465                 const struct aead_test_data *tdata)
7466 {
7467         struct crypto_testsuite_params *ts_params = &testsuite_params;
7468         struct crypto_unittest_params *ut_params = &unittest_params;
7469
7470         uint8_t *plaintext, *ciphertext;
7471         unsigned int aad_pad_len, plaintext_pad_len;
7472
7473         /* Generate Crypto op data structure */
7474         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7475                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7476         TEST_ASSERT_NOT_NULL(ut_params->op,
7477                         "Failed to allocate symmetric crypto operation struct");
7478
7479         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7480
7481         /* Append aad data */
7482         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7483                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7484                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7485                                 aad_pad_len);
7486                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7487                                 "no room to append aad");
7488
7489                 sym_op->aead.aad.phys_addr =
7490                                 rte_pktmbuf_iova(ut_params->ibuf);
7491                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
7492                 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7493                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7494                         tdata->aad.len);
7495
7496                 /* Append IV at the end of the crypto operation*/
7497                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7498                                 uint8_t *, IV_OFFSET);
7499
7500                 /* Copy IV 1 byte after the IV pointer, according to the API */
7501                 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7502                 debug_hexdump(stdout, "iv:", iv_ptr,
7503                         tdata->iv.len);
7504         } else {
7505                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7506                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7507                                 aad_pad_len);
7508                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7509                                 "no room to append aad");
7510
7511                 sym_op->aead.aad.phys_addr =
7512                                 rte_pktmbuf_iova(ut_params->ibuf);
7513                 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7514                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7515                         tdata->aad.len);
7516
7517                 /* Append IV at the end of the crypto operation*/
7518                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7519                                 uint8_t *, IV_OFFSET);
7520
7521                 if (tdata->iv.len == 0) {
7522                         rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
7523                         debug_hexdump(stdout, "iv:", iv_ptr,
7524                                 AES_GCM_J0_LENGTH);
7525                 } else {
7526                         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
7527                         debug_hexdump(stdout, "iv:", iv_ptr,
7528                                 tdata->iv.len);
7529                 }
7530         }
7531
7532         /* Append plaintext/ciphertext */
7533         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7534                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7535                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7536                                 plaintext_pad_len);
7537                 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7538
7539                 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
7540                 debug_hexdump(stdout, "plaintext:", plaintext,
7541                                 tdata->plaintext.len);
7542
7543                 if (ut_params->obuf) {
7544                         ciphertext = (uint8_t *)rte_pktmbuf_append(
7545                                         ut_params->obuf,
7546                                         plaintext_pad_len + aad_pad_len);
7547                         TEST_ASSERT_NOT_NULL(ciphertext,
7548                                         "no room to append ciphertext");
7549
7550                         memset(ciphertext + aad_pad_len, 0,
7551                                         tdata->ciphertext.len);
7552                 }
7553         } else {
7554                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
7555                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7556                                 plaintext_pad_len);
7557                 TEST_ASSERT_NOT_NULL(ciphertext,
7558                                 "no room to append ciphertext");
7559
7560                 memcpy(ciphertext, tdata->ciphertext.data,
7561                                 tdata->ciphertext.len);
7562                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7563                                 tdata->ciphertext.len);
7564
7565                 if (ut_params->obuf) {
7566                         plaintext = (uint8_t *)rte_pktmbuf_append(
7567                                         ut_params->obuf,
7568                                         plaintext_pad_len + aad_pad_len);
7569                         TEST_ASSERT_NOT_NULL(plaintext,
7570                                         "no room to append plaintext");
7571
7572                         memset(plaintext + aad_pad_len, 0,
7573                                         tdata->plaintext.len);
7574                 }
7575         }
7576
7577         /* Append digest data */
7578         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7579                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7580                                 ut_params->obuf ? ut_params->obuf :
7581                                                 ut_params->ibuf,
7582                                                 tdata->auth_tag.len);
7583                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7584                                 "no room to append digest");
7585                 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
7586                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7587                                 ut_params->obuf ? ut_params->obuf :
7588                                                 ut_params->ibuf,
7589                                                 plaintext_pad_len +
7590                                                 aad_pad_len);
7591         } else {
7592                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7593                                 ut_params->ibuf, tdata->auth_tag.len);
7594                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7595                                 "no room to append digest");
7596                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7597                                 ut_params->ibuf,
7598                                 plaintext_pad_len + aad_pad_len);
7599
7600                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7601                         tdata->auth_tag.len);
7602                 debug_hexdump(stdout, "digest:",
7603                         sym_op->aead.digest.data,
7604                         tdata->auth_tag.len);
7605         }
7606
7607         sym_op->aead.data.length = tdata->plaintext.len;
7608         sym_op->aead.data.offset = aad_pad_len;
7609
7610         return 0;
7611 }
7612
7613 static int
7614 test_authenticated_encryption(const struct aead_test_data *tdata)
7615 {
7616         struct crypto_testsuite_params *ts_params = &testsuite_params;
7617         struct crypto_unittest_params *ut_params = &unittest_params;
7618
7619         int retval;
7620         uint8_t *ciphertext, *auth_tag;
7621         uint16_t plaintext_pad_len;
7622         uint32_t i;
7623         struct rte_cryptodev_info dev_info;
7624
7625         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7626         uint64_t feat_flags = dev_info.feature_flags;
7627
7628         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
7629                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
7630                 printf("Device doesn't support RAW data-path APIs.\n");
7631                 return -ENOTSUP;
7632         }
7633
7634         /* Verify the capabilities */
7635         struct rte_cryptodev_sym_capability_idx cap_idx;
7636         const struct rte_cryptodev_symmetric_capability *capability;
7637         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7638         cap_idx.algo.aead = tdata->algo;
7639         capability = rte_cryptodev_sym_capability_get(
7640                         ts_params->valid_devs[0], &cap_idx);
7641         if (capability == NULL)
7642                 return -ENOTSUP;
7643         if (rte_cryptodev_sym_capability_check_aead(
7644                         capability, tdata->key.len, tdata->auth_tag.len,
7645                         tdata->aad.len, tdata->iv.len))
7646                 return -ENOTSUP;
7647
7648         /* Create AEAD session */
7649         retval = create_aead_session(ts_params->valid_devs[0],
7650                         tdata->algo,
7651                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
7652                         tdata->key.data, tdata->key.len,
7653                         tdata->aad.len, tdata->auth_tag.len,
7654                         tdata->iv.len);
7655         if (retval < 0)
7656                 return retval;
7657
7658         if (tdata->aad.len > MBUF_SIZE) {
7659                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
7660                 /* Populate full size of add data */
7661                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
7662                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
7663         } else
7664                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7665
7666         /* clear mbuf payload */
7667         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7668                         rte_pktmbuf_tailroom(ut_params->ibuf));
7669
7670         /* Create AEAD operation */
7671         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
7672         if (retval < 0)
7673                 return retval;
7674
7675         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7676
7677         ut_params->op->sym->m_src = ut_params->ibuf;
7678
7679         /* Process crypto operation */
7680         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
7681                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
7682         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7683                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
7684                                 ut_params->op, 0, 0, 0, 0);
7685         else
7686                 TEST_ASSERT_NOT_NULL(
7687                         process_crypto_request(ts_params->valid_devs[0],
7688                         ut_params->op), "failed to process sym crypto op");
7689
7690         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7691                         "crypto op processing failed");
7692
7693         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7694
7695         if (ut_params->op->sym->m_dst) {
7696                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7697                                 uint8_t *);
7698                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
7699                                 uint8_t *, plaintext_pad_len);
7700         } else {
7701                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
7702                                 uint8_t *,
7703                                 ut_params->op->sym->cipher.data.offset);
7704                 auth_tag = ciphertext + plaintext_pad_len;
7705         }
7706
7707         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
7708         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
7709
7710         /* Validate obuf */
7711         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7712                         ciphertext,
7713                         tdata->ciphertext.data,
7714                         tdata->ciphertext.len,
7715                         "Ciphertext data not as expected");
7716
7717         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7718                         auth_tag,
7719                         tdata->auth_tag.data,
7720                         tdata->auth_tag.len,
7721                         "Generated auth tag not as expected");
7722
7723         return 0;
7724
7725 }
7726
7727 #ifdef RTE_LIB_SECURITY
7728 static int
7729 security_proto_supported(enum rte_security_session_action_type action,
7730         enum rte_security_session_protocol proto)
7731 {
7732         struct crypto_testsuite_params *ts_params = &testsuite_params;
7733
7734         const struct rte_security_capability *capabilities;
7735         const struct rte_security_capability *capability;
7736         uint16_t i = 0;
7737
7738         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7739                                 rte_cryptodev_get_sec_ctx(
7740                                 ts_params->valid_devs[0]);
7741
7742
7743         capabilities = rte_security_capabilities_get(ctx);
7744
7745         if (capabilities == NULL)
7746                 return -ENOTSUP;
7747
7748         while ((capability = &capabilities[i++])->action !=
7749                         RTE_SECURITY_ACTION_TYPE_NONE) {
7750                 if (capability->action == action &&
7751                                 capability->protocol == proto)
7752                         return 0;
7753         }
7754
7755         return -ENOTSUP;
7756 }
7757
7758 /* Basic algorithm run function for async inplace mode.
7759  * Creates a session from input parameters and runs one operation
7760  * on input_vec. Checks the output of the crypto operation against
7761  * output_vec.
7762  */
7763 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
7764                            enum rte_crypto_auth_operation opa,
7765                            const uint8_t *input_vec, unsigned int input_vec_len,
7766                            const uint8_t *output_vec,
7767                            unsigned int output_vec_len,
7768                            enum rte_crypto_cipher_algorithm cipher_alg,
7769                            const uint8_t *cipher_key, uint32_t cipher_key_len,
7770                            enum rte_crypto_auth_algorithm auth_alg,
7771                            const uint8_t *auth_key, uint32_t auth_key_len,
7772                            uint8_t bearer, enum rte_security_pdcp_domain domain,
7773                            uint8_t packet_direction, uint8_t sn_size,
7774                            uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
7775 {
7776         struct crypto_testsuite_params *ts_params = &testsuite_params;
7777         struct crypto_unittest_params *ut_params = &unittest_params;
7778         uint8_t *plaintext;
7779         int ret = TEST_SUCCESS;
7780         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7781                                 rte_cryptodev_get_sec_ctx(
7782                                 ts_params->valid_devs[0]);
7783
7784         /* Verify the capabilities */
7785         struct rte_security_capability_idx sec_cap_idx;
7786
7787         sec_cap_idx.action = ut_params->type;
7788         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7789         sec_cap_idx.pdcp.domain = domain;
7790         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7791                 return -ENOTSUP;
7792
7793         /* Generate test mbuf data */
7794         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7795
7796         /* clear mbuf payload */
7797         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7798                         rte_pktmbuf_tailroom(ut_params->ibuf));
7799
7800         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7801                                                   input_vec_len);
7802         memcpy(plaintext, input_vec, input_vec_len);
7803
7804         /* Out of place support */
7805         if (oop) {
7806                 /*
7807                  * For out-op-place we need to alloc another mbuf
7808                  */
7809                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7810                 rte_pktmbuf_append(ut_params->obuf, output_vec_len);
7811         }
7812
7813         /* Setup Cipher Parameters */
7814         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7815         ut_params->cipher_xform.cipher.algo = cipher_alg;
7816         ut_params->cipher_xform.cipher.op = opc;
7817         ut_params->cipher_xform.cipher.key.data = cipher_key;
7818         ut_params->cipher_xform.cipher.key.length = cipher_key_len;
7819         ut_params->cipher_xform.cipher.iv.length =
7820                                 packet_direction ? 4 : 0;
7821         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
7822
7823         /* Setup HMAC Parameters if ICV header is required */
7824         if (auth_alg != 0) {
7825                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7826                 ut_params->auth_xform.next = NULL;
7827                 ut_params->auth_xform.auth.algo = auth_alg;
7828                 ut_params->auth_xform.auth.op = opa;
7829                 ut_params->auth_xform.auth.key.data = auth_key;
7830                 ut_params->auth_xform.auth.key.length = auth_key_len;
7831
7832                 ut_params->cipher_xform.next = &ut_params->auth_xform;
7833         } else {
7834                 ut_params->cipher_xform.next = NULL;
7835         }
7836
7837         struct rte_security_session_conf sess_conf = {
7838                 .action_type = ut_params->type,
7839                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
7840                 {.pdcp = {
7841                         .bearer = bearer,
7842                         .domain = domain,
7843                         .pkt_dir = packet_direction,
7844                         .sn_size = sn_size,
7845                         .hfn = packet_direction ? 0 : hfn,
7846                         /**
7847                          * hfn can be set as pdcp_test_hfn[i]
7848                          * if hfn_ovrd is not set. Here, PDCP
7849                          * packet direction is just used to
7850                          * run half of the cases with session
7851                          * HFN and other half with per packet
7852                          * HFN.
7853                          */
7854                         .hfn_threshold = hfn_threshold,
7855                         .hfn_ovrd = packet_direction ? 1 : 0,
7856                         .sdap_enabled = sdap,
7857                 } },
7858                 .crypto_xform = &ut_params->cipher_xform
7859         };
7860
7861         /* Create security session */
7862         ut_params->sec_session = rte_security_session_create(ctx,
7863                                 &sess_conf, ts_params->session_mpool,
7864                                 ts_params->session_priv_mpool);
7865
7866         if (!ut_params->sec_session) {
7867                 printf("TestCase %s()-%d line %d failed %s: ",
7868                         __func__, i, __LINE__, "Failed to allocate session");
7869                 ret = TEST_FAILED;
7870                 goto on_err;
7871         }
7872
7873         /* Generate crypto op data structure */
7874         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7875                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7876         if (!ut_params->op) {
7877                 printf("TestCase %s()-%d line %d failed %s: ",
7878                         __func__, i, __LINE__,
7879                         "Failed to allocate symmetric crypto operation struct");
7880                 ret = TEST_FAILED;
7881                 goto on_err;
7882         }
7883
7884         uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
7885                                         uint32_t *, IV_OFFSET);
7886         *per_pkt_hfn = packet_direction ? hfn : 0;
7887
7888         rte_security_attach_session(ut_params->op, ut_params->sec_session);
7889
7890         /* set crypto operation source mbuf */
7891         ut_params->op->sym->m_src = ut_params->ibuf;
7892         if (oop)
7893                 ut_params->op->sym->m_dst = ut_params->obuf;
7894
7895         /* Process crypto operation */
7896         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
7897                 == NULL) {
7898                 printf("TestCase %s()-%d line %d failed %s: ",
7899                         __func__, i, __LINE__,
7900                         "failed to process sym crypto op");
7901                 ret = TEST_FAILED;
7902                 goto on_err;
7903         }
7904
7905         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
7906                 printf("TestCase %s()-%d line %d failed %s: ",
7907                         __func__, i, __LINE__, "crypto op processing failed");
7908                 ret = TEST_FAILED;
7909                 goto on_err;
7910         }
7911
7912         /* Validate obuf */
7913         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
7914                         uint8_t *);
7915         if (oop) {
7916                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7917                                 uint8_t *);
7918         }
7919
7920         if (memcmp(ciphertext, output_vec, output_vec_len)) {
7921                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
7922                 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
7923                 rte_hexdump(stdout, "reference", output_vec, output_vec_len);
7924                 ret = TEST_FAILED;
7925                 goto on_err;
7926         }
7927
7928 on_err:
7929         rte_crypto_op_free(ut_params->op);
7930         ut_params->op = NULL;
7931
7932         if (ut_params->sec_session)
7933                 rte_security_session_destroy(ctx, ut_params->sec_session);
7934         ut_params->sec_session = NULL;
7935
7936         rte_pktmbuf_free(ut_params->ibuf);
7937         ut_params->ibuf = NULL;
7938         if (oop) {
7939                 rte_pktmbuf_free(ut_params->obuf);
7940                 ut_params->obuf = NULL;
7941         }
7942
7943         return ret;
7944 }
7945
7946 static int
7947 test_pdcp_proto_SGL(int i, int oop,
7948         enum rte_crypto_cipher_operation opc,
7949         enum rte_crypto_auth_operation opa,
7950         uint8_t *input_vec,
7951         unsigned int input_vec_len,
7952         uint8_t *output_vec,
7953         unsigned int output_vec_len,
7954         uint32_t fragsz,
7955         uint32_t fragsz_oop)
7956 {
7957         struct crypto_testsuite_params *ts_params = &testsuite_params;
7958         struct crypto_unittest_params *ut_params = &unittest_params;
7959         uint8_t *plaintext;
7960         struct rte_mbuf *buf, *buf_oop = NULL;
7961         int ret = TEST_SUCCESS;
7962         int to_trn = 0;
7963         int to_trn_tbl[16];
7964         int segs = 1;
7965         unsigned int trn_data = 0;
7966         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7967                                 rte_cryptodev_get_sec_ctx(
7968                                 ts_params->valid_devs[0]);
7969
7970         /* Verify the capabilities */
7971         struct rte_security_capability_idx sec_cap_idx;
7972
7973         sec_cap_idx.action = ut_params->type;
7974         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7975         sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
7976         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7977                 return -ENOTSUP;
7978
7979         if (fragsz > input_vec_len)
7980                 fragsz = input_vec_len;
7981
7982         uint16_t plaintext_len = fragsz;
7983         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
7984
7985         if (fragsz_oop > output_vec_len)
7986                 frag_size_oop = output_vec_len;
7987
7988         int ecx = 0;
7989         if (input_vec_len % fragsz != 0) {
7990                 if (input_vec_len / fragsz + 1 > 16)
7991                         return 1;
7992         } else if (input_vec_len / fragsz > 16)
7993                 return 1;
7994
7995         /* Out of place support */
7996         if (oop) {
7997                 /*
7998                  * For out-op-place we need to alloc another mbuf
7999                  */
8000                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8001                 rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8002                 buf_oop = ut_params->obuf;
8003         }
8004
8005         /* Generate test mbuf data */
8006         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8007
8008         /* clear mbuf payload */
8009         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8010                         rte_pktmbuf_tailroom(ut_params->ibuf));
8011
8012         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8013                                                   plaintext_len);
8014         memcpy(plaintext, input_vec, plaintext_len);
8015         trn_data += plaintext_len;
8016
8017         buf = ut_params->ibuf;
8018
8019         /*
8020          * Loop until no more fragments
8021          */
8022
8023         while (trn_data < input_vec_len) {
8024                 ++segs;
8025                 to_trn = (input_vec_len - trn_data < fragsz) ?
8026                                 (input_vec_len - trn_data) : fragsz;
8027
8028                 to_trn_tbl[ecx++] = to_trn;
8029
8030                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8031                 buf = buf->next;
8032
8033                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8034                                 rte_pktmbuf_tailroom(buf));
8035
8036                 /* OOP */
8037                 if (oop && !fragsz_oop) {
8038                         buf_oop->next =
8039                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
8040                         buf_oop = buf_oop->next;
8041                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8042                                         0, rte_pktmbuf_tailroom(buf_oop));
8043                         rte_pktmbuf_append(buf_oop, to_trn);
8044                 }
8045
8046                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8047                                 to_trn);
8048
8049                 memcpy(plaintext, input_vec + trn_data, to_trn);
8050                 trn_data += to_trn;
8051         }
8052
8053         ut_params->ibuf->nb_segs = segs;
8054
8055         segs = 1;
8056         if (fragsz_oop && oop) {
8057                 to_trn = 0;
8058                 ecx = 0;
8059
8060                 trn_data = frag_size_oop;
8061                 while (trn_data < output_vec_len) {
8062                         ++segs;
8063                         to_trn =
8064                                 (output_vec_len - trn_data <
8065                                                 frag_size_oop) ?
8066                                 (output_vec_len - trn_data) :
8067                                                 frag_size_oop;
8068
8069                         to_trn_tbl[ecx++] = to_trn;
8070
8071                         buf_oop->next =
8072                                 rte_pktmbuf_alloc(ts_params->mbuf_pool);
8073                         buf_oop = buf_oop->next;
8074                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8075                                         0, rte_pktmbuf_tailroom(buf_oop));
8076                         rte_pktmbuf_append(buf_oop, to_trn);
8077
8078                         trn_data += to_trn;
8079                 }
8080                 ut_params->obuf->nb_segs = segs;
8081         }
8082
8083         /* Setup Cipher Parameters */
8084         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8085         ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8086         ut_params->cipher_xform.cipher.op = opc;
8087         ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8088         ut_params->cipher_xform.cipher.key.length =
8089                                         pdcp_test_params[i].cipher_key_len;
8090         ut_params->cipher_xform.cipher.iv.length = 0;
8091
8092         /* Setup HMAC Parameters if ICV header is required */
8093         if (pdcp_test_params[i].auth_alg != 0) {
8094                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8095                 ut_params->auth_xform.next = NULL;
8096                 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8097                 ut_params->auth_xform.auth.op = opa;
8098                 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8099                 ut_params->auth_xform.auth.key.length =
8100                                         pdcp_test_params[i].auth_key_len;
8101
8102                 ut_params->cipher_xform.next = &ut_params->auth_xform;
8103         } else {
8104                 ut_params->cipher_xform.next = NULL;
8105         }
8106
8107         struct rte_security_session_conf sess_conf = {
8108                 .action_type = ut_params->type,
8109                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8110                 {.pdcp = {
8111                         .bearer = pdcp_test_bearer[i],
8112                         .domain = pdcp_test_params[i].domain,
8113                         .pkt_dir = pdcp_test_packet_direction[i],
8114                         .sn_size = pdcp_test_data_sn_size[i],
8115                         .hfn = pdcp_test_hfn[i],
8116                         .hfn_threshold = pdcp_test_hfn_threshold[i],
8117                         .hfn_ovrd = 0,
8118                 } },
8119                 .crypto_xform = &ut_params->cipher_xform
8120         };
8121
8122         /* Create security session */
8123         ut_params->sec_session = rte_security_session_create(ctx,
8124                                 &sess_conf, ts_params->session_mpool,
8125                                 ts_params->session_priv_mpool);
8126
8127         if (!ut_params->sec_session) {
8128                 printf("TestCase %s()-%d line %d failed %s: ",
8129                         __func__, i, __LINE__, "Failed to allocate session");
8130                 ret = TEST_FAILED;
8131                 goto on_err;
8132         }
8133
8134         /* Generate crypto op data structure */
8135         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8136                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8137         if (!ut_params->op) {
8138                 printf("TestCase %s()-%d line %d failed %s: ",
8139                         __func__, i, __LINE__,
8140                         "Failed to allocate symmetric crypto operation struct");
8141                 ret = TEST_FAILED;
8142                 goto on_err;
8143         }
8144
8145         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8146
8147         /* set crypto operation source mbuf */
8148         ut_params->op->sym->m_src = ut_params->ibuf;
8149         if (oop)
8150                 ut_params->op->sym->m_dst = ut_params->obuf;
8151
8152         /* Process crypto operation */
8153         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8154                 == NULL) {
8155                 printf("TestCase %s()-%d line %d failed %s: ",
8156                         __func__, i, __LINE__,
8157                         "failed to process sym crypto op");
8158                 ret = TEST_FAILED;
8159                 goto on_err;
8160         }
8161
8162         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8163                 printf("TestCase %s()-%d line %d failed %s: ",
8164                         __func__, i, __LINE__, "crypto op processing failed");
8165                 ret = TEST_FAILED;
8166                 goto on_err;
8167         }
8168
8169         /* Validate obuf */
8170         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8171                         uint8_t *);
8172         if (oop) {
8173                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8174                                 uint8_t *);
8175         }
8176         if (fragsz_oop)
8177                 fragsz = frag_size_oop;
8178         if (memcmp(ciphertext, output_vec, fragsz)) {
8179                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8180                 rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8181                 rte_hexdump(stdout, "reference", output_vec, fragsz);
8182                 ret = TEST_FAILED;
8183                 goto on_err;
8184         }
8185
8186         buf = ut_params->op->sym->m_src->next;
8187         if (oop)
8188                 buf = ut_params->op->sym->m_dst->next;
8189
8190         unsigned int off = fragsz;
8191
8192         ecx = 0;
8193         while (buf) {
8194                 ciphertext = rte_pktmbuf_mtod(buf,
8195                                 uint8_t *);
8196                 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8197                         printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8198                         rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8199                         rte_hexdump(stdout, "reference", output_vec + off,
8200                                         to_trn_tbl[ecx]);
8201                         ret = TEST_FAILED;
8202                         goto on_err;
8203                 }
8204                 off += to_trn_tbl[ecx++];
8205                 buf = buf->next;
8206         }
8207 on_err:
8208         rte_crypto_op_free(ut_params->op);
8209         ut_params->op = NULL;
8210
8211         if (ut_params->sec_session)
8212                 rte_security_session_destroy(ctx, ut_params->sec_session);
8213         ut_params->sec_session = NULL;
8214
8215         rte_pktmbuf_free(ut_params->ibuf);
8216         ut_params->ibuf = NULL;
8217         if (oop) {
8218                 rte_pktmbuf_free(ut_params->obuf);
8219                 ut_params->obuf = NULL;
8220         }
8221
8222         return ret;
8223 }
8224
8225 int
8226 test_pdcp_proto_cplane_encap(int i)
8227 {
8228         return test_pdcp_proto(
8229                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8230                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8231                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8232                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8233                 pdcp_test_params[i].cipher_key_len,
8234                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8235                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8236                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8237                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8238                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8239 }
8240
8241 int
8242 test_pdcp_proto_uplane_encap(int i)
8243 {
8244         return test_pdcp_proto(
8245                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8246                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8247                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8248                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8249                 pdcp_test_params[i].cipher_key_len,
8250                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8251                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8252                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8253                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8254                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8255 }
8256
8257 int
8258 test_pdcp_proto_uplane_encap_with_int(int i)
8259 {
8260         return test_pdcp_proto(
8261                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8262                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8263                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8264                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8265                 pdcp_test_params[i].cipher_key_len,
8266                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8267                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8268                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8269                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8270                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8271 }
8272
8273 int
8274 test_pdcp_proto_cplane_decap(int i)
8275 {
8276         return test_pdcp_proto(
8277                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8278                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8279                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8280                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8281                 pdcp_test_params[i].cipher_key_len,
8282                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8283                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8284                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8285                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8286                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8287 }
8288
8289 int
8290 test_pdcp_proto_uplane_decap(int i)
8291 {
8292         return test_pdcp_proto(
8293                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8294                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8295                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8296                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8297                 pdcp_test_params[i].cipher_key_len,
8298                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8299                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8300                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8301                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8302                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8303 }
8304
8305 int
8306 test_pdcp_proto_uplane_decap_with_int(int i)
8307 {
8308         return test_pdcp_proto(
8309                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8310                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8311                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8312                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8313                 pdcp_test_params[i].cipher_key_len,
8314                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8315                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8316                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8317                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8318                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8319 }
8320
8321 static int
8322 test_PDCP_PROTO_SGL_in_place_32B(void)
8323 {
8324         /* i can be used for running any PDCP case
8325          * In this case it is uplane 12-bit AES-SNOW DL encap
8326          */
8327         int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8328         return test_pdcp_proto_SGL(i, IN_PLACE,
8329                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8330                         RTE_CRYPTO_AUTH_OP_GENERATE,
8331                         pdcp_test_data_in[i],
8332                         pdcp_test_data_in_len[i],
8333                         pdcp_test_data_out[i],
8334                         pdcp_test_data_in_len[i]+4,
8335                         32, 0);
8336 }
8337 static int
8338 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8339 {
8340         /* i can be used for running any PDCP case
8341          * In this case it is uplane 18-bit NULL-NULL DL encap
8342          */
8343         int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8344         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8345                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8346                         RTE_CRYPTO_AUTH_OP_GENERATE,
8347                         pdcp_test_data_in[i],
8348                         pdcp_test_data_in_len[i],
8349                         pdcp_test_data_out[i],
8350                         pdcp_test_data_in_len[i]+4,
8351                         32, 128);
8352 }
8353 static int
8354 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8355 {
8356         /* i can be used for running any PDCP case
8357          * In this case it is uplane 18-bit AES DL encap
8358          */
8359         int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8360                         + DOWNLINK;
8361         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8362                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8363                         RTE_CRYPTO_AUTH_OP_GENERATE,
8364                         pdcp_test_data_in[i],
8365                         pdcp_test_data_in_len[i],
8366                         pdcp_test_data_out[i],
8367                         pdcp_test_data_in_len[i],
8368                         32, 40);
8369 }
8370 static int
8371 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8372 {
8373         /* i can be used for running any PDCP case
8374          * In this case it is cplane 12-bit AES-ZUC DL encap
8375          */
8376         int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8377         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8378                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8379                         RTE_CRYPTO_AUTH_OP_GENERATE,
8380                         pdcp_test_data_in[i],
8381                         pdcp_test_data_in_len[i],
8382                         pdcp_test_data_out[i],
8383                         pdcp_test_data_in_len[i]+4,
8384                         128, 32);
8385 }
8386
8387 static int
8388 test_PDCP_SDAP_PROTO_encap_all(void)
8389 {
8390         int i = 0, size = 0;
8391         int err, all_err = TEST_SUCCESS;
8392         const struct pdcp_sdap_test *cur_test;
8393
8394         size = ARRAY_SIZE(list_pdcp_sdap_tests);
8395
8396         for (i = 0; i < size; i++) {
8397                 cur_test = &list_pdcp_sdap_tests[i];
8398                 err = test_pdcp_proto(
8399                         i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8400                         RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8401                         cur_test->in_len, cur_test->data_out,
8402                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8403                         cur_test->param.cipher_alg, cur_test->cipher_key,
8404                         cur_test->param.cipher_key_len,
8405                         cur_test->param.auth_alg,
8406                         cur_test->auth_key, cur_test->param.auth_key_len,
8407                         cur_test->bearer, cur_test->param.domain,
8408                         cur_test->packet_direction, cur_test->sn_size,
8409                         cur_test->hfn,
8410                         cur_test->hfn_threshold, SDAP_ENABLED);
8411                 if (err) {
8412                         printf("\t%d) %s: Encapsulation failed\n",
8413                                         cur_test->test_idx,
8414                                         cur_test->param.name);
8415                         err = TEST_FAILED;
8416                 } else {
8417                         printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8418                                         cur_test->param.name);
8419                         err = TEST_SUCCESS;
8420                 }
8421                 all_err += err;
8422         }
8423
8424         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8425
8426         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8427 }
8428
8429 static int
8430 test_PDCP_SDAP_PROTO_decap_all(void)
8431 {
8432         int i = 0, size = 0;
8433         int err, all_err = TEST_SUCCESS;
8434         const struct pdcp_sdap_test *cur_test;
8435
8436         size = ARRAY_SIZE(list_pdcp_sdap_tests);
8437
8438         for (i = 0; i < size; i++) {
8439                 cur_test = &list_pdcp_sdap_tests[i];
8440                 err = test_pdcp_proto(
8441                         i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
8442                         RTE_CRYPTO_AUTH_OP_VERIFY,
8443                         cur_test->data_out,
8444                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8445                         cur_test->data_in, cur_test->in_len,
8446                         cur_test->param.cipher_alg,
8447                         cur_test->cipher_key, cur_test->param.cipher_key_len,
8448                         cur_test->param.auth_alg, cur_test->auth_key,
8449                         cur_test->param.auth_key_len, cur_test->bearer,
8450                         cur_test->param.domain, cur_test->packet_direction,
8451                         cur_test->sn_size, cur_test->hfn,
8452                         cur_test->hfn_threshold, SDAP_ENABLED);
8453                 if (err) {
8454                         printf("\t%d) %s: Decapsulation failed\n",
8455                                         cur_test->test_idx,
8456                                         cur_test->param.name);
8457                         err = TEST_FAILED;
8458                 } else {
8459                         printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
8460                                         cur_test->param.name);
8461                         err = TEST_SUCCESS;
8462                 }
8463                 all_err += err;
8464         }
8465
8466         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8467
8468         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8469 }
8470
8471 static int
8472 test_PDCP_PROTO_all(void)
8473 {
8474         struct crypto_testsuite_params *ts_params = &testsuite_params;
8475         struct crypto_unittest_params *ut_params = &unittest_params;
8476         struct rte_cryptodev_info dev_info;
8477         int status;
8478
8479         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8480         uint64_t feat_flags = dev_info.feature_flags;
8481
8482         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8483                 return -ENOTSUP;
8484
8485         /* Set action type */
8486         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8487                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8488                 gbl_action_type;
8489
8490         if (security_proto_supported(ut_params->type,
8491                         RTE_SECURITY_PROTOCOL_PDCP) < 0)
8492                 return -ENOTSUP;
8493
8494         status = test_PDCP_PROTO_cplane_encap_all();
8495         status += test_PDCP_PROTO_cplane_decap_all();
8496         status += test_PDCP_PROTO_uplane_encap_all();
8497         status += test_PDCP_PROTO_uplane_decap_all();
8498         status += test_PDCP_PROTO_SGL_in_place_32B();
8499         status += test_PDCP_PROTO_SGL_oop_32B_128B();
8500         status += test_PDCP_PROTO_SGL_oop_32B_40B();
8501         status += test_PDCP_PROTO_SGL_oop_128B_32B();
8502         status += test_PDCP_SDAP_PROTO_encap_all();
8503         status += test_PDCP_SDAP_PROTO_decap_all();
8504
8505         if (status)
8506                 return TEST_FAILED;
8507         else
8508                 return TEST_SUCCESS;
8509 }
8510
8511 static int
8512 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
8513 {
8514         struct crypto_testsuite_params *ts_params = &testsuite_params;
8515         struct crypto_unittest_params *ut_params = &unittest_params;
8516         uint8_t *plaintext, *ciphertext;
8517         uint8_t *iv_ptr;
8518         int32_t cipher_len, crc_len;
8519         uint32_t crc_data_len;
8520         int ret = TEST_SUCCESS;
8521
8522         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8523                                         rte_cryptodev_get_sec_ctx(
8524                                                 ts_params->valid_devs[0]);
8525
8526         /* Verify the capabilities */
8527         struct rte_security_capability_idx sec_cap_idx;
8528         const struct rte_security_capability *sec_cap;
8529         const struct rte_cryptodev_capabilities *crypto_cap;
8530         const struct rte_cryptodev_symmetric_capability *sym_cap;
8531         int j = 0;
8532
8533         sec_cap_idx.action = ut_params->type;
8534         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8535         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
8536
8537         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8538         if (sec_cap == NULL)
8539                 return -ENOTSUP;
8540
8541         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8542                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8543                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8544                                 crypto_cap->sym.xform_type ==
8545                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
8546                                 crypto_cap->sym.cipher.algo ==
8547                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8548                         sym_cap = &crypto_cap->sym;
8549                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8550                                                 d_td->key.len,
8551                                                 d_td->iv.len) == 0)
8552                                 break;
8553                 }
8554         }
8555
8556         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8557                 return -ENOTSUP;
8558
8559         /* Setup source mbuf payload */
8560         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8561         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8562                         rte_pktmbuf_tailroom(ut_params->ibuf));
8563
8564         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8565                         d_td->ciphertext.len);
8566
8567         memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
8568
8569         /* Setup cipher session parameters */
8570         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8571         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8572         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
8573         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8574         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8575         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8576         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8577         ut_params->cipher_xform.next = NULL;
8578
8579         /* Setup DOCSIS session parameters */
8580         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
8581
8582         struct rte_security_session_conf sess_conf = {
8583                 .action_type = ut_params->type,
8584                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8585                 .docsis = ut_params->docsis_xform,
8586                 .crypto_xform = &ut_params->cipher_xform,
8587         };
8588
8589         /* Create security session */
8590         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8591                                         ts_params->session_mpool,
8592                                         ts_params->session_priv_mpool);
8593
8594         if (!ut_params->sec_session) {
8595                 printf("TestCase %s(%d) line %d: %s\n",
8596                         __func__, i, __LINE__, "failed to allocate session");
8597                 ret = TEST_FAILED;
8598                 goto on_err;
8599         }
8600
8601         /* Generate crypto op data structure */
8602         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8603                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8604         if (!ut_params->op) {
8605                 printf("TestCase %s(%d) line %d: %s\n",
8606                         __func__, i, __LINE__,
8607                         "failed to allocate symmetric crypto operation");
8608                 ret = TEST_FAILED;
8609                 goto on_err;
8610         }
8611
8612         /* Setup CRC operation parameters */
8613         crc_len = d_td->ciphertext.no_crc == false ?
8614                         (d_td->ciphertext.len -
8615                                 d_td->ciphertext.crc_offset -
8616                                 RTE_ETHER_CRC_LEN) :
8617                         0;
8618         crc_len = crc_len > 0 ? crc_len : 0;
8619         crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
8620         ut_params->op->sym->auth.data.length = crc_len;
8621         ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
8622
8623         /* Setup cipher operation parameters */
8624         cipher_len = d_td->ciphertext.no_cipher == false ?
8625                         (d_td->ciphertext.len -
8626                                 d_td->ciphertext.cipher_offset) :
8627                         0;
8628         cipher_len = cipher_len > 0 ? cipher_len : 0;
8629         ut_params->op->sym->cipher.data.length = cipher_len;
8630         ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
8631
8632         /* Setup cipher IV */
8633         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8634         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8635
8636         /* Attach session to operation */
8637         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8638
8639         /* Set crypto operation mbufs */
8640         ut_params->op->sym->m_src = ut_params->ibuf;
8641         ut_params->op->sym->m_dst = NULL;
8642
8643         /* Process crypto operation */
8644         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8645                         NULL) {
8646                 printf("TestCase %s(%d) line %d: %s\n",
8647                         __func__, i, __LINE__,
8648                         "failed to process security crypto op");
8649                 ret = TEST_FAILED;
8650                 goto on_err;
8651         }
8652
8653         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8654                 printf("TestCase %s(%d) line %d: %s\n",
8655                         __func__, i, __LINE__, "crypto op processing failed");
8656                 ret = TEST_FAILED;
8657                 goto on_err;
8658         }
8659
8660         /* Validate plaintext */
8661         plaintext = ciphertext;
8662
8663         if (memcmp(plaintext, d_td->plaintext.data,
8664                         d_td->plaintext.len - crc_data_len)) {
8665                 printf("TestCase %s(%d) line %d: %s\n",
8666                         __func__, i, __LINE__, "plaintext not as expected\n");
8667                 rte_hexdump(stdout, "expected", d_td->plaintext.data,
8668                                 d_td->plaintext.len);
8669                 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
8670                 ret = TEST_FAILED;
8671                 goto on_err;
8672         }
8673
8674 on_err:
8675         rte_crypto_op_free(ut_params->op);
8676         ut_params->op = NULL;
8677
8678         if (ut_params->sec_session)
8679                 rte_security_session_destroy(ctx, ut_params->sec_session);
8680         ut_params->sec_session = NULL;
8681
8682         rte_pktmbuf_free(ut_params->ibuf);
8683         ut_params->ibuf = NULL;
8684
8685         return ret;
8686 }
8687
8688 static int
8689 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
8690 {
8691         struct crypto_testsuite_params *ts_params = &testsuite_params;
8692         struct crypto_unittest_params *ut_params = &unittest_params;
8693         uint8_t *plaintext, *ciphertext;
8694         uint8_t *iv_ptr;
8695         int32_t cipher_len, crc_len;
8696         int ret = TEST_SUCCESS;
8697
8698         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8699                                         rte_cryptodev_get_sec_ctx(
8700                                                 ts_params->valid_devs[0]);
8701
8702         /* Verify the capabilities */
8703         struct rte_security_capability_idx sec_cap_idx;
8704         const struct rte_security_capability *sec_cap;
8705         const struct rte_cryptodev_capabilities *crypto_cap;
8706         const struct rte_cryptodev_symmetric_capability *sym_cap;
8707         int j = 0;
8708
8709         sec_cap_idx.action = ut_params->type;
8710         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8711         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8712
8713         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8714         if (sec_cap == NULL)
8715                 return -ENOTSUP;
8716
8717         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8718                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8719                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8720                                 crypto_cap->sym.xform_type ==
8721                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
8722                                 crypto_cap->sym.cipher.algo ==
8723                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8724                         sym_cap = &crypto_cap->sym;
8725                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8726                                                 d_td->key.len,
8727                                                 d_td->iv.len) == 0)
8728                                 break;
8729                 }
8730         }
8731
8732         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8733                 return -ENOTSUP;
8734
8735         /* Setup source mbuf payload */
8736         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8737         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8738                         rte_pktmbuf_tailroom(ut_params->ibuf));
8739
8740         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8741                         d_td->plaintext.len);
8742
8743         memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
8744
8745         /* Setup cipher session parameters */
8746         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8747         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8748         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
8749         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8750         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8751         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8752         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8753         ut_params->cipher_xform.next = NULL;
8754
8755         /* Setup DOCSIS session parameters */
8756         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8757
8758         struct rte_security_session_conf sess_conf = {
8759                 .action_type = ut_params->type,
8760                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8761                 .docsis = ut_params->docsis_xform,
8762                 .crypto_xform = &ut_params->cipher_xform,
8763         };
8764
8765         /* Create security session */
8766         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8767                                         ts_params->session_mpool,
8768                                         ts_params->session_priv_mpool);
8769
8770         if (!ut_params->sec_session) {
8771                 printf("TestCase %s(%d) line %d: %s\n",
8772                         __func__, i, __LINE__, "failed to allocate session");
8773                 ret = TEST_FAILED;
8774                 goto on_err;
8775         }
8776
8777         /* Generate crypto op data structure */
8778         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8779                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8780         if (!ut_params->op) {
8781                 printf("TestCase %s(%d) line %d: %s\n",
8782                         __func__, i, __LINE__,
8783                         "failed to allocate security crypto operation");
8784                 ret = TEST_FAILED;
8785                 goto on_err;
8786         }
8787
8788         /* Setup CRC operation parameters */
8789         crc_len = d_td->plaintext.no_crc == false ?
8790                         (d_td->plaintext.len -
8791                                 d_td->plaintext.crc_offset -
8792                                 RTE_ETHER_CRC_LEN) :
8793                         0;
8794         crc_len = crc_len > 0 ? crc_len : 0;
8795         ut_params->op->sym->auth.data.length = crc_len;
8796         ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
8797
8798         /* Setup cipher operation parameters */
8799         cipher_len = d_td->plaintext.no_cipher == false ?
8800                         (d_td->plaintext.len -
8801                                 d_td->plaintext.cipher_offset) :
8802                         0;
8803         cipher_len = cipher_len > 0 ? cipher_len : 0;
8804         ut_params->op->sym->cipher.data.length = cipher_len;
8805         ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
8806
8807         /* Setup cipher IV */
8808         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8809         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8810
8811         /* Attach session to operation */
8812         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8813
8814         /* Set crypto operation mbufs */
8815         ut_params->op->sym->m_src = ut_params->ibuf;
8816         ut_params->op->sym->m_dst = NULL;
8817
8818         /* Process crypto operation */
8819         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8820                         NULL) {
8821                 printf("TestCase %s(%d) line %d: %s\n",
8822                         __func__, i, __LINE__,
8823                         "failed to process security crypto op");
8824                 ret = TEST_FAILED;
8825                 goto on_err;
8826         }
8827
8828         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8829                 printf("TestCase %s(%d) line %d: %s\n",
8830                         __func__, i, __LINE__, "crypto op processing failed");
8831                 ret = TEST_FAILED;
8832                 goto on_err;
8833         }
8834
8835         /* Validate ciphertext */
8836         ciphertext = plaintext;
8837
8838         if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
8839                 printf("TestCase %s(%d) line %d: %s\n",
8840                         __func__, i, __LINE__, "ciphertext not as expected\n");
8841                 rte_hexdump(stdout, "expected", d_td->ciphertext.data,
8842                                 d_td->ciphertext.len);
8843                 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
8844                 ret = TEST_FAILED;
8845                 goto on_err;
8846         }
8847
8848 on_err:
8849         rte_crypto_op_free(ut_params->op);
8850         ut_params->op = NULL;
8851
8852         if (ut_params->sec_session)
8853                 rte_security_session_destroy(ctx, ut_params->sec_session);
8854         ut_params->sec_session = NULL;
8855
8856         rte_pktmbuf_free(ut_params->ibuf);
8857         ut_params->ibuf = NULL;
8858
8859         return ret;
8860 }
8861
8862 #define TEST_DOCSIS_COUNT(func) do {                    \
8863         int ret = func;                                 \
8864         if (ret == TEST_SUCCESS)  {                     \
8865                 printf("\t%2d)", n++);                  \
8866                 printf("+++++ PASSED:" #func"\n");      \
8867                 p++;                                    \
8868         } else if (ret == -ENOTSUP) {                   \
8869                 printf("\t%2d)", n++);                  \
8870                 printf("~~~~~ UNSUPP:" #func"\n");      \
8871                 u++;                                    \
8872         } else {                                        \
8873                 printf("\t%2d)", n++);                  \
8874                 printf("----- FAILED:" #func"\n");      \
8875                 f++;                                    \
8876         }                                               \
8877 } while (0)
8878
8879 static int
8880 test_DOCSIS_PROTO_uplink_all(void)
8881 {
8882         int p = 0, u = 0, f = 0, n = 0;
8883
8884         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
8885         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
8886         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
8887         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
8888         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
8889         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
8890         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
8891         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
8892         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
8893         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
8894         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
8895         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
8896         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
8897         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
8898         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
8899         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
8900         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
8901         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
8902         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
8903         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
8904         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
8905         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
8906         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
8907         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
8908         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
8909         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
8910
8911         if (f)
8912                 printf("## %s: %d passed out of %d (%d unsupported)\n",
8913                         __func__, p, n, u);
8914
8915         return f;
8916 };
8917
8918 static int
8919 test_DOCSIS_PROTO_downlink_all(void)
8920 {
8921         int p = 0, u = 0, f = 0, n = 0;
8922
8923         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
8924         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
8925         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
8926         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
8927         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
8928         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
8929         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
8930         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
8931         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
8932         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
8933         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
8934         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
8935         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
8936         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
8937         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
8938         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
8939         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
8940         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
8941         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
8942         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
8943         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
8944         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
8945         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
8946         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
8947         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
8948         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
8949
8950         if (f)
8951                 printf("## %s: %d passed out of %d (%d unsupported)\n",
8952                         __func__, p, n, u);
8953
8954         return f;
8955 };
8956
8957 static int
8958 test_DOCSIS_PROTO_all(void)
8959 {
8960         struct crypto_testsuite_params *ts_params = &testsuite_params;
8961         struct crypto_unittest_params *ut_params = &unittest_params;
8962         struct rte_cryptodev_info dev_info;
8963         int status;
8964
8965         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8966         uint64_t feat_flags = dev_info.feature_flags;
8967
8968         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8969                 return -ENOTSUP;
8970
8971         /* Set action type */
8972         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8973                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8974                 gbl_action_type;
8975
8976         if (security_proto_supported(ut_params->type,
8977                         RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
8978                 return -ENOTSUP;
8979
8980         status = test_DOCSIS_PROTO_uplink_all();
8981         status += test_DOCSIS_PROTO_downlink_all();
8982
8983         if (status)
8984                 return TEST_FAILED;
8985         else
8986                 return TEST_SUCCESS;
8987 }
8988 #endif
8989
8990 static int
8991 test_AES_GCM_authenticated_encryption_test_case_1(void)
8992 {
8993         return test_authenticated_encryption(&gcm_test_case_1);
8994 }
8995
8996 static int
8997 test_AES_GCM_authenticated_encryption_test_case_2(void)
8998 {
8999         return test_authenticated_encryption(&gcm_test_case_2);
9000 }
9001
9002 static int
9003 test_AES_GCM_authenticated_encryption_test_case_3(void)
9004 {
9005         return test_authenticated_encryption(&gcm_test_case_3);
9006 }
9007
9008 static int
9009 test_AES_GCM_authenticated_encryption_test_case_4(void)
9010 {
9011         return test_authenticated_encryption(&gcm_test_case_4);
9012 }
9013
9014 static int
9015 test_AES_GCM_authenticated_encryption_test_case_5(void)
9016 {
9017         return test_authenticated_encryption(&gcm_test_case_5);
9018 }
9019
9020 static int
9021 test_AES_GCM_authenticated_encryption_test_case_6(void)
9022 {
9023         return test_authenticated_encryption(&gcm_test_case_6);
9024 }
9025
9026 static int
9027 test_AES_GCM_authenticated_encryption_test_case_7(void)
9028 {
9029         return test_authenticated_encryption(&gcm_test_case_7);
9030 }
9031
9032 static int
9033 test_AES_GCM_authenticated_encryption_test_case_8(void)
9034 {
9035         return test_authenticated_encryption(&gcm_test_case_8);
9036 }
9037
9038 static int
9039 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9040 {
9041         return test_authenticated_encryption(&gcm_J0_test_case_1);
9042 }
9043
9044 static int
9045 test_AES_GCM_auth_encryption_test_case_192_1(void)
9046 {
9047         return test_authenticated_encryption(&gcm_test_case_192_1);
9048 }
9049
9050 static int
9051 test_AES_GCM_auth_encryption_test_case_192_2(void)
9052 {
9053         return test_authenticated_encryption(&gcm_test_case_192_2);
9054 }
9055
9056 static int
9057 test_AES_GCM_auth_encryption_test_case_192_3(void)
9058 {
9059         return test_authenticated_encryption(&gcm_test_case_192_3);
9060 }
9061
9062 static int
9063 test_AES_GCM_auth_encryption_test_case_192_4(void)
9064 {
9065         return test_authenticated_encryption(&gcm_test_case_192_4);
9066 }
9067
9068 static int
9069 test_AES_GCM_auth_encryption_test_case_192_5(void)
9070 {
9071         return test_authenticated_encryption(&gcm_test_case_192_5);
9072 }
9073
9074 static int
9075 test_AES_GCM_auth_encryption_test_case_192_6(void)
9076 {
9077         return test_authenticated_encryption(&gcm_test_case_192_6);
9078 }
9079
9080 static int
9081 test_AES_GCM_auth_encryption_test_case_192_7(void)
9082 {
9083         return test_authenticated_encryption(&gcm_test_case_192_7);
9084 }
9085
9086 static int
9087 test_AES_GCM_auth_encryption_test_case_256_1(void)
9088 {
9089         return test_authenticated_encryption(&gcm_test_case_256_1);
9090 }
9091
9092 static int
9093 test_AES_GCM_auth_encryption_test_case_256_2(void)
9094 {
9095         return test_authenticated_encryption(&gcm_test_case_256_2);
9096 }
9097
9098 static int
9099 test_AES_GCM_auth_encryption_test_case_256_3(void)
9100 {
9101         return test_authenticated_encryption(&gcm_test_case_256_3);
9102 }
9103
9104 static int
9105 test_AES_GCM_auth_encryption_test_case_256_4(void)
9106 {
9107         return test_authenticated_encryption(&gcm_test_case_256_4);
9108 }
9109
9110 static int
9111 test_AES_GCM_auth_encryption_test_case_256_5(void)
9112 {
9113         return test_authenticated_encryption(&gcm_test_case_256_5);
9114 }
9115
9116 static int
9117 test_AES_GCM_auth_encryption_test_case_256_6(void)
9118 {
9119         return test_authenticated_encryption(&gcm_test_case_256_6);
9120 }
9121
9122 static int
9123 test_AES_GCM_auth_encryption_test_case_256_7(void)
9124 {
9125         return test_authenticated_encryption(&gcm_test_case_256_7);
9126 }
9127
9128 static int
9129 test_AES_GCM_auth_encryption_test_case_aad_1(void)
9130 {
9131         return test_authenticated_encryption(&gcm_test_case_aad_1);
9132 }
9133
9134 static int
9135 test_AES_GCM_auth_encryption_test_case_aad_2(void)
9136 {
9137         return test_authenticated_encryption(&gcm_test_case_aad_2);
9138 }
9139
9140 static int
9141 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
9142 {
9143         struct aead_test_data tdata;
9144         int res;
9145
9146         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9147         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9148         tdata.iv.data[0] += 1;
9149         res = test_authenticated_encryption(&tdata);
9150         if (res == -ENOTSUP)
9151                 return res;
9152         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9153         return TEST_SUCCESS;
9154 }
9155
9156 static int
9157 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
9158 {
9159         struct aead_test_data tdata;
9160         int res;
9161
9162         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9163         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9164         tdata.plaintext.data[0] += 1;
9165         res = test_authenticated_encryption(&tdata);
9166         if (res == -ENOTSUP)
9167                 return res;
9168         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9169         return TEST_SUCCESS;
9170 }
9171
9172 static int
9173 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
9174 {
9175         struct aead_test_data tdata;
9176         int res;
9177
9178         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9179         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9180         tdata.ciphertext.data[0] += 1;
9181         res = test_authenticated_encryption(&tdata);
9182         if (res == -ENOTSUP)
9183                 return res;
9184         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9185         return TEST_SUCCESS;
9186 }
9187
9188 static int
9189 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
9190 {
9191         struct aead_test_data tdata;
9192         int res;
9193
9194         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9195         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9196         tdata.aad.len += 1;
9197         res = test_authenticated_encryption(&tdata);
9198         if (res == -ENOTSUP)
9199                 return res;
9200         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9201         return TEST_SUCCESS;
9202 }
9203
9204 static int
9205 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
9206 {
9207         struct aead_test_data tdata;
9208         uint8_t aad[gcm_test_case_7.aad.len];
9209         int res;
9210
9211         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9212         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9213         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9214         aad[0] += 1;
9215         tdata.aad.data = aad;
9216         res = test_authenticated_encryption(&tdata);
9217         if (res == -ENOTSUP)
9218                 return res;
9219         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9220         return TEST_SUCCESS;
9221 }
9222
9223 static int
9224 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
9225 {
9226         struct aead_test_data tdata;
9227         int res;
9228
9229         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9230         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9231         tdata.auth_tag.data[0] += 1;
9232         res = test_authenticated_encryption(&tdata);
9233         if (res == -ENOTSUP)
9234                 return res;
9235         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9236         return TEST_SUCCESS;
9237 }
9238
9239 static int
9240 test_authenticated_decryption(const struct aead_test_data *tdata)
9241 {
9242         struct crypto_testsuite_params *ts_params = &testsuite_params;
9243         struct crypto_unittest_params *ut_params = &unittest_params;
9244
9245         int retval;
9246         uint8_t *plaintext;
9247         uint32_t i;
9248         struct rte_cryptodev_info dev_info;
9249
9250         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9251         uint64_t feat_flags = dev_info.feature_flags;
9252
9253         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9254                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9255                 printf("Device doesn't support RAW data-path APIs.\n");
9256                 return -ENOTSUP;
9257         }
9258
9259         /* Verify the capabilities */
9260         struct rte_cryptodev_sym_capability_idx cap_idx;
9261         const struct rte_cryptodev_symmetric_capability *capability;
9262         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9263         cap_idx.algo.aead = tdata->algo;
9264         capability = rte_cryptodev_sym_capability_get(
9265                         ts_params->valid_devs[0], &cap_idx);
9266         if (capability == NULL)
9267                 return -ENOTSUP;
9268         if (rte_cryptodev_sym_capability_check_aead(
9269                         capability, tdata->key.len, tdata->auth_tag.len,
9270                         tdata->aad.len, tdata->iv.len))
9271                 return -ENOTSUP;
9272
9273         /* Create AEAD session */
9274         retval = create_aead_session(ts_params->valid_devs[0],
9275                         tdata->algo,
9276                         RTE_CRYPTO_AEAD_OP_DECRYPT,
9277                         tdata->key.data, tdata->key.len,
9278                         tdata->aad.len, tdata->auth_tag.len,
9279                         tdata->iv.len);
9280         if (retval < 0)
9281                 return retval;
9282
9283         /* alloc mbuf and set payload */
9284         if (tdata->aad.len > MBUF_SIZE) {
9285                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
9286                 /* Populate full size of add data */
9287                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
9288                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
9289         } else
9290                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9291
9292         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9293                         rte_pktmbuf_tailroom(ut_params->ibuf));
9294
9295         /* Create AEAD operation */
9296         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9297         if (retval < 0)
9298                 return retval;
9299
9300         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9301
9302         ut_params->op->sym->m_src = ut_params->ibuf;
9303
9304         /* Process crypto operation */
9305         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9306                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
9307         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9308                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9309                                 ut_params->op, 0, 0, 0, 0);
9310         else
9311                 TEST_ASSERT_NOT_NULL(
9312                         process_crypto_request(ts_params->valid_devs[0],
9313                         ut_params->op), "failed to process sym crypto op");
9314
9315         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9316                         "crypto op processing failed");
9317
9318         if (ut_params->op->sym->m_dst)
9319                 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
9320                                 uint8_t *);
9321         else
9322                 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
9323                                 uint8_t *,
9324                                 ut_params->op->sym->cipher.data.offset);
9325
9326         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9327
9328         /* Validate obuf */
9329         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9330                         plaintext,
9331                         tdata->plaintext.data,
9332                         tdata->plaintext.len,
9333                         "Plaintext data not as expected");
9334
9335         TEST_ASSERT_EQUAL(ut_params->op->status,
9336                         RTE_CRYPTO_OP_STATUS_SUCCESS,
9337                         "Authentication failed");
9338
9339         return 0;
9340 }
9341
9342 static int
9343 test_AES_GCM_authenticated_decryption_test_case_1(void)
9344 {
9345         return test_authenticated_decryption(&gcm_test_case_1);
9346 }
9347
9348 static int
9349 test_AES_GCM_authenticated_decryption_test_case_2(void)
9350 {
9351         return test_authenticated_decryption(&gcm_test_case_2);
9352 }
9353
9354 static int
9355 test_AES_GCM_authenticated_decryption_test_case_3(void)
9356 {
9357         return test_authenticated_decryption(&gcm_test_case_3);
9358 }
9359
9360 static int
9361 test_AES_GCM_authenticated_decryption_test_case_4(void)
9362 {
9363         return test_authenticated_decryption(&gcm_test_case_4);
9364 }
9365
9366 static int
9367 test_AES_GCM_authenticated_decryption_test_case_5(void)
9368 {
9369         return test_authenticated_decryption(&gcm_test_case_5);
9370 }
9371
9372 static int
9373 test_AES_GCM_authenticated_decryption_test_case_6(void)
9374 {
9375         return test_authenticated_decryption(&gcm_test_case_6);
9376 }
9377
9378 static int
9379 test_AES_GCM_authenticated_decryption_test_case_7(void)
9380 {
9381         return test_authenticated_decryption(&gcm_test_case_7);
9382 }
9383
9384 static int
9385 test_AES_GCM_authenticated_decryption_test_case_8(void)
9386 {
9387         return test_authenticated_decryption(&gcm_test_case_8);
9388 }
9389
9390 static int
9391 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
9392 {
9393         return test_authenticated_decryption(&gcm_J0_test_case_1);
9394 }
9395
9396 static int
9397 test_AES_GCM_auth_decryption_test_case_192_1(void)
9398 {
9399         return test_authenticated_decryption(&gcm_test_case_192_1);
9400 }
9401
9402 static int
9403 test_AES_GCM_auth_decryption_test_case_192_2(void)
9404 {
9405         return test_authenticated_decryption(&gcm_test_case_192_2);
9406 }
9407
9408 static int
9409 test_AES_GCM_auth_decryption_test_case_192_3(void)
9410 {
9411         return test_authenticated_decryption(&gcm_test_case_192_3);
9412 }
9413
9414 static int
9415 test_AES_GCM_auth_decryption_test_case_192_4(void)
9416 {
9417         return test_authenticated_decryption(&gcm_test_case_192_4);
9418 }
9419
9420 static int
9421 test_AES_GCM_auth_decryption_test_case_192_5(void)
9422 {
9423         return test_authenticated_decryption(&gcm_test_case_192_5);
9424 }
9425
9426 static int
9427 test_AES_GCM_auth_decryption_test_case_192_6(void)
9428 {
9429         return test_authenticated_decryption(&gcm_test_case_192_6);
9430 }
9431
9432 static int
9433 test_AES_GCM_auth_decryption_test_case_192_7(void)
9434 {
9435         return test_authenticated_decryption(&gcm_test_case_192_7);
9436 }
9437
9438 static int
9439 test_AES_GCM_auth_decryption_test_case_256_1(void)
9440 {
9441         return test_authenticated_decryption(&gcm_test_case_256_1);
9442 }
9443
9444 static int
9445 test_AES_GCM_auth_decryption_test_case_256_2(void)
9446 {
9447         return test_authenticated_decryption(&gcm_test_case_256_2);
9448 }
9449
9450 static int
9451 test_AES_GCM_auth_decryption_test_case_256_3(void)
9452 {
9453         return test_authenticated_decryption(&gcm_test_case_256_3);
9454 }
9455
9456 static int
9457 test_AES_GCM_auth_decryption_test_case_256_4(void)
9458 {
9459         return test_authenticated_decryption(&gcm_test_case_256_4);
9460 }
9461
9462 static int
9463 test_AES_GCM_auth_decryption_test_case_256_5(void)
9464 {
9465         return test_authenticated_decryption(&gcm_test_case_256_5);
9466 }
9467
9468 static int
9469 test_AES_GCM_auth_decryption_test_case_256_6(void)
9470 {
9471         return test_authenticated_decryption(&gcm_test_case_256_6);
9472 }
9473
9474 static int
9475 test_AES_GCM_auth_decryption_test_case_256_7(void)
9476 {
9477         return test_authenticated_decryption(&gcm_test_case_256_7);
9478 }
9479
9480 static int
9481 test_AES_GCM_auth_decryption_test_case_aad_1(void)
9482 {
9483         return test_authenticated_decryption(&gcm_test_case_aad_1);
9484 }
9485
9486 static int
9487 test_AES_GCM_auth_decryption_test_case_aad_2(void)
9488 {
9489         return test_authenticated_decryption(&gcm_test_case_aad_2);
9490 }
9491
9492 static int
9493 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
9494 {
9495         struct aead_test_data tdata;
9496         int res;
9497
9498         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9499         tdata.iv.data[0] += 1;
9500         res = test_authenticated_decryption(&tdata);
9501         if (res == -ENOTSUP)
9502                 return res;
9503         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9504         return TEST_SUCCESS;
9505 }
9506
9507 static int
9508 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
9509 {
9510         struct aead_test_data tdata;
9511         int res;
9512
9513         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9514         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9515         tdata.plaintext.data[0] += 1;
9516         res = test_authenticated_decryption(&tdata);
9517         if (res == -ENOTSUP)
9518                 return res;
9519         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9520         return TEST_SUCCESS;
9521 }
9522
9523 static int
9524 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
9525 {
9526         struct aead_test_data tdata;
9527         int res;
9528
9529         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9530         tdata.ciphertext.data[0] += 1;
9531         res = test_authenticated_decryption(&tdata);
9532         if (res == -ENOTSUP)
9533                 return res;
9534         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9535         return TEST_SUCCESS;
9536 }
9537
9538 static int
9539 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
9540 {
9541         struct aead_test_data tdata;
9542         int res;
9543
9544         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9545         tdata.aad.len += 1;
9546         res = test_authenticated_decryption(&tdata);
9547         if (res == -ENOTSUP)
9548                 return res;
9549         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9550         return TEST_SUCCESS;
9551 }
9552
9553 static int
9554 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
9555 {
9556         struct aead_test_data tdata;
9557         uint8_t aad[gcm_test_case_7.aad.len];
9558         int res;
9559
9560         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9561         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9562         aad[0] += 1;
9563         tdata.aad.data = aad;
9564         res = test_authenticated_decryption(&tdata);
9565         if (res == -ENOTSUP)
9566                 return res;
9567         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9568         return TEST_SUCCESS;
9569 }
9570
9571 static int
9572 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
9573 {
9574         struct aead_test_data tdata;
9575         int res;
9576
9577         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9578         tdata.auth_tag.data[0] += 1;
9579         res = test_authenticated_decryption(&tdata);
9580         if (res == -ENOTSUP)
9581                 return res;
9582         TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
9583         return TEST_SUCCESS;
9584 }
9585
9586 static int
9587 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
9588 {
9589         struct crypto_testsuite_params *ts_params = &testsuite_params;
9590         struct crypto_unittest_params *ut_params = &unittest_params;
9591
9592         int retval;
9593         uint8_t *ciphertext, *auth_tag;
9594         uint16_t plaintext_pad_len;
9595
9596         /* Verify the capabilities */
9597         struct rte_cryptodev_sym_capability_idx cap_idx;
9598         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9599         cap_idx.algo.aead = tdata->algo;
9600         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9601                         &cap_idx) == NULL)
9602                 return -ENOTSUP;
9603
9604         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9605                 return -ENOTSUP;
9606
9607         /* not supported with CPU crypto */
9608         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9609                 return -ENOTSUP;
9610
9611         /* Create AEAD session */
9612         retval = create_aead_session(ts_params->valid_devs[0],
9613                         tdata->algo,
9614                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
9615                         tdata->key.data, tdata->key.len,
9616                         tdata->aad.len, tdata->auth_tag.len,
9617                         tdata->iv.len);
9618         if (retval < 0)
9619                 return retval;
9620
9621         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9622         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9623
9624         /* clear mbuf payload */
9625         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9626                         rte_pktmbuf_tailroom(ut_params->ibuf));
9627         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9628                         rte_pktmbuf_tailroom(ut_params->obuf));
9629
9630         /* Create AEAD operation */
9631         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9632         if (retval < 0)
9633                 return retval;
9634
9635         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9636
9637         ut_params->op->sym->m_src = ut_params->ibuf;
9638         ut_params->op->sym->m_dst = ut_params->obuf;
9639
9640         /* Process crypto operation */
9641         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9642                         ut_params->op), "failed to process sym crypto op");
9643
9644         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9645                         "crypto op processing failed");
9646
9647         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9648
9649         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9650                         ut_params->op->sym->cipher.data.offset);
9651         auth_tag = ciphertext + plaintext_pad_len;
9652
9653         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9654         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9655
9656         /* Validate obuf */
9657         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9658                         ciphertext,
9659                         tdata->ciphertext.data,
9660                         tdata->ciphertext.len,
9661                         "Ciphertext data not as expected");
9662
9663         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9664                         auth_tag,
9665                         tdata->auth_tag.data,
9666                         tdata->auth_tag.len,
9667                         "Generated auth tag not as expected");
9668
9669         return 0;
9670
9671 }
9672
9673 static int
9674 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
9675 {
9676         return test_authenticated_encryption_oop(&gcm_test_case_5);
9677 }
9678
9679 static int
9680 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
9681 {
9682         struct crypto_testsuite_params *ts_params = &testsuite_params;
9683         struct crypto_unittest_params *ut_params = &unittest_params;
9684
9685         int retval;
9686         uint8_t *plaintext;
9687
9688         /* Verify the capabilities */
9689         struct rte_cryptodev_sym_capability_idx cap_idx;
9690         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9691         cap_idx.algo.aead = tdata->algo;
9692         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9693                         &cap_idx) == NULL)
9694                 return -ENOTSUP;
9695
9696         /* not supported with CPU crypto and raw data-path APIs*/
9697         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
9698                         global_api_test_type == CRYPTODEV_RAW_API_TEST)
9699                 return -ENOTSUP;
9700
9701         /* Create AEAD session */
9702         retval = create_aead_session(ts_params->valid_devs[0],
9703                         tdata->algo,
9704                         RTE_CRYPTO_AEAD_OP_DECRYPT,
9705                         tdata->key.data, tdata->key.len,
9706                         tdata->aad.len, tdata->auth_tag.len,
9707                         tdata->iv.len);
9708         if (retval < 0)
9709                 return retval;
9710
9711         /* alloc mbuf and set payload */
9712         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9713         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9714
9715         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9716                         rte_pktmbuf_tailroom(ut_params->ibuf));
9717         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9718                         rte_pktmbuf_tailroom(ut_params->obuf));
9719
9720         /* Create AEAD operation */
9721         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9722         if (retval < 0)
9723                 return retval;
9724
9725         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9726
9727         ut_params->op->sym->m_src = ut_params->ibuf;
9728         ut_params->op->sym->m_dst = ut_params->obuf;
9729
9730         /* Process crypto operation */
9731         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9732                         ut_params->op), "failed to process sym crypto op");
9733
9734         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9735                         "crypto op processing failed");
9736
9737         plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9738                         ut_params->op->sym->cipher.data.offset);
9739
9740         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9741
9742         /* Validate obuf */
9743         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9744                         plaintext,
9745                         tdata->plaintext.data,
9746                         tdata->plaintext.len,
9747                         "Plaintext data not as expected");
9748
9749         TEST_ASSERT_EQUAL(ut_params->op->status,
9750                         RTE_CRYPTO_OP_STATUS_SUCCESS,
9751                         "Authentication failed");
9752         return 0;
9753 }
9754
9755 static int
9756 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
9757 {
9758         return test_authenticated_decryption_oop(&gcm_test_case_5);
9759 }
9760
9761 static int
9762 test_authenticated_encryption_sessionless(
9763                 const struct aead_test_data *tdata)
9764 {
9765         struct crypto_testsuite_params *ts_params = &testsuite_params;
9766         struct crypto_unittest_params *ut_params = &unittest_params;
9767
9768         int retval;
9769         uint8_t *ciphertext, *auth_tag;
9770         uint16_t plaintext_pad_len;
9771         uint8_t key[tdata->key.len + 1];
9772         struct rte_cryptodev_info dev_info;
9773
9774         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9775         uint64_t feat_flags = dev_info.feature_flags;
9776
9777         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9778                 printf("Device doesn't support Sessionless ops.\n");
9779                 return -ENOTSUP;
9780         }
9781
9782         /* not supported with CPU crypto */
9783         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9784                 return -ENOTSUP;
9785
9786         /* Verify the capabilities */
9787         struct rte_cryptodev_sym_capability_idx cap_idx;
9788         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9789         cap_idx.algo.aead = tdata->algo;
9790         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9791                         &cap_idx) == NULL)
9792                 return -ENOTSUP;
9793
9794         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9795
9796         /* clear mbuf payload */
9797         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9798                         rte_pktmbuf_tailroom(ut_params->ibuf));
9799
9800         /* Create AEAD operation */
9801         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9802         if (retval < 0)
9803                 return retval;
9804
9805         /* Create GCM xform */
9806         memcpy(key, tdata->key.data, tdata->key.len);
9807         retval = create_aead_xform(ut_params->op,
9808                         tdata->algo,
9809                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
9810                         key, tdata->key.len,
9811                         tdata->aad.len, tdata->auth_tag.len,
9812                         tdata->iv.len);
9813         if (retval < 0)
9814                 return retval;
9815
9816         ut_params->op->sym->m_src = ut_params->ibuf;
9817
9818         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9819                         RTE_CRYPTO_OP_SESSIONLESS,
9820                         "crypto op session type not sessionless");
9821
9822         /* Process crypto operation */
9823         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9824                         ut_params->op), "failed to process sym crypto op");
9825
9826         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9827
9828         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9829                         "crypto op status not success");
9830
9831         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9832
9833         ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9834                         ut_params->op->sym->cipher.data.offset);
9835         auth_tag = ciphertext + plaintext_pad_len;
9836
9837         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9838         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9839
9840         /* Validate obuf */
9841         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9842                         ciphertext,
9843                         tdata->ciphertext.data,
9844                         tdata->ciphertext.len,
9845                         "Ciphertext data not as expected");
9846
9847         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9848                         auth_tag,
9849                         tdata->auth_tag.data,
9850                         tdata->auth_tag.len,
9851                         "Generated auth tag not as expected");
9852
9853         return 0;
9854
9855 }
9856
9857 static int
9858 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
9859 {
9860         return test_authenticated_encryption_sessionless(
9861                         &gcm_test_case_5);
9862 }
9863
9864 static int
9865 test_authenticated_decryption_sessionless(
9866                 const struct aead_test_data *tdata)
9867 {
9868         struct crypto_testsuite_params *ts_params = &testsuite_params;
9869         struct crypto_unittest_params *ut_params = &unittest_params;
9870
9871         int retval;
9872         uint8_t *plaintext;
9873         uint8_t key[tdata->key.len + 1];
9874         struct rte_cryptodev_info dev_info;
9875
9876         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9877         uint64_t feat_flags = dev_info.feature_flags;
9878
9879         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9880                 printf("Device doesn't support Sessionless ops.\n");
9881                 return -ENOTSUP;
9882         }
9883
9884         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9885                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9886                 printf("Device doesn't support RAW data-path APIs.\n");
9887                 return -ENOTSUP;
9888         }
9889
9890         /* not supported with CPU crypto */
9891         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9892                 return -ENOTSUP;
9893
9894         /* Verify the capabilities */
9895         struct rte_cryptodev_sym_capability_idx cap_idx;
9896         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9897         cap_idx.algo.aead = tdata->algo;
9898         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9899                         &cap_idx) == NULL)
9900                 return -ENOTSUP;
9901
9902         /* alloc mbuf and set payload */
9903         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9904
9905         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9906                         rte_pktmbuf_tailroom(ut_params->ibuf));
9907
9908         /* Create AEAD operation */
9909         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9910         if (retval < 0)
9911                 return retval;
9912
9913         /* Create AEAD xform */
9914         memcpy(key, tdata->key.data, tdata->key.len);
9915         retval = create_aead_xform(ut_params->op,
9916                         tdata->algo,
9917                         RTE_CRYPTO_AEAD_OP_DECRYPT,
9918                         key, tdata->key.len,
9919                         tdata->aad.len, tdata->auth_tag.len,
9920                         tdata->iv.len);
9921         if (retval < 0)
9922                 return retval;
9923
9924         ut_params->op->sym->m_src = ut_params->ibuf;
9925
9926         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9927                         RTE_CRYPTO_OP_SESSIONLESS,
9928                         "crypto op session type not sessionless");
9929
9930         /* Process crypto operation */
9931         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9932                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9933                                 ut_params->op, 0, 0, 0, 0);
9934         else
9935                 TEST_ASSERT_NOT_NULL(process_crypto_request(
9936                         ts_params->valid_devs[0], ut_params->op),
9937                                 "failed to process sym crypto op");
9938
9939         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9940
9941         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9942                         "crypto op status not success");
9943
9944         plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9945                         ut_params->op->sym->cipher.data.offset);
9946
9947         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9948
9949         /* Validate obuf */
9950         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9951                         plaintext,
9952                         tdata->plaintext.data,
9953                         tdata->plaintext.len,
9954                         "Plaintext data not as expected");
9955
9956         TEST_ASSERT_EQUAL(ut_params->op->status,
9957                         RTE_CRYPTO_OP_STATUS_SUCCESS,
9958                         "Authentication failed");
9959         return 0;
9960 }
9961
9962 static int
9963 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
9964 {
9965         return test_authenticated_decryption_sessionless(
9966                         &gcm_test_case_5);
9967 }
9968
9969 static int
9970 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
9971 {
9972         return test_authenticated_encryption(&ccm_test_case_128_1);
9973 }
9974
9975 static int
9976 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
9977 {
9978         return test_authenticated_encryption(&ccm_test_case_128_2);
9979 }
9980
9981 static int
9982 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
9983 {
9984         return test_authenticated_encryption(&ccm_test_case_128_3);
9985 }
9986
9987 static int
9988 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
9989 {
9990         return test_authenticated_decryption(&ccm_test_case_128_1);
9991 }
9992
9993 static int
9994 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
9995 {
9996         return test_authenticated_decryption(&ccm_test_case_128_2);
9997 }
9998
9999 static int
10000 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
10001 {
10002         return test_authenticated_decryption(&ccm_test_case_128_3);
10003 }
10004
10005 static int
10006 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
10007 {
10008         return test_authenticated_encryption(&ccm_test_case_192_1);
10009 }
10010
10011 static int
10012 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
10013 {
10014         return test_authenticated_encryption(&ccm_test_case_192_2);
10015 }
10016
10017 static int
10018 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10019 {
10020         return test_authenticated_encryption(&ccm_test_case_192_3);
10021 }
10022
10023 static int
10024 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10025 {
10026         return test_authenticated_decryption(&ccm_test_case_192_1);
10027 }
10028
10029 static int
10030 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10031 {
10032         return test_authenticated_decryption(&ccm_test_case_192_2);
10033 }
10034
10035 static int
10036 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10037 {
10038         return test_authenticated_decryption(&ccm_test_case_192_3);
10039 }
10040
10041 static int
10042 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
10043 {
10044         return test_authenticated_encryption(&ccm_test_case_256_1);
10045 }
10046
10047 static int
10048 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
10049 {
10050         return test_authenticated_encryption(&ccm_test_case_256_2);
10051 }
10052
10053 static int
10054 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
10055 {
10056         return test_authenticated_encryption(&ccm_test_case_256_3);
10057 }
10058
10059 static int
10060 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
10061 {
10062         return test_authenticated_decryption(&ccm_test_case_256_1);
10063 }
10064
10065 static int
10066 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
10067 {
10068         return test_authenticated_decryption(&ccm_test_case_256_2);
10069 }
10070
10071 static int
10072 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
10073 {
10074         return test_authenticated_decryption(&ccm_test_case_256_3);
10075 }
10076
10077 static int
10078 test_stats(void)
10079 {
10080         struct crypto_testsuite_params *ts_params = &testsuite_params;
10081         struct rte_cryptodev_stats stats;
10082
10083         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10084                 return -ENOTSUP;
10085
10086         /* Verify the capabilities */
10087         struct rte_cryptodev_sym_capability_idx cap_idx;
10088         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10089         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
10090         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10091                         &cap_idx) == NULL)
10092                 return -ENOTSUP;
10093         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10094         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10095         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10096                         &cap_idx) == NULL)
10097                 return -ENOTSUP;
10098
10099         if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
10100                         == -ENOTSUP)
10101                 return -ENOTSUP;
10102
10103         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10104         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
10105                         &stats) == -ENODEV),
10106                 "rte_cryptodev_stats_get invalid dev failed");
10107         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
10108                 "rte_cryptodev_stats_get invalid Param failed");
10109
10110         /* Test expected values */
10111         test_AES_CBC_HMAC_SHA1_encrypt_digest();
10112         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10113                         &stats),
10114                 "rte_cryptodev_stats_get failed");
10115         TEST_ASSERT((stats.enqueued_count == 1),
10116                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10117         TEST_ASSERT((stats.dequeued_count == 1),
10118                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10119         TEST_ASSERT((stats.enqueue_err_count == 0),
10120                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10121         TEST_ASSERT((stats.dequeue_err_count == 0),
10122                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10123
10124         /* invalid device but should ignore and not reset device stats*/
10125         rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
10126         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10127                         &stats),
10128                 "rte_cryptodev_stats_get failed");
10129         TEST_ASSERT((stats.enqueued_count == 1),
10130                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10131
10132         /* check that a valid reset clears stats */
10133         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10134         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10135                         &stats),
10136                                           "rte_cryptodev_stats_get failed");
10137         TEST_ASSERT((stats.enqueued_count == 0),
10138                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10139         TEST_ASSERT((stats.dequeued_count == 0),
10140                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10141
10142         return TEST_SUCCESS;
10143 }
10144
10145 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
10146                                    struct crypto_unittest_params *ut_params,
10147                                    enum rte_crypto_auth_operation op,
10148                                    const struct HMAC_MD5_vector *test_case)
10149 {
10150         uint8_t key[64];
10151
10152         memcpy(key, test_case->key.data, test_case->key.len);
10153
10154         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10155         ut_params->auth_xform.next = NULL;
10156         ut_params->auth_xform.auth.op = op;
10157
10158         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
10159
10160         ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
10161         ut_params->auth_xform.auth.key.length = test_case->key.len;
10162         ut_params->auth_xform.auth.key.data = key;
10163
10164         ut_params->sess = rte_cryptodev_sym_session_create(
10165                         ts_params->session_mpool);
10166
10167         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10168                         ut_params->sess, &ut_params->auth_xform,
10169                         ts_params->session_priv_mpool);
10170
10171         if (ut_params->sess == NULL)
10172                 return TEST_FAILED;
10173
10174         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10175
10176         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10177                         rte_pktmbuf_tailroom(ut_params->ibuf));
10178
10179         return 0;
10180 }
10181
10182 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
10183                               const struct HMAC_MD5_vector *test_case,
10184                               uint8_t **plaintext)
10185 {
10186         uint16_t plaintext_pad_len;
10187
10188         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10189
10190         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10191                                 16);
10192
10193         *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10194                         plaintext_pad_len);
10195         memcpy(*plaintext, test_case->plaintext.data,
10196                         test_case->plaintext.len);
10197
10198         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10199                         ut_params->ibuf, MD5_DIGEST_LEN);
10200         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10201                         "no room to append digest");
10202         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10203                         ut_params->ibuf, plaintext_pad_len);
10204
10205         if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10206                 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
10207                            test_case->auth_tag.len);
10208         }
10209
10210         sym_op->auth.data.offset = 0;
10211         sym_op->auth.data.length = test_case->plaintext.len;
10212
10213         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10214         ut_params->op->sym->m_src = ut_params->ibuf;
10215
10216         return 0;
10217 }
10218
10219 static int
10220 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
10221 {
10222         uint16_t plaintext_pad_len;
10223         uint8_t *plaintext, *auth_tag;
10224
10225         struct crypto_testsuite_params *ts_params = &testsuite_params;
10226         struct crypto_unittest_params *ut_params = &unittest_params;
10227         struct rte_cryptodev_info dev_info;
10228
10229         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10230         uint64_t feat_flags = dev_info.feature_flags;
10231
10232         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10233                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10234                 printf("Device doesn't support RAW data-path APIs.\n");
10235                 return -ENOTSUP;
10236         }
10237
10238         /* Verify the capabilities */
10239         struct rte_cryptodev_sym_capability_idx cap_idx;
10240         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10241         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10242         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10243                         &cap_idx) == NULL)
10244                 return -ENOTSUP;
10245
10246         if (MD5_HMAC_create_session(ts_params, ut_params,
10247                         RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
10248                 return TEST_FAILED;
10249
10250         /* Generate Crypto op data structure */
10251         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10252                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10253         TEST_ASSERT_NOT_NULL(ut_params->op,
10254                         "Failed to allocate symmetric crypto operation struct");
10255
10256         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10257                                 16);
10258
10259         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10260                 return TEST_FAILED;
10261
10262         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10263                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10264                         ut_params->op);
10265         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10266                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10267                                 ut_params->op, 0, 1, 0, 0);
10268         else
10269                 TEST_ASSERT_NOT_NULL(
10270                         process_crypto_request(ts_params->valid_devs[0],
10271                                 ut_params->op),
10272                                 "failed to process sym crypto op");
10273
10274         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10275                         "crypto op processing failed");
10276
10277         if (ut_params->op->sym->m_dst) {
10278                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
10279                                 uint8_t *, plaintext_pad_len);
10280         } else {
10281                 auth_tag = plaintext + plaintext_pad_len;
10282         }
10283
10284         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10285                         auth_tag,
10286                         test_case->auth_tag.data,
10287                         test_case->auth_tag.len,
10288                         "HMAC_MD5 generated tag not as expected");
10289
10290         return TEST_SUCCESS;
10291 }
10292
10293 static int
10294 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
10295 {
10296         uint8_t *plaintext;
10297
10298         struct crypto_testsuite_params *ts_params = &testsuite_params;
10299         struct crypto_unittest_params *ut_params = &unittest_params;
10300         struct rte_cryptodev_info dev_info;
10301
10302         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10303         uint64_t feat_flags = dev_info.feature_flags;
10304
10305         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10306                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10307                 printf("Device doesn't support RAW data-path APIs.\n");
10308                 return -ENOTSUP;
10309         }
10310
10311         /* Verify the capabilities */
10312         struct rte_cryptodev_sym_capability_idx cap_idx;
10313         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10314         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10315         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10316                         &cap_idx) == NULL)
10317                 return -ENOTSUP;
10318
10319         if (MD5_HMAC_create_session(ts_params, ut_params,
10320                         RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
10321                 return TEST_FAILED;
10322         }
10323
10324         /* Generate Crypto op data structure */
10325         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10326                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10327         TEST_ASSERT_NOT_NULL(ut_params->op,
10328                         "Failed to allocate symmetric crypto operation struct");
10329
10330         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10331                 return TEST_FAILED;
10332
10333         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10334                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10335                         ut_params->op);
10336         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10337                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10338                                 ut_params->op, 0, 1, 0, 0);
10339         else
10340                 TEST_ASSERT_NOT_NULL(
10341                         process_crypto_request(ts_params->valid_devs[0],
10342                                 ut_params->op),
10343                                 "failed to process sym crypto op");
10344
10345         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10346                         "HMAC_MD5 crypto op processing failed");
10347
10348         return TEST_SUCCESS;
10349 }
10350
10351 static int
10352 test_MD5_HMAC_generate_case_1(void)
10353 {
10354         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
10355 }
10356
10357 static int
10358 test_MD5_HMAC_verify_case_1(void)
10359 {
10360         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
10361 }
10362
10363 static int
10364 test_MD5_HMAC_generate_case_2(void)
10365 {
10366         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
10367 }
10368
10369 static int
10370 test_MD5_HMAC_verify_case_2(void)
10371 {
10372         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
10373 }
10374
10375 static int
10376 test_multi_session(void)
10377 {
10378         struct crypto_testsuite_params *ts_params = &testsuite_params;
10379         struct crypto_unittest_params *ut_params = &unittest_params;
10380
10381         struct rte_cryptodev_info dev_info;
10382         struct rte_cryptodev_sym_session **sessions;
10383
10384         uint16_t i;
10385
10386         /* Verify the capabilities */
10387         struct rte_cryptodev_sym_capability_idx cap_idx;
10388         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10389         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10390         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10391                         &cap_idx) == NULL)
10392                 return -ENOTSUP;
10393         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10394         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10395         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10396                         &cap_idx) == NULL)
10397                 return -ENOTSUP;
10398
10399         test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
10400                         aes_cbc_key, hmac_sha512_key);
10401
10402
10403         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10404
10405         sessions = rte_malloc(NULL,
10406                         (sizeof(struct rte_cryptodev_sym_session *) *
10407                         MAX_NB_SESSIONS) + 1, 0);
10408
10409         /* Create multiple crypto sessions*/
10410         for (i = 0; i < MAX_NB_SESSIONS; i++) {
10411
10412                 sessions[i] = rte_cryptodev_sym_session_create(
10413                                 ts_params->session_mpool);
10414
10415                 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10416                                 sessions[i], &ut_params->auth_xform,
10417                                 ts_params->session_priv_mpool);
10418                 TEST_ASSERT_NOT_NULL(sessions[i],
10419                                 "Session creation failed at session number %u",
10420                                 i);
10421
10422                 /* Attempt to send a request on each session */
10423                 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
10424                         sessions[i],
10425                         ut_params,
10426                         ts_params,
10427                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
10428                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
10429                         aes_cbc_iv),
10430                         "Failed to perform decrypt on request number %u.", i);
10431                 /* free crypto operation structure */
10432                 if (ut_params->op)
10433                         rte_crypto_op_free(ut_params->op);
10434
10435                 /*
10436                  * free mbuf - both obuf and ibuf are usually the same,
10437                  * so check if they point at the same address is necessary,
10438                  * to avoid freeing the mbuf twice.
10439                  */
10440                 if (ut_params->obuf) {
10441                         rte_pktmbuf_free(ut_params->obuf);
10442                         if (ut_params->ibuf == ut_params->obuf)
10443                                 ut_params->ibuf = 0;
10444                         ut_params->obuf = 0;
10445                 }
10446                 if (ut_params->ibuf) {
10447                         rte_pktmbuf_free(ut_params->ibuf);
10448                         ut_params->ibuf = 0;
10449                 }
10450         }
10451
10452         /* Next session create should fail */
10453         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10454                         sessions[i], &ut_params->auth_xform,
10455                         ts_params->session_priv_mpool);
10456         TEST_ASSERT_NULL(sessions[i],
10457                         "Session creation succeeded unexpectedly!");
10458
10459         for (i = 0; i < MAX_NB_SESSIONS; i++) {
10460                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10461                                 sessions[i]);
10462                 rte_cryptodev_sym_session_free(sessions[i]);
10463         }
10464
10465         rte_free(sessions);
10466
10467         return TEST_SUCCESS;
10468 }
10469
10470 struct multi_session_params {
10471         struct crypto_unittest_params ut_params;
10472         uint8_t *cipher_key;
10473         uint8_t *hmac_key;
10474         const uint8_t *cipher;
10475         const uint8_t *digest;
10476         uint8_t *iv;
10477 };
10478
10479 #define MB_SESSION_NUMBER 3
10480
10481 static int
10482 test_multi_session_random_usage(void)
10483 {
10484         struct crypto_testsuite_params *ts_params = &testsuite_params;
10485         struct rte_cryptodev_info dev_info;
10486         struct rte_cryptodev_sym_session **sessions;
10487         uint32_t i, j;
10488         struct multi_session_params ut_paramz[] = {
10489
10490                 {
10491                         .cipher_key = ms_aes_cbc_key0,
10492                         .hmac_key = ms_hmac_key0,
10493                         .cipher = ms_aes_cbc_cipher0,
10494                         .digest = ms_hmac_digest0,
10495                         .iv = ms_aes_cbc_iv0
10496                 },
10497                 {
10498                         .cipher_key = ms_aes_cbc_key1,
10499                         .hmac_key = ms_hmac_key1,
10500                         .cipher = ms_aes_cbc_cipher1,
10501                         .digest = ms_hmac_digest1,
10502                         .iv = ms_aes_cbc_iv1
10503                 },
10504                 {
10505                         .cipher_key = ms_aes_cbc_key2,
10506                         .hmac_key = ms_hmac_key2,
10507                         .cipher = ms_aes_cbc_cipher2,
10508                         .digest = ms_hmac_digest2,
10509                         .iv = ms_aes_cbc_iv2
10510                 },
10511
10512         };
10513
10514         /* Verify the capabilities */
10515         struct rte_cryptodev_sym_capability_idx cap_idx;
10516         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10517         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10518         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10519                         &cap_idx) == NULL)
10520                 return -ENOTSUP;
10521         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10522         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10523         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10524                         &cap_idx) == NULL)
10525                 return -ENOTSUP;
10526
10527         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10528
10529         sessions = rte_malloc(NULL,
10530                         (sizeof(struct rte_cryptodev_sym_session *)
10531                                         * MAX_NB_SESSIONS) + 1, 0);
10532
10533         for (i = 0; i < MB_SESSION_NUMBER; i++) {
10534                 sessions[i] = rte_cryptodev_sym_session_create(
10535                                 ts_params->session_mpool);
10536
10537                 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
10538                                 sizeof(struct crypto_unittest_params));
10539
10540                 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
10541                                 &ut_paramz[i].ut_params,
10542                                 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
10543
10544                 /* Create multiple crypto sessions*/
10545                 rte_cryptodev_sym_session_init(
10546                                 ts_params->valid_devs[0],
10547                                 sessions[i],
10548                                 &ut_paramz[i].ut_params.auth_xform,
10549                                 ts_params->session_priv_mpool);
10550
10551                 TEST_ASSERT_NOT_NULL(sessions[i],
10552                                 "Session creation failed at session number %u",
10553                                 i);
10554
10555         }
10556
10557         srand(time(NULL));
10558         for (i = 0; i < 40000; i++) {
10559
10560                 j = rand() % MB_SESSION_NUMBER;
10561
10562                 TEST_ASSERT_SUCCESS(
10563                         test_AES_CBC_HMAC_SHA512_decrypt_perform(
10564                                         sessions[j],
10565                                         &ut_paramz[j].ut_params,
10566                                         ts_params, ut_paramz[j].cipher,
10567                                         ut_paramz[j].digest,
10568                                         ut_paramz[j].iv),
10569                         "Failed to perform decrypt on request number %u.", i);
10570
10571                 if (ut_paramz[j].ut_params.op)
10572                         rte_crypto_op_free(ut_paramz[j].ut_params.op);
10573
10574                 /*
10575                  * free mbuf - both obuf and ibuf are usually the same,
10576                  * so check if they point at the same address is necessary,
10577                  * to avoid freeing the mbuf twice.
10578                  */
10579                 if (ut_paramz[j].ut_params.obuf) {
10580                         rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
10581                         if (ut_paramz[j].ut_params.ibuf
10582                                         == ut_paramz[j].ut_params.obuf)
10583                                 ut_paramz[j].ut_params.ibuf = 0;
10584                         ut_paramz[j].ut_params.obuf = 0;
10585                 }
10586                 if (ut_paramz[j].ut_params.ibuf) {
10587                         rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
10588                         ut_paramz[j].ut_params.ibuf = 0;
10589                 }
10590         }
10591
10592         for (i = 0; i < MB_SESSION_NUMBER; i++) {
10593                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10594                                 sessions[i]);
10595                 rte_cryptodev_sym_session_free(sessions[i]);
10596         }
10597
10598         rte_free(sessions);
10599
10600         return TEST_SUCCESS;
10601 }
10602
10603 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
10604                         0xab, 0xab, 0xab, 0xab,
10605                         0xab, 0xab, 0xab, 0xab,
10606                         0xab, 0xab, 0xab, 0xab};
10607
10608 static int
10609 test_null_invalid_operation(void)
10610 {
10611         struct crypto_testsuite_params *ts_params = &testsuite_params;
10612         struct crypto_unittest_params *ut_params = &unittest_params;
10613         int ret;
10614
10615         /* This test is for NULL PMD only */
10616         if (gbl_driver_id != rte_cryptodev_driver_id_get(
10617                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10618                 return -ENOTSUP;
10619
10620         /* Setup Cipher Parameters */
10621         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10622         ut_params->cipher_xform.next = NULL;
10623
10624         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
10625         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10626
10627         ut_params->sess = rte_cryptodev_sym_session_create(
10628                         ts_params->session_mpool);
10629
10630         /* Create Crypto session*/
10631         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10632                         ut_params->sess, &ut_params->cipher_xform,
10633                         ts_params->session_priv_mpool);
10634         TEST_ASSERT(ret < 0,
10635                         "Session creation succeeded unexpectedly");
10636
10637
10638         /* Setup HMAC Parameters */
10639         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10640         ut_params->auth_xform.next = NULL;
10641
10642         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
10643         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10644
10645         ut_params->sess = rte_cryptodev_sym_session_create(
10646                         ts_params->session_mpool);
10647
10648         /* Create Crypto session*/
10649         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10650                         ut_params->sess, &ut_params->auth_xform,
10651                         ts_params->session_priv_mpool);
10652         TEST_ASSERT(ret < 0,
10653                         "Session creation succeeded unexpectedly");
10654
10655         return TEST_SUCCESS;
10656 }
10657
10658
10659 #define NULL_BURST_LENGTH (32)
10660
10661 static int
10662 test_null_burst_operation(void)
10663 {
10664         struct crypto_testsuite_params *ts_params = &testsuite_params;
10665         struct crypto_unittest_params *ut_params = &unittest_params;
10666
10667         unsigned i, burst_len = NULL_BURST_LENGTH;
10668
10669         struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
10670         struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
10671
10672         /* This test is for NULL PMD only */
10673         if (gbl_driver_id != rte_cryptodev_driver_id_get(
10674                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10675                 return -ENOTSUP;
10676
10677         /* Setup Cipher Parameters */
10678         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10679         ut_params->cipher_xform.next = &ut_params->auth_xform;
10680
10681         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
10682         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10683
10684         /* Setup HMAC Parameters */
10685         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10686         ut_params->auth_xform.next = NULL;
10687
10688         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
10689         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10690
10691         ut_params->sess = rte_cryptodev_sym_session_create(
10692                         ts_params->session_mpool);
10693
10694         /* Create Crypto session*/
10695         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10696                         ut_params->sess, &ut_params->cipher_xform,
10697                         ts_params->session_priv_mpool);
10698         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10699
10700         TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
10701                         RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
10702                         burst_len, "failed to generate burst of crypto ops");
10703
10704         /* Generate an operation for each mbuf in burst */
10705         for (i = 0; i < burst_len; i++) {
10706                 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10707
10708                 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
10709
10710                 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
10711                                 sizeof(unsigned));
10712                 *data = i;
10713
10714                 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
10715
10716                 burst[i]->sym->m_src = m;
10717         }
10718
10719         /* Process crypto operation */
10720         TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
10721                         0, burst, burst_len),
10722                         burst_len,
10723                         "Error enqueuing burst");
10724
10725         TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
10726                         0, burst_dequeued, burst_len),
10727                         burst_len,
10728                         "Error dequeuing burst");
10729
10730
10731         for (i = 0; i < burst_len; i++) {
10732                 TEST_ASSERT_EQUAL(
10733                         *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
10734                         *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
10735                                         uint32_t *),
10736                         "data not as expected");
10737
10738                 rte_pktmbuf_free(burst[i]->sym->m_src);
10739                 rte_crypto_op_free(burst[i]);
10740         }
10741
10742         return TEST_SUCCESS;
10743 }
10744
10745 static uint16_t
10746 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
10747                   uint16_t nb_ops, void *user_param)
10748 {
10749         RTE_SET_USED(dev_id);
10750         RTE_SET_USED(qp_id);
10751         RTE_SET_USED(ops);
10752         RTE_SET_USED(user_param);
10753
10754         printf("crypto enqueue callback called\n");
10755         return nb_ops;
10756 }
10757
10758 static uint16_t
10759 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
10760                   uint16_t nb_ops, void *user_param)
10761 {
10762         RTE_SET_USED(dev_id);
10763         RTE_SET_USED(qp_id);
10764         RTE_SET_USED(ops);
10765         RTE_SET_USED(user_param);
10766
10767         printf("crypto dequeue callback called\n");
10768         return nb_ops;
10769 }
10770
10771 /*
10772  * Thread using enqueue/dequeue callback with RCU.
10773  */
10774 static int
10775 test_enqdeq_callback_thread(void *arg)
10776 {
10777         RTE_SET_USED(arg);
10778         /* DP thread calls rte_cryptodev_enqueue_burst()/
10779          * rte_cryptodev_dequeue_burst() and invokes callback.
10780          */
10781         test_null_burst_operation();
10782         return 0;
10783 }
10784
10785 static int
10786 test_enq_callback_setup(void)
10787 {
10788         struct crypto_testsuite_params *ts_params = &testsuite_params;
10789         struct rte_cryptodev_info dev_info;
10790         struct rte_cryptodev_qp_conf qp_conf = {
10791                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
10792         };
10793
10794         struct rte_cryptodev_cb *cb;
10795         uint16_t qp_id = 0;
10796
10797         /* Stop the device in case it's started so it can be configured */
10798         rte_cryptodev_stop(ts_params->valid_devs[0]);
10799
10800         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10801
10802         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
10803                         &ts_params->conf),
10804                         "Failed to configure cryptodev %u",
10805                         ts_params->valid_devs[0]);
10806
10807         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
10808         qp_conf.mp_session = ts_params->session_mpool;
10809         qp_conf.mp_session_private = ts_params->session_priv_mpool;
10810
10811         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
10812                         ts_params->valid_devs[0], qp_id, &qp_conf,
10813                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
10814                         "Failed test for "
10815                         "rte_cryptodev_queue_pair_setup: num_inflights "
10816                         "%u on qp %u on cryptodev %u",
10817                         qp_conf.nb_descriptors, qp_id,
10818                         ts_params->valid_devs[0]);
10819
10820         /* Test with invalid crypto device */
10821         cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
10822                         qp_id, test_enq_callback, NULL);
10823         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10824                         "cryptodev %u did not fail",
10825                         qp_id, RTE_CRYPTO_MAX_DEVS);
10826
10827         /* Test with invalid queue pair */
10828         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10829                         dev_info.max_nb_queue_pairs + 1,
10830                         test_enq_callback, NULL);
10831         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10832                         "cryptodev %u did not fail",
10833                         dev_info.max_nb_queue_pairs + 1,
10834                         ts_params->valid_devs[0]);
10835
10836         /* Test with NULL callback */
10837         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10838                         qp_id, NULL, NULL);
10839         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10840                         "cryptodev %u did not fail",
10841                         qp_id, ts_params->valid_devs[0]);
10842
10843         /* Test with valid configuration */
10844         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10845                         qp_id, test_enq_callback, NULL);
10846         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
10847                         "qp %u on cryptodev %u",
10848                         qp_id, ts_params->valid_devs[0]);
10849
10850         rte_cryptodev_start(ts_params->valid_devs[0]);
10851
10852         /* Launch a thread */
10853         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
10854                                 rte_get_next_lcore(-1, 1, 0));
10855
10856         /* Wait until reader exited. */
10857         rte_eal_mp_wait_lcore();
10858
10859         /* Test with invalid crypto device */
10860         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10861                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
10862                         "Expected call to fail as crypto device is invalid");
10863
10864         /* Test with invalid queue pair */
10865         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10866                         ts_params->valid_devs[0],
10867                         dev_info.max_nb_queue_pairs + 1, cb),
10868                         "Expected call to fail as queue pair is invalid");
10869
10870         /* Test with NULL callback */
10871         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10872                         ts_params->valid_devs[0], qp_id, NULL),
10873                         "Expected call to fail as callback is NULL");
10874
10875         /* Test with valid configuration */
10876         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
10877                         ts_params->valid_devs[0], qp_id, cb),
10878                         "Failed test to remove callback on "
10879                         "qp %u on cryptodev %u",
10880                         qp_id, ts_params->valid_devs[0]);
10881
10882         return TEST_SUCCESS;
10883 }
10884
10885 static int
10886 test_deq_callback_setup(void)
10887 {
10888         struct crypto_testsuite_params *ts_params = &testsuite_params;
10889         struct rte_cryptodev_info dev_info;
10890         struct rte_cryptodev_qp_conf qp_conf = {
10891                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
10892         };
10893
10894         struct rte_cryptodev_cb *cb;
10895         uint16_t qp_id = 0;
10896
10897         /* Stop the device in case it's started so it can be configured */
10898         rte_cryptodev_stop(ts_params->valid_devs[0]);
10899
10900         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10901
10902         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
10903                         &ts_params->conf),
10904                         "Failed to configure cryptodev %u",
10905                         ts_params->valid_devs[0]);
10906
10907         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
10908         qp_conf.mp_session = ts_params->session_mpool;
10909         qp_conf.mp_session_private = ts_params->session_priv_mpool;
10910
10911         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
10912                         ts_params->valid_devs[0], qp_id, &qp_conf,
10913                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
10914                         "Failed test for "
10915                         "rte_cryptodev_queue_pair_setup: num_inflights "
10916                         "%u on qp %u on cryptodev %u",
10917                         qp_conf.nb_descriptors, qp_id,
10918                         ts_params->valid_devs[0]);
10919
10920         /* Test with invalid crypto device */
10921         cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
10922                         qp_id, test_deq_callback, NULL);
10923         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10924                         "cryptodev %u did not fail",
10925                         qp_id, RTE_CRYPTO_MAX_DEVS);
10926
10927         /* Test with invalid queue pair */
10928         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10929                         dev_info.max_nb_queue_pairs + 1,
10930                         test_deq_callback, NULL);
10931         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10932                         "cryptodev %u did not fail",
10933                         dev_info.max_nb_queue_pairs + 1,
10934                         ts_params->valid_devs[0]);
10935
10936         /* Test with NULL callback */
10937         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10938                         qp_id, NULL, NULL);
10939         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10940                         "cryptodev %u did not fail",
10941                         qp_id, ts_params->valid_devs[0]);
10942
10943         /* Test with valid configuration */
10944         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10945                         qp_id, test_deq_callback, NULL);
10946         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
10947                         "qp %u on cryptodev %u",
10948                         qp_id, ts_params->valid_devs[0]);
10949
10950         rte_cryptodev_start(ts_params->valid_devs[0]);
10951
10952         /* Launch a thread */
10953         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
10954                                 rte_get_next_lcore(-1, 1, 0));
10955
10956         /* Wait until reader exited. */
10957         rte_eal_mp_wait_lcore();
10958
10959         /* Test with invalid crypto device */
10960         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10961                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
10962                         "Expected call to fail as crypto device is invalid");
10963
10964         /* Test with invalid queue pair */
10965         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10966                         ts_params->valid_devs[0],
10967                         dev_info.max_nb_queue_pairs + 1, cb),
10968                         "Expected call to fail as queue pair is invalid");
10969
10970         /* Test with NULL callback */
10971         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10972                         ts_params->valid_devs[0], qp_id, NULL),
10973                         "Expected call to fail as callback is NULL");
10974
10975         /* Test with valid configuration */
10976         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
10977                         ts_params->valid_devs[0], qp_id, cb),
10978                         "Failed test to remove callback on "
10979                         "qp %u on cryptodev %u",
10980                         qp_id, ts_params->valid_devs[0]);
10981
10982         return TEST_SUCCESS;
10983 }
10984
10985 static void
10986 generate_gmac_large_plaintext(uint8_t *data)
10987 {
10988         uint16_t i;
10989
10990         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
10991                 memcpy(&data[i], &data[0], 32);
10992 }
10993
10994 static int
10995 create_gmac_operation(enum rte_crypto_auth_operation op,
10996                 const struct gmac_test_data *tdata)
10997 {
10998         struct crypto_testsuite_params *ts_params = &testsuite_params;
10999         struct crypto_unittest_params *ut_params = &unittest_params;
11000         struct rte_crypto_sym_op *sym_op;
11001
11002         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11003
11004         /* Generate Crypto op data structure */
11005         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11006                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11007         TEST_ASSERT_NOT_NULL(ut_params->op,
11008                         "Failed to allocate symmetric crypto operation struct");
11009
11010         sym_op = ut_params->op->sym;
11011
11012         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11013                         ut_params->ibuf, tdata->gmac_tag.len);
11014         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11015                         "no room to append digest");
11016
11017         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11018                         ut_params->ibuf, plaintext_pad_len);
11019
11020         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11021                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11022                                 tdata->gmac_tag.len);
11023                 debug_hexdump(stdout, "digest:",
11024                                 sym_op->auth.digest.data,
11025                                 tdata->gmac_tag.len);
11026         }
11027
11028         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11029                         uint8_t *, IV_OFFSET);
11030
11031         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11032
11033         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11034
11035         sym_op->cipher.data.length = 0;
11036         sym_op->cipher.data.offset = 0;
11037
11038         sym_op->auth.data.offset = 0;
11039         sym_op->auth.data.length = tdata->plaintext.len;
11040
11041         return 0;
11042 }
11043
11044 static int
11045 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
11046                 const struct gmac_test_data *tdata,
11047                 void *digest_mem, uint64_t digest_phys)
11048 {
11049         struct crypto_testsuite_params *ts_params = &testsuite_params;
11050         struct crypto_unittest_params *ut_params = &unittest_params;
11051         struct rte_crypto_sym_op *sym_op;
11052
11053         /* Generate Crypto op data structure */
11054         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11055                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11056         TEST_ASSERT_NOT_NULL(ut_params->op,
11057                         "Failed to allocate symmetric crypto operation struct");
11058
11059         sym_op = ut_params->op->sym;
11060
11061         sym_op->auth.digest.data = digest_mem;
11062         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11063                         "no room to append digest");
11064
11065         sym_op->auth.digest.phys_addr = digest_phys;
11066
11067         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11068                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11069                                 tdata->gmac_tag.len);
11070                 debug_hexdump(stdout, "digest:",
11071                                 sym_op->auth.digest.data,
11072                                 tdata->gmac_tag.len);
11073         }
11074
11075         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11076                         uint8_t *, IV_OFFSET);
11077
11078         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11079
11080         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11081
11082         sym_op->cipher.data.length = 0;
11083         sym_op->cipher.data.offset = 0;
11084
11085         sym_op->auth.data.offset = 0;
11086         sym_op->auth.data.length = tdata->plaintext.len;
11087
11088         return 0;
11089 }
11090
11091 static int create_gmac_session(uint8_t dev_id,
11092                 const struct gmac_test_data *tdata,
11093                 enum rte_crypto_auth_operation auth_op)
11094 {
11095         uint8_t auth_key[tdata->key.len];
11096
11097         struct crypto_testsuite_params *ts_params = &testsuite_params;
11098         struct crypto_unittest_params *ut_params = &unittest_params;
11099
11100         memcpy(auth_key, tdata->key.data, tdata->key.len);
11101
11102         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11103         ut_params->auth_xform.next = NULL;
11104
11105         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
11106         ut_params->auth_xform.auth.op = auth_op;
11107         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
11108         ut_params->auth_xform.auth.key.length = tdata->key.len;
11109         ut_params->auth_xform.auth.key.data = auth_key;
11110         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11111         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
11112
11113
11114         ut_params->sess = rte_cryptodev_sym_session_create(
11115                         ts_params->session_mpool);
11116
11117         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11118                         &ut_params->auth_xform,
11119                         ts_params->session_priv_mpool);
11120
11121         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11122
11123         return 0;
11124 }
11125
11126 static int
11127 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
11128 {
11129         struct crypto_testsuite_params *ts_params = &testsuite_params;
11130         struct crypto_unittest_params *ut_params = &unittest_params;
11131         struct rte_cryptodev_info dev_info;
11132
11133         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11134         uint64_t feat_flags = dev_info.feature_flags;
11135
11136         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11137                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11138                 printf("Device doesn't support RAW data-path APIs.\n");
11139                 return -ENOTSUP;
11140         }
11141
11142         int retval;
11143
11144         uint8_t *auth_tag, *plaintext;
11145         uint16_t plaintext_pad_len;
11146
11147         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11148                               "No GMAC length in the source data");
11149
11150         /* Verify the capabilities */
11151         struct rte_cryptodev_sym_capability_idx cap_idx;
11152         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11153         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11154         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11155                         &cap_idx) == NULL)
11156                 return -ENOTSUP;
11157
11158         retval = create_gmac_session(ts_params->valid_devs[0],
11159                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11160
11161         if (retval < 0)
11162                 return retval;
11163
11164         if (tdata->plaintext.len > MBUF_SIZE)
11165                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11166         else
11167                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11168         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11169                         "Failed to allocate input buffer in mempool");
11170
11171         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11172                         rte_pktmbuf_tailroom(ut_params->ibuf));
11173
11174         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11175         /*
11176          * Runtime generate the large plain text instead of use hard code
11177          * plain text vector. It is done to avoid create huge source file
11178          * with the test vector.
11179          */
11180         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11181                 generate_gmac_large_plaintext(tdata->plaintext.data);
11182
11183         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11184                                 plaintext_pad_len);
11185         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11186
11187         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11188         debug_hexdump(stdout, "plaintext:", plaintext,
11189                         tdata->plaintext.len);
11190
11191         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
11192                         tdata);
11193
11194         if (retval < 0)
11195                 return retval;
11196
11197         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11198
11199         ut_params->op->sym->m_src = ut_params->ibuf;
11200
11201         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11202                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11203                         ut_params->op);
11204         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11205                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11206                                 ut_params->op, 0, 1, 0, 0);
11207         else
11208                 TEST_ASSERT_NOT_NULL(
11209                         process_crypto_request(ts_params->valid_devs[0],
11210                         ut_params->op), "failed to process sym crypto op");
11211
11212         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11213                         "crypto op processing failed");
11214
11215         if (ut_params->op->sym->m_dst) {
11216                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11217                                 uint8_t *, plaintext_pad_len);
11218         } else {
11219                 auth_tag = plaintext + plaintext_pad_len;
11220         }
11221
11222         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11223
11224         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11225                         auth_tag,
11226                         tdata->gmac_tag.data,
11227                         tdata->gmac_tag.len,
11228                         "GMAC Generated auth tag not as expected");
11229
11230         return 0;
11231 }
11232
11233 static int
11234 test_AES_GMAC_authentication_test_case_1(void)
11235 {
11236         return test_AES_GMAC_authentication(&gmac_test_case_1);
11237 }
11238
11239 static int
11240 test_AES_GMAC_authentication_test_case_2(void)
11241 {
11242         return test_AES_GMAC_authentication(&gmac_test_case_2);
11243 }
11244
11245 static int
11246 test_AES_GMAC_authentication_test_case_3(void)
11247 {
11248         return test_AES_GMAC_authentication(&gmac_test_case_3);
11249 }
11250
11251 static int
11252 test_AES_GMAC_authentication_test_case_4(void)
11253 {
11254         return test_AES_GMAC_authentication(&gmac_test_case_4);
11255 }
11256
11257 static int
11258 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
11259 {
11260         struct crypto_testsuite_params *ts_params = &testsuite_params;
11261         struct crypto_unittest_params *ut_params = &unittest_params;
11262         int retval;
11263         uint32_t plaintext_pad_len;
11264         uint8_t *plaintext;
11265         struct rte_cryptodev_info dev_info;
11266
11267         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11268         uint64_t feat_flags = dev_info.feature_flags;
11269
11270         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11271                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11272                 printf("Device doesn't support RAW data-path APIs.\n");
11273                 return -ENOTSUP;
11274         }
11275
11276         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11277                               "No GMAC length in the source data");
11278
11279         /* Verify the capabilities */
11280         struct rte_cryptodev_sym_capability_idx cap_idx;
11281         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11282         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11283         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11284                         &cap_idx) == NULL)
11285                 return -ENOTSUP;
11286
11287         retval = create_gmac_session(ts_params->valid_devs[0],
11288                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
11289
11290         if (retval < 0)
11291                 return retval;
11292
11293         if (tdata->plaintext.len > MBUF_SIZE)
11294                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11295         else
11296                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11297         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11298                         "Failed to allocate input buffer in mempool");
11299
11300         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11301                         rte_pktmbuf_tailroom(ut_params->ibuf));
11302
11303         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11304
11305         /*
11306          * Runtime generate the large plain text instead of use hard code
11307          * plain text vector. It is done to avoid create huge source file
11308          * with the test vector.
11309          */
11310         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11311                 generate_gmac_large_plaintext(tdata->plaintext.data);
11312
11313         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11314                                 plaintext_pad_len);
11315         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11316
11317         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11318         debug_hexdump(stdout, "plaintext:", plaintext,
11319                         tdata->plaintext.len);
11320
11321         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
11322                         tdata);
11323
11324         if (retval < 0)
11325                 return retval;
11326
11327         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11328
11329         ut_params->op->sym->m_src = ut_params->ibuf;
11330
11331         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11332                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11333                         ut_params->op);
11334         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11335                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11336                                 ut_params->op, 0, 1, 0, 0);
11337         else
11338                 TEST_ASSERT_NOT_NULL(
11339                         process_crypto_request(ts_params->valid_devs[0],
11340                         ut_params->op), "failed to process sym crypto op");
11341
11342         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11343                         "crypto op processing failed");
11344
11345         return 0;
11346
11347 }
11348
11349 static int
11350 test_AES_GMAC_authentication_verify_test_case_1(void)
11351 {
11352         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
11353 }
11354
11355 static int
11356 test_AES_GMAC_authentication_verify_test_case_2(void)
11357 {
11358         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
11359 }
11360
11361 static int
11362 test_AES_GMAC_authentication_verify_test_case_3(void)
11363 {
11364         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
11365 }
11366
11367 static int
11368 test_AES_GMAC_authentication_verify_test_case_4(void)
11369 {
11370         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
11371 }
11372
11373 static int
11374 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
11375                                 uint32_t fragsz)
11376 {
11377         struct crypto_testsuite_params *ts_params = &testsuite_params;
11378         struct crypto_unittest_params *ut_params = &unittest_params;
11379         struct rte_cryptodev_info dev_info;
11380         uint64_t feature_flags;
11381         unsigned int trn_data = 0;
11382         void *digest_mem = NULL;
11383         uint32_t segs = 1;
11384         unsigned int to_trn = 0;
11385         struct rte_mbuf *buf = NULL;
11386         uint8_t *auth_tag, *plaintext;
11387         int retval;
11388
11389         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11390                               "No GMAC length in the source data");
11391
11392         /* Verify the capabilities */
11393         struct rte_cryptodev_sym_capability_idx cap_idx;
11394         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11395         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11396         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11397                         &cap_idx) == NULL)
11398                 return -ENOTSUP;
11399
11400         /* Check for any input SGL support */
11401         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11402         feature_flags = dev_info.feature_flags;
11403
11404         if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
11405                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
11406                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
11407                 return -ENOTSUP;
11408
11409         if (fragsz > tdata->plaintext.len)
11410                 fragsz = tdata->plaintext.len;
11411
11412         uint16_t plaintext_len = fragsz;
11413
11414         retval = create_gmac_session(ts_params->valid_devs[0],
11415                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11416
11417         if (retval < 0)
11418                 return retval;
11419
11420         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11421         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11422                         "Failed to allocate input buffer in mempool");
11423
11424         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11425                         rte_pktmbuf_tailroom(ut_params->ibuf));
11426
11427         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11428                                 plaintext_len);
11429         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11430
11431         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
11432
11433         trn_data += plaintext_len;
11434
11435         buf = ut_params->ibuf;
11436
11437         /*
11438          * Loop until no more fragments
11439          */
11440
11441         while (trn_data < tdata->plaintext.len) {
11442                 ++segs;
11443                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
11444                                 (tdata->plaintext.len - trn_data) : fragsz;
11445
11446                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11447                 buf = buf->next;
11448
11449                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
11450                                 rte_pktmbuf_tailroom(buf));
11451
11452                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
11453                                 to_trn);
11454
11455                 memcpy(plaintext, tdata->plaintext.data + trn_data,
11456                                 to_trn);
11457                 trn_data += to_trn;
11458                 if (trn_data  == tdata->plaintext.len)
11459                         digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
11460                                         tdata->gmac_tag.len);
11461         }
11462         ut_params->ibuf->nb_segs = segs;
11463
11464         /*
11465          * Place digest at the end of the last buffer
11466          */
11467         uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
11468
11469         if (!digest_mem) {
11470                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11471                                 + tdata->gmac_tag.len);
11472                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
11473                                 tdata->plaintext.len);
11474         }
11475
11476         retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
11477                         tdata, digest_mem, digest_phys);
11478
11479         if (retval < 0)
11480                 return retval;
11481
11482         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11483
11484         ut_params->op->sym->m_src = ut_params->ibuf;
11485
11486         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11487                 return -ENOTSUP;
11488
11489         TEST_ASSERT_NOT_NULL(
11490                 process_crypto_request(ts_params->valid_devs[0],
11491                 ut_params->op), "failed to process sym crypto op");
11492
11493         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11494                         "crypto op processing failed");
11495
11496         auth_tag = digest_mem;
11497         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11498         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11499                         auth_tag,
11500                         tdata->gmac_tag.data,
11501                         tdata->gmac_tag.len,
11502                         "GMAC Generated auth tag not as expected");
11503
11504         return 0;
11505 }
11506
11507 /* Segment size not multiple of block size (16B) */
11508 static int
11509 test_AES_GMAC_authentication_SGL_40B(void)
11510 {
11511         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
11512 }
11513
11514 static int
11515 test_AES_GMAC_authentication_SGL_80B(void)
11516 {
11517         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
11518 }
11519
11520 static int
11521 test_AES_GMAC_authentication_SGL_2048B(void)
11522 {
11523         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
11524 }
11525
11526 /* Segment size not multiple of block size (16B) */
11527 static int
11528 test_AES_GMAC_authentication_SGL_2047B(void)
11529 {
11530         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
11531 }
11532
11533 struct test_crypto_vector {
11534         enum rte_crypto_cipher_algorithm crypto_algo;
11535         unsigned int cipher_offset;
11536         unsigned int cipher_len;
11537
11538         struct {
11539                 uint8_t data[64];
11540                 unsigned int len;
11541         } cipher_key;
11542
11543         struct {
11544                 uint8_t data[64];
11545                 unsigned int len;
11546         } iv;
11547
11548         struct {
11549                 const uint8_t *data;
11550                 unsigned int len;
11551         } plaintext;
11552
11553         struct {
11554                 const uint8_t *data;
11555                 unsigned int len;
11556         } ciphertext;
11557
11558         enum rte_crypto_auth_algorithm auth_algo;
11559         unsigned int auth_offset;
11560
11561         struct {
11562                 uint8_t data[128];
11563                 unsigned int len;
11564         } auth_key;
11565
11566         struct {
11567                 const uint8_t *data;
11568                 unsigned int len;
11569         } aad;
11570
11571         struct {
11572                 uint8_t data[128];
11573                 unsigned int len;
11574         } digest;
11575 };
11576
11577 static const struct test_crypto_vector
11578 hmac_sha1_test_crypto_vector = {
11579         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11580         .plaintext = {
11581                 .data = plaintext_hash,
11582                 .len = 512
11583         },
11584         .auth_key = {
11585                 .data = {
11586                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11587                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11588                         0xDE, 0xF4, 0xDE, 0xAD
11589                 },
11590                 .len = 20
11591         },
11592         .digest = {
11593                 .data = {
11594                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
11595                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
11596                         0x3F, 0x91, 0x64, 0x59
11597                 },
11598                 .len = 20
11599         }
11600 };
11601
11602 static const struct test_crypto_vector
11603 aes128_gmac_test_vector = {
11604         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
11605         .plaintext = {
11606                 .data = plaintext_hash,
11607                 .len = 512
11608         },
11609         .iv = {
11610                 .data = {
11611                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11612                         0x08, 0x09, 0x0A, 0x0B
11613                 },
11614                 .len = 12
11615         },
11616         .auth_key = {
11617                 .data = {
11618                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11619                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
11620                 },
11621                 .len = 16
11622         },
11623         .digest = {
11624                 .data = {
11625                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
11626                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
11627                 },
11628                 .len = 16
11629         }
11630 };
11631
11632 static const struct test_crypto_vector
11633 aes128cbc_hmac_sha1_test_vector = {
11634         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11635         .cipher_offset = 0,
11636         .cipher_len = 512,
11637         .cipher_key = {
11638                 .data = {
11639                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11640                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11641                 },
11642                 .len = 16
11643         },
11644         .iv = {
11645                 .data = {
11646                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11647                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11648                 },
11649                 .len = 16
11650         },
11651         .plaintext = {
11652                 .data = plaintext_hash,
11653                 .len = 512
11654         },
11655         .ciphertext = {
11656                 .data = ciphertext512_aes128cbc,
11657                 .len = 512
11658         },
11659         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11660         .auth_offset = 0,
11661         .auth_key = {
11662                 .data = {
11663                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11664                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11665                         0xDE, 0xF4, 0xDE, 0xAD
11666                 },
11667                 .len = 20
11668         },
11669         .digest = {
11670                 .data = {
11671                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
11672                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11673                         0x18, 0x8C, 0x1D, 0x32
11674                 },
11675                 .len = 20
11676         }
11677 };
11678
11679 static const struct test_crypto_vector
11680 aes128cbc_hmac_sha1_aad_test_vector = {
11681         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11682         .cipher_offset = 8,
11683         .cipher_len = 496,
11684         .cipher_key = {
11685                 .data = {
11686                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11687                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11688                 },
11689                 .len = 16
11690         },
11691         .iv = {
11692                 .data = {
11693                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11694                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11695                 },
11696                 .len = 16
11697         },
11698         .plaintext = {
11699                 .data = plaintext_hash,
11700                 .len = 512
11701         },
11702         .ciphertext = {
11703                 .data = ciphertext512_aes128cbc_aad,
11704                 .len = 512
11705         },
11706         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11707         .auth_offset = 0,
11708         .auth_key = {
11709                 .data = {
11710                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11711                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11712                         0xDE, 0xF4, 0xDE, 0xAD
11713                 },
11714                 .len = 20
11715         },
11716         .digest = {
11717                 .data = {
11718                         0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
11719                         0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
11720                         0x62, 0x0F, 0xFB, 0x10
11721                 },
11722                 .len = 20
11723         }
11724 };
11725
11726 static void
11727 data_corruption(uint8_t *data)
11728 {
11729         data[0] += 1;
11730 }
11731
11732 static void
11733 tag_corruption(uint8_t *data, unsigned int tag_offset)
11734 {
11735         data[tag_offset] += 1;
11736 }
11737
11738 static int
11739 create_auth_session(struct crypto_unittest_params *ut_params,
11740                 uint8_t dev_id,
11741                 const struct test_crypto_vector *reference,
11742                 enum rte_crypto_auth_operation auth_op)
11743 {
11744         struct crypto_testsuite_params *ts_params = &testsuite_params;
11745         uint8_t auth_key[reference->auth_key.len + 1];
11746
11747         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11748
11749         /* Setup Authentication Parameters */
11750         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11751         ut_params->auth_xform.auth.op = auth_op;
11752         ut_params->auth_xform.next = NULL;
11753         ut_params->auth_xform.auth.algo = reference->auth_algo;
11754         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11755         ut_params->auth_xform.auth.key.data = auth_key;
11756         ut_params->auth_xform.auth.digest_length = reference->digest.len;
11757
11758         /* Create Crypto session*/
11759         ut_params->sess = rte_cryptodev_sym_session_create(
11760                         ts_params->session_mpool);
11761
11762         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11763                                 &ut_params->auth_xform,
11764                                 ts_params->session_priv_mpool);
11765
11766         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11767
11768         return 0;
11769 }
11770
11771 static int
11772 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
11773                 uint8_t dev_id,
11774                 const struct test_crypto_vector *reference,
11775                 enum rte_crypto_auth_operation auth_op,
11776                 enum rte_crypto_cipher_operation cipher_op)
11777 {
11778         struct crypto_testsuite_params *ts_params = &testsuite_params;
11779         uint8_t cipher_key[reference->cipher_key.len + 1];
11780         uint8_t auth_key[reference->auth_key.len + 1];
11781
11782         memcpy(cipher_key, reference->cipher_key.data,
11783                         reference->cipher_key.len);
11784         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11785
11786         /* Setup Authentication Parameters */
11787         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11788         ut_params->auth_xform.auth.op = auth_op;
11789         ut_params->auth_xform.auth.algo = reference->auth_algo;
11790         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11791         ut_params->auth_xform.auth.key.data = auth_key;
11792         ut_params->auth_xform.auth.digest_length = reference->digest.len;
11793
11794         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
11795                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11796                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
11797         } else {
11798                 ut_params->auth_xform.next = &ut_params->cipher_xform;
11799
11800                 /* Setup Cipher Parameters */
11801                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11802                 ut_params->cipher_xform.next = NULL;
11803                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
11804                 ut_params->cipher_xform.cipher.op = cipher_op;
11805                 ut_params->cipher_xform.cipher.key.data = cipher_key;
11806                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
11807                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
11808                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
11809         }
11810
11811         /* Create Crypto session*/
11812         ut_params->sess = rte_cryptodev_sym_session_create(
11813                         ts_params->session_mpool);
11814
11815         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11816                                 &ut_params->auth_xform,
11817                                 ts_params->session_priv_mpool);
11818
11819         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11820
11821         return 0;
11822 }
11823
11824 static int
11825 create_auth_operation(struct crypto_testsuite_params *ts_params,
11826                 struct crypto_unittest_params *ut_params,
11827                 const struct test_crypto_vector *reference,
11828                 unsigned int auth_generate)
11829 {
11830         /* Generate Crypto op data structure */
11831         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11832                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11833         TEST_ASSERT_NOT_NULL(ut_params->op,
11834                         "Failed to allocate pktmbuf offload");
11835
11836         /* Set crypto operation data parameters */
11837         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11838
11839         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11840
11841         /* set crypto operation source mbuf */
11842         sym_op->m_src = ut_params->ibuf;
11843
11844         /* digest */
11845         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11846                         ut_params->ibuf, reference->digest.len);
11847
11848         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11849                         "no room to append auth tag");
11850
11851         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11852                         ut_params->ibuf, reference->plaintext.len);
11853
11854         if (auth_generate)
11855                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11856         else
11857                 memcpy(sym_op->auth.digest.data,
11858                                 reference->digest.data,
11859                                 reference->digest.len);
11860
11861         debug_hexdump(stdout, "digest:",
11862                         sym_op->auth.digest.data,
11863                         reference->digest.len);
11864
11865         sym_op->auth.data.length = reference->plaintext.len;
11866         sym_op->auth.data.offset = 0;
11867
11868         return 0;
11869 }
11870
11871 static int
11872 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
11873                 struct crypto_unittest_params *ut_params,
11874                 const struct test_crypto_vector *reference,
11875                 unsigned int auth_generate)
11876 {
11877         /* Generate Crypto op data structure */
11878         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11879                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11880         TEST_ASSERT_NOT_NULL(ut_params->op,
11881                         "Failed to allocate pktmbuf offload");
11882
11883         /* Set crypto operation data parameters */
11884         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11885
11886         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11887
11888         /* set crypto operation source mbuf */
11889         sym_op->m_src = ut_params->ibuf;
11890
11891         /* digest */
11892         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11893                         ut_params->ibuf, reference->digest.len);
11894
11895         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11896                         "no room to append auth tag");
11897
11898         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11899                         ut_params->ibuf, reference->ciphertext.len);
11900
11901         if (auth_generate)
11902                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11903         else
11904                 memcpy(sym_op->auth.digest.data,
11905                                 reference->digest.data,
11906                                 reference->digest.len);
11907
11908         debug_hexdump(stdout, "digest:",
11909                         sym_op->auth.digest.data,
11910                         reference->digest.len);
11911
11912         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11913                         reference->iv.data, reference->iv.len);
11914
11915         sym_op->cipher.data.length = 0;
11916         sym_op->cipher.data.offset = 0;
11917
11918         sym_op->auth.data.length = reference->plaintext.len;
11919         sym_op->auth.data.offset = 0;
11920
11921         return 0;
11922 }
11923
11924 static int
11925 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
11926                 struct crypto_unittest_params *ut_params,
11927                 const struct test_crypto_vector *reference,
11928                 unsigned int auth_generate)
11929 {
11930         /* Generate Crypto op data structure */
11931         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11932                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11933         TEST_ASSERT_NOT_NULL(ut_params->op,
11934                         "Failed to allocate pktmbuf offload");
11935
11936         /* Set crypto operation data parameters */
11937         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11938
11939         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11940
11941         /* set crypto operation source mbuf */
11942         sym_op->m_src = ut_params->ibuf;
11943
11944         /* digest */
11945         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11946                         ut_params->ibuf, reference->digest.len);
11947
11948         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11949                         "no room to append auth tag");
11950
11951         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11952                         ut_params->ibuf, reference->ciphertext.len);
11953
11954         if (auth_generate)
11955                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11956         else
11957                 memcpy(sym_op->auth.digest.data,
11958                                 reference->digest.data,
11959                                 reference->digest.len);
11960
11961         debug_hexdump(stdout, "digest:",
11962                         sym_op->auth.digest.data,
11963                         reference->digest.len);
11964
11965         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11966                         reference->iv.data, reference->iv.len);
11967
11968         sym_op->cipher.data.length = reference->cipher_len;
11969         sym_op->cipher.data.offset = reference->cipher_offset;
11970
11971         sym_op->auth.data.length = reference->plaintext.len;
11972         sym_op->auth.data.offset = reference->auth_offset;
11973
11974         return 0;
11975 }
11976
11977 static int
11978 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11979                 struct crypto_unittest_params *ut_params,
11980                 const struct test_crypto_vector *reference)
11981 {
11982         return create_auth_operation(ts_params, ut_params, reference, 0);
11983 }
11984
11985 static int
11986 create_auth_verify_GMAC_operation(
11987                 struct crypto_testsuite_params *ts_params,
11988                 struct crypto_unittest_params *ut_params,
11989                 const struct test_crypto_vector *reference)
11990 {
11991         return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
11992 }
11993
11994 static int
11995 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11996                 struct crypto_unittest_params *ut_params,
11997                 const struct test_crypto_vector *reference)
11998 {
11999         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
12000 }
12001
12002 static int
12003 test_authentication_verify_fail_when_data_corruption(
12004                 struct crypto_testsuite_params *ts_params,
12005                 struct crypto_unittest_params *ut_params,
12006                 const struct test_crypto_vector *reference,
12007                 unsigned int data_corrupted)
12008 {
12009         int retval;
12010
12011         uint8_t *plaintext;
12012         struct rte_cryptodev_info dev_info;
12013
12014         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12015         uint64_t feat_flags = dev_info.feature_flags;
12016
12017         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12018                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12019                 printf("Device doesn't support RAW data-path APIs.\n");
12020                 return -ENOTSUP;
12021         }
12022
12023         /* Verify the capabilities */
12024         struct rte_cryptodev_sym_capability_idx cap_idx;
12025         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12026         cap_idx.algo.auth = reference->auth_algo;
12027         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12028                         &cap_idx) == NULL)
12029                 return -ENOTSUP;
12030
12031
12032         /* Create session */
12033         retval = create_auth_session(ut_params,
12034                         ts_params->valid_devs[0],
12035                         reference,
12036                         RTE_CRYPTO_AUTH_OP_VERIFY);
12037         if (retval < 0)
12038                 return retval;
12039
12040         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12041         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12042                         "Failed to allocate input buffer in mempool");
12043
12044         /* clear mbuf payload */
12045         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12046                         rte_pktmbuf_tailroom(ut_params->ibuf));
12047
12048         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12049                         reference->plaintext.len);
12050         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12051         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12052
12053         debug_hexdump(stdout, "plaintext:", plaintext,
12054                 reference->plaintext.len);
12055
12056         /* Create operation */
12057         retval = create_auth_verify_operation(ts_params, ut_params, reference);
12058
12059         if (retval < 0)
12060                 return retval;
12061
12062         if (data_corrupted)
12063                 data_corruption(plaintext);
12064         else
12065                 tag_corruption(plaintext, reference->plaintext.len);
12066
12067         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12068                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12069                         ut_params->op);
12070                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12071                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12072                         "authentication not failed");
12073         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12074                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12075                                 ut_params->op, 0, 1, 0, 0);
12076         else {
12077                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12078                         ut_params->op);
12079                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12080         }
12081
12082         return 0;
12083 }
12084
12085 static int
12086 test_authentication_verify_GMAC_fail_when_corruption(
12087                 struct crypto_testsuite_params *ts_params,
12088                 struct crypto_unittest_params *ut_params,
12089                 const struct test_crypto_vector *reference,
12090                 unsigned int data_corrupted)
12091 {
12092         int retval;
12093         uint8_t *plaintext;
12094         struct rte_cryptodev_info dev_info;
12095
12096         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12097         uint64_t feat_flags = dev_info.feature_flags;
12098
12099         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12100                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12101                 printf("Device doesn't support RAW data-path APIs.\n");
12102                 return -ENOTSUP;
12103         }
12104
12105         /* Verify the capabilities */
12106         struct rte_cryptodev_sym_capability_idx cap_idx;
12107         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12108         cap_idx.algo.auth = reference->auth_algo;
12109         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12110                         &cap_idx) == NULL)
12111                 return -ENOTSUP;
12112
12113         /* Create session */
12114         retval = create_auth_cipher_session(ut_params,
12115                         ts_params->valid_devs[0],
12116                         reference,
12117                         RTE_CRYPTO_AUTH_OP_VERIFY,
12118                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
12119         if (retval < 0)
12120                 return retval;
12121
12122         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12123         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12124                         "Failed to allocate input buffer in mempool");
12125
12126         /* clear mbuf payload */
12127         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12128                         rte_pktmbuf_tailroom(ut_params->ibuf));
12129
12130         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12131                         reference->plaintext.len);
12132         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12133         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12134
12135         debug_hexdump(stdout, "plaintext:", plaintext,
12136                 reference->plaintext.len);
12137
12138         /* Create operation */
12139         retval = create_auth_verify_GMAC_operation(ts_params,
12140                         ut_params,
12141                         reference);
12142
12143         if (retval < 0)
12144                 return retval;
12145
12146         if (data_corrupted)
12147                 data_corruption(plaintext);
12148         else
12149                 tag_corruption(plaintext, reference->aad.len);
12150
12151         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12152                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12153                         ut_params->op);
12154                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12155                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12156                         "authentication not failed");
12157         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12158                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12159                                 ut_params->op, 0, 1, 0, 0);
12160         else {
12161                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12162                         ut_params->op);
12163                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12164         }
12165
12166         return 0;
12167 }
12168
12169 static int
12170 test_authenticated_decryption_fail_when_corruption(
12171                 struct crypto_testsuite_params *ts_params,
12172                 struct crypto_unittest_params *ut_params,
12173                 const struct test_crypto_vector *reference,
12174                 unsigned int data_corrupted)
12175 {
12176         int retval;
12177
12178         uint8_t *ciphertext;
12179         struct rte_cryptodev_info dev_info;
12180
12181         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12182         uint64_t feat_flags = dev_info.feature_flags;
12183
12184         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12185                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12186                 printf("Device doesn't support RAW data-path APIs.\n");
12187                 return -ENOTSUP;
12188         }
12189
12190         /* Verify the capabilities */
12191         struct rte_cryptodev_sym_capability_idx cap_idx;
12192         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12193         cap_idx.algo.auth = reference->auth_algo;
12194         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12195                         &cap_idx) == NULL)
12196                 return -ENOTSUP;
12197         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12198         cap_idx.algo.cipher = reference->crypto_algo;
12199         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12200                         &cap_idx) == NULL)
12201                 return -ENOTSUP;
12202
12203         /* Create session */
12204         retval = create_auth_cipher_session(ut_params,
12205                         ts_params->valid_devs[0],
12206                         reference,
12207                         RTE_CRYPTO_AUTH_OP_VERIFY,
12208                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
12209         if (retval < 0)
12210                 return retval;
12211
12212         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12213         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12214                         "Failed to allocate input buffer in mempool");
12215
12216         /* clear mbuf payload */
12217         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12218                         rte_pktmbuf_tailroom(ut_params->ibuf));
12219
12220         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12221                         reference->ciphertext.len);
12222         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12223         memcpy(ciphertext, reference->ciphertext.data,
12224                         reference->ciphertext.len);
12225
12226         /* Create operation */
12227         retval = create_cipher_auth_verify_operation(ts_params,
12228                         ut_params,
12229                         reference);
12230
12231         if (retval < 0)
12232                 return retval;
12233
12234         if (data_corrupted)
12235                 data_corruption(ciphertext);
12236         else
12237                 tag_corruption(ciphertext, reference->ciphertext.len);
12238
12239         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12240                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12241                         ut_params->op);
12242                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12243                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12244                         "authentication not failed");
12245         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12246                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12247                                 ut_params->op, 1, 1, 0, 0);
12248         else {
12249                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12250                         ut_params->op);
12251                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12252         }
12253
12254         return 0;
12255 }
12256
12257 static int
12258 test_authenticated_encryt_with_esn(
12259                 struct crypto_testsuite_params *ts_params,
12260                 struct crypto_unittest_params *ut_params,
12261                 const struct test_crypto_vector *reference)
12262 {
12263         int retval;
12264
12265         uint8_t *authciphertext, *plaintext, *auth_tag;
12266         uint16_t plaintext_pad_len;
12267         uint8_t cipher_key[reference->cipher_key.len + 1];
12268         uint8_t auth_key[reference->auth_key.len + 1];
12269         struct rte_cryptodev_info dev_info;
12270
12271         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12272         uint64_t feat_flags = dev_info.feature_flags;
12273
12274         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12275                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12276                 printf("Device doesn't support RAW data-path APIs.\n");
12277                 return -ENOTSUP;
12278         }
12279
12280         /* Verify the capabilities */
12281         struct rte_cryptodev_sym_capability_idx cap_idx;
12282         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12283         cap_idx.algo.auth = reference->auth_algo;
12284         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12285                         &cap_idx) == NULL)
12286                 return -ENOTSUP;
12287         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12288         cap_idx.algo.cipher = reference->crypto_algo;
12289         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12290                         &cap_idx) == NULL)
12291                 return -ENOTSUP;
12292
12293         /* Create session */
12294         memcpy(cipher_key, reference->cipher_key.data,
12295                         reference->cipher_key.len);
12296         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12297
12298         /* Setup Cipher Parameters */
12299         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12300         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12301         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12302         ut_params->cipher_xform.cipher.key.data = cipher_key;
12303         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12304         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12305         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12306
12307         ut_params->cipher_xform.next = &ut_params->auth_xform;
12308
12309         /* Setup Authentication Parameters */
12310         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12311         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12312         ut_params->auth_xform.auth.algo = reference->auth_algo;
12313         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12314         ut_params->auth_xform.auth.key.data = auth_key;
12315         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12316         ut_params->auth_xform.next = NULL;
12317
12318         /* Create Crypto session*/
12319         ut_params->sess = rte_cryptodev_sym_session_create(
12320                         ts_params->session_mpool);
12321
12322         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12323                                 ut_params->sess,
12324                                 &ut_params->cipher_xform,
12325                                 ts_params->session_priv_mpool);
12326
12327         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12328
12329         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12330         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12331                         "Failed to allocate input buffer in mempool");
12332
12333         /* clear mbuf payload */
12334         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12335                         rte_pktmbuf_tailroom(ut_params->ibuf));
12336
12337         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12338                         reference->plaintext.len);
12339         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12340         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12341
12342         /* Create operation */
12343         retval = create_cipher_auth_operation(ts_params,
12344                         ut_params,
12345                         reference, 0);
12346
12347         if (retval < 0)
12348                 return retval;
12349
12350         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12351                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12352                         ut_params->op);
12353         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12354                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12355                                 ut_params->op, 1, 1, 0, 0);
12356         else
12357                 ut_params->op = process_crypto_request(
12358                         ts_params->valid_devs[0], ut_params->op);
12359
12360         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
12361
12362         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12363                         "crypto op processing failed");
12364
12365         plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
12366
12367         authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
12368                         ut_params->op->sym->auth.data.offset);
12369         auth_tag = authciphertext + plaintext_pad_len;
12370         debug_hexdump(stdout, "ciphertext:", authciphertext,
12371                         reference->ciphertext.len);
12372         debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
12373
12374         /* Validate obuf */
12375         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12376                         authciphertext,
12377                         reference->ciphertext.data,
12378                         reference->ciphertext.len,
12379                         "Ciphertext data not as expected");
12380
12381         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12382                         auth_tag,
12383                         reference->digest.data,
12384                         reference->digest.len,
12385                         "Generated digest not as expected");
12386
12387         return TEST_SUCCESS;
12388
12389 }
12390
12391 static int
12392 test_authenticated_decrypt_with_esn(
12393                 struct crypto_testsuite_params *ts_params,
12394                 struct crypto_unittest_params *ut_params,
12395                 const struct test_crypto_vector *reference)
12396 {
12397         int retval;
12398
12399         uint8_t *ciphertext;
12400         uint8_t cipher_key[reference->cipher_key.len + 1];
12401         uint8_t auth_key[reference->auth_key.len + 1];
12402         struct rte_cryptodev_info dev_info;
12403
12404         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12405         uint64_t feat_flags = dev_info.feature_flags;
12406
12407         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12408                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12409                 printf("Device doesn't support RAW data-path APIs.\n");
12410                 return -ENOTSUP;
12411         }
12412
12413         /* Verify the capabilities */
12414         struct rte_cryptodev_sym_capability_idx cap_idx;
12415         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12416         cap_idx.algo.auth = reference->auth_algo;
12417         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12418                         &cap_idx) == NULL)
12419                 return -ENOTSUP;
12420         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12421         cap_idx.algo.cipher = reference->crypto_algo;
12422         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12423                         &cap_idx) == NULL)
12424                 return -ENOTSUP;
12425
12426         /* Create session */
12427         memcpy(cipher_key, reference->cipher_key.data,
12428                         reference->cipher_key.len);
12429         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12430
12431         /* Setup Authentication Parameters */
12432         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12433         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
12434         ut_params->auth_xform.auth.algo = reference->auth_algo;
12435         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12436         ut_params->auth_xform.auth.key.data = auth_key;
12437         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12438         ut_params->auth_xform.next = &ut_params->cipher_xform;
12439
12440         /* Setup Cipher Parameters */
12441         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12442         ut_params->cipher_xform.next = NULL;
12443         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12444         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
12445         ut_params->cipher_xform.cipher.key.data = cipher_key;
12446         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12447         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12448         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12449
12450         /* Create Crypto session*/
12451         ut_params->sess = rte_cryptodev_sym_session_create(
12452                         ts_params->session_mpool);
12453
12454         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12455                                 ut_params->sess,
12456                                 &ut_params->auth_xform,
12457                                 ts_params->session_priv_mpool);
12458
12459         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12460
12461         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12462         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12463                         "Failed to allocate input buffer in mempool");
12464
12465         /* clear mbuf payload */
12466         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12467                         rte_pktmbuf_tailroom(ut_params->ibuf));
12468
12469         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12470                         reference->ciphertext.len);
12471         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12472         memcpy(ciphertext, reference->ciphertext.data,
12473                         reference->ciphertext.len);
12474
12475         /* Create operation */
12476         retval = create_cipher_auth_verify_operation(ts_params,
12477                         ut_params,
12478                         reference);
12479
12480         if (retval < 0)
12481                 return retval;
12482
12483         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12484                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12485                         ut_params->op);
12486         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12487                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12488                                 ut_params->op, 1, 1, 0, 0);
12489         else
12490                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12491                         ut_params->op);
12492
12493         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
12494         TEST_ASSERT_EQUAL(ut_params->op->status,
12495                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12496                         "crypto op processing passed");
12497
12498         ut_params->obuf = ut_params->op->sym->m_src;
12499         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
12500
12501         return 0;
12502 }
12503
12504 static int
12505 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
12506                 const struct aead_test_data *tdata,
12507                 void *digest_mem, uint64_t digest_phys)
12508 {
12509         struct crypto_testsuite_params *ts_params = &testsuite_params;
12510         struct crypto_unittest_params *ut_params = &unittest_params;
12511
12512         const unsigned int auth_tag_len = tdata->auth_tag.len;
12513         const unsigned int iv_len = tdata->iv.len;
12514         unsigned int aad_len = tdata->aad.len;
12515         unsigned int aad_len_pad = 0;
12516
12517         /* Generate Crypto op data structure */
12518         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12519                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12520         TEST_ASSERT_NOT_NULL(ut_params->op,
12521                 "Failed to allocate symmetric crypto operation struct");
12522
12523         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12524
12525         sym_op->aead.digest.data = digest_mem;
12526
12527         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
12528                         "no room to append digest");
12529
12530         sym_op->aead.digest.phys_addr = digest_phys;
12531
12532         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
12533                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
12534                                 auth_tag_len);
12535                 debug_hexdump(stdout, "digest:",
12536                                 sym_op->aead.digest.data,
12537                                 auth_tag_len);
12538         }
12539
12540         /* Append aad data */
12541         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
12542                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12543                                 uint8_t *, IV_OFFSET);
12544
12545                 /* Copy IV 1 byte after the IV pointer, according to the API */
12546                 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
12547
12548                 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
12549
12550                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12551                                 ut_params->ibuf, aad_len);
12552                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12553                                 "no room to prepend aad");
12554                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12555                                 ut_params->ibuf);
12556
12557                 memset(sym_op->aead.aad.data, 0, aad_len);
12558                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
12559                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12560
12561                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12562                 debug_hexdump(stdout, "aad:",
12563                                 sym_op->aead.aad.data, aad_len);
12564         } else {
12565                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12566                                 uint8_t *, IV_OFFSET);
12567
12568                 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
12569
12570                 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
12571
12572                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12573                                 ut_params->ibuf, aad_len_pad);
12574                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12575                                 "no room to prepend aad");
12576                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12577                                 ut_params->ibuf);
12578
12579                 memset(sym_op->aead.aad.data, 0, aad_len);
12580                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12581
12582                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12583                 debug_hexdump(stdout, "aad:",
12584                                 sym_op->aead.aad.data, aad_len);
12585         }
12586
12587         sym_op->aead.data.length = tdata->plaintext.len;
12588         sym_op->aead.data.offset = aad_len_pad;
12589
12590         return 0;
12591 }
12592
12593 #define SGL_MAX_NO      16
12594
12595 static int
12596 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
12597                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
12598 {
12599         struct crypto_testsuite_params *ts_params = &testsuite_params;
12600         struct crypto_unittest_params *ut_params = &unittest_params;
12601         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
12602         int retval;
12603         int to_trn = 0;
12604         int to_trn_tbl[SGL_MAX_NO];
12605         int segs = 1;
12606         unsigned int trn_data = 0;
12607         uint8_t *plaintext, *ciphertext, *auth_tag;
12608         struct rte_cryptodev_info dev_info;
12609
12610         /* Verify the capabilities */
12611         struct rte_cryptodev_sym_capability_idx cap_idx;
12612         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12613         cap_idx.algo.aead = tdata->algo;
12614         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12615                         &cap_idx) == NULL)
12616                 return -ENOTSUP;
12617
12618         /* OOP not supported with CPU crypto */
12619         if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12620                 return -ENOTSUP;
12621
12622         /* Detailed check for the particular SGL support flag */
12623         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12624         if (!oop) {
12625                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
12626                 if (sgl_in && (!(dev_info.feature_flags &
12627                                 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
12628                         return -ENOTSUP;
12629
12630                 uint64_t feat_flags = dev_info.feature_flags;
12631
12632                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12633                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12634                         printf("Device doesn't support RAW data-path APIs.\n");
12635                         return -ENOTSUP;
12636                 }
12637         } else {
12638                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
12639                 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
12640                                 tdata->plaintext.len;
12641                 /* Raw data path API does not support OOP */
12642                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12643                         return -ENOTSUP;
12644                 if (sgl_in && !sgl_out) {
12645                         if (!(dev_info.feature_flags &
12646                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
12647                                 return -ENOTSUP;
12648                 } else if (!sgl_in && sgl_out) {
12649                         if (!(dev_info.feature_flags &
12650                                         RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
12651                                 return -ENOTSUP;
12652                 } else if (sgl_in && sgl_out) {
12653                         if (!(dev_info.feature_flags &
12654                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
12655                                 return -ENOTSUP;
12656                 }
12657         }
12658
12659         if (fragsz > tdata->plaintext.len)
12660                 fragsz = tdata->plaintext.len;
12661
12662         uint16_t plaintext_len = fragsz;
12663         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
12664
12665         if (fragsz_oop > tdata->plaintext.len)
12666                 frag_size_oop = tdata->plaintext.len;
12667
12668         int ecx = 0;
12669         void *digest_mem = NULL;
12670
12671         uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
12672
12673         if (tdata->plaintext.len % fragsz != 0) {
12674                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
12675                         return 1;
12676         }       else {
12677                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
12678                         return 1;
12679         }
12680
12681         /*
12682          * For out-op-place we need to alloc another mbuf
12683          */
12684         if (oop) {
12685                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12686                 rte_pktmbuf_append(ut_params->obuf,
12687                                 frag_size_oop + prepend_len);
12688                 buf_oop = ut_params->obuf;
12689         }
12690
12691         /* Create AEAD session */
12692         retval = create_aead_session(ts_params->valid_devs[0],
12693                         tdata->algo,
12694                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
12695                         tdata->key.data, tdata->key.len,
12696                         tdata->aad.len, tdata->auth_tag.len,
12697                         tdata->iv.len);
12698         if (retval < 0)
12699                 return retval;
12700
12701         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12702
12703         /* clear mbuf payload */
12704         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12705                         rte_pktmbuf_tailroom(ut_params->ibuf));
12706
12707         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12708                         plaintext_len);
12709
12710         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12711
12712         trn_data += plaintext_len;
12713
12714         buf = ut_params->ibuf;
12715
12716         /*
12717          * Loop until no more fragments
12718          */
12719
12720         while (trn_data < tdata->plaintext.len) {
12721                 ++segs;
12722                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12723                                 (tdata->plaintext.len - trn_data) : fragsz;
12724
12725                 to_trn_tbl[ecx++] = to_trn;
12726
12727                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12728                 buf = buf->next;
12729
12730                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12731                                 rte_pktmbuf_tailroom(buf));
12732
12733                 /* OOP */
12734                 if (oop && !fragsz_oop) {
12735                         buf_last_oop = buf_oop->next =
12736                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
12737                         buf_oop = buf_oop->next;
12738                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12739                                         0, rte_pktmbuf_tailroom(buf_oop));
12740                         rte_pktmbuf_append(buf_oop, to_trn);
12741                 }
12742
12743                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12744                                 to_trn);
12745
12746                 memcpy(plaintext, tdata->plaintext.data + trn_data,
12747                                 to_trn);
12748                 trn_data += to_trn;
12749                 if (trn_data  == tdata->plaintext.len) {
12750                         if (oop) {
12751                                 if (!fragsz_oop)
12752                                         digest_mem = rte_pktmbuf_append(buf_oop,
12753                                                 tdata->auth_tag.len);
12754                         } else
12755                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12756                                         tdata->auth_tag.len);
12757                 }
12758         }
12759
12760         uint64_t digest_phys = 0;
12761
12762         ut_params->ibuf->nb_segs = segs;
12763
12764         segs = 1;
12765         if (fragsz_oop && oop) {
12766                 to_trn = 0;
12767                 ecx = 0;
12768
12769                 if (frag_size_oop == tdata->plaintext.len) {
12770                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
12771                                 tdata->auth_tag.len);
12772
12773                         digest_phys = rte_pktmbuf_iova_offset(
12774                                         ut_params->obuf,
12775                                         tdata->plaintext.len + prepend_len);
12776                 }
12777
12778                 trn_data = frag_size_oop;
12779                 while (trn_data < tdata->plaintext.len) {
12780                         ++segs;
12781                         to_trn =
12782                                 (tdata->plaintext.len - trn_data <
12783                                                 frag_size_oop) ?
12784                                 (tdata->plaintext.len - trn_data) :
12785                                                 frag_size_oop;
12786
12787                         to_trn_tbl[ecx++] = to_trn;
12788
12789                         buf_last_oop = buf_oop->next =
12790                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
12791                         buf_oop = buf_oop->next;
12792                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12793                                         0, rte_pktmbuf_tailroom(buf_oop));
12794                         rte_pktmbuf_append(buf_oop, to_trn);
12795
12796                         trn_data += to_trn;
12797
12798                         if (trn_data  == tdata->plaintext.len) {
12799                                 digest_mem = rte_pktmbuf_append(buf_oop,
12800                                         tdata->auth_tag.len);
12801                         }
12802                 }
12803
12804                 ut_params->obuf->nb_segs = segs;
12805         }
12806
12807         /*
12808          * Place digest at the end of the last buffer
12809          */
12810         if (!digest_phys)
12811                 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12812         if (oop && buf_last_oop)
12813                 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
12814
12815         if (!digest_mem && !oop) {
12816                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12817                                 + tdata->auth_tag.len);
12818                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12819                                 tdata->plaintext.len);
12820         }
12821
12822         /* Create AEAD operation */
12823         retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
12824                         tdata, digest_mem, digest_phys);
12825
12826         if (retval < 0)
12827                 return retval;
12828
12829         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12830
12831         ut_params->op->sym->m_src = ut_params->ibuf;
12832         if (oop)
12833                 ut_params->op->sym->m_dst = ut_params->obuf;
12834
12835         /* Process crypto operation */
12836         if (oop == IN_PLACE &&
12837                         gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12838                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
12839         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12840                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12841                                 ut_params->op, 0, 0, 0, 0);
12842         else
12843                 TEST_ASSERT_NOT_NULL(
12844                         process_crypto_request(ts_params->valid_devs[0],
12845                         ut_params->op), "failed to process sym crypto op");
12846
12847         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12848                         "crypto op processing failed");
12849
12850
12851         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
12852                         uint8_t *, prepend_len);
12853         if (oop) {
12854                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12855                                 uint8_t *, prepend_len);
12856         }
12857
12858         if (fragsz_oop)
12859                 fragsz = fragsz_oop;
12860
12861         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12862                         ciphertext,
12863                         tdata->ciphertext.data,
12864                         fragsz,
12865                         "Ciphertext data not as expected");
12866
12867         buf = ut_params->op->sym->m_src->next;
12868         if (oop)
12869                 buf = ut_params->op->sym->m_dst->next;
12870
12871         unsigned int off = fragsz;
12872
12873         ecx = 0;
12874         while (buf) {
12875                 ciphertext = rte_pktmbuf_mtod(buf,
12876                                 uint8_t *);
12877
12878                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
12879                                 ciphertext,
12880                                 tdata->ciphertext.data + off,
12881                                 to_trn_tbl[ecx],
12882                                 "Ciphertext data not as expected");
12883
12884                 off += to_trn_tbl[ecx++];
12885                 buf = buf->next;
12886         }
12887
12888         auth_tag = digest_mem;
12889         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12890                         auth_tag,
12891                         tdata->auth_tag.data,
12892                         tdata->auth_tag.len,
12893                         "Generated auth tag not as expected");
12894
12895         return 0;
12896 }
12897
12898 static int
12899 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
12900 {
12901         return test_authenticated_encryption_SGL(
12902                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
12903 }
12904
12905 static int
12906 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
12907 {
12908         return test_authenticated_encryption_SGL(
12909                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
12910 }
12911
12912 static int
12913 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
12914 {
12915         return test_authenticated_encryption_SGL(
12916                         &gcm_test_case_8, OUT_OF_PLACE, 400,
12917                         gcm_test_case_8.plaintext.len);
12918 }
12919
12920 static int
12921 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
12922 {
12923         /* This test is not for OPENSSL PMD */
12924         if (gbl_driver_id == rte_cryptodev_driver_id_get(
12925                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
12926                 return -ENOTSUP;
12927
12928         return test_authenticated_encryption_SGL(
12929                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
12930 }
12931
12932 static int
12933 test_authentication_verify_fail_when_data_corrupted(
12934                 struct crypto_testsuite_params *ts_params,
12935                 struct crypto_unittest_params *ut_params,
12936                 const struct test_crypto_vector *reference)
12937 {
12938         return test_authentication_verify_fail_when_data_corruption(
12939                         ts_params, ut_params, reference, 1);
12940 }
12941
12942 static int
12943 test_authentication_verify_fail_when_tag_corrupted(
12944                 struct crypto_testsuite_params *ts_params,
12945                 struct crypto_unittest_params *ut_params,
12946                 const struct test_crypto_vector *reference)
12947 {
12948         return test_authentication_verify_fail_when_data_corruption(
12949                         ts_params, ut_params, reference, 0);
12950 }
12951
12952 static int
12953 test_authentication_verify_GMAC_fail_when_data_corrupted(
12954                 struct crypto_testsuite_params *ts_params,
12955                 struct crypto_unittest_params *ut_params,
12956                 const struct test_crypto_vector *reference)
12957 {
12958         return test_authentication_verify_GMAC_fail_when_corruption(
12959                         ts_params, ut_params, reference, 1);
12960 }
12961
12962 static int
12963 test_authentication_verify_GMAC_fail_when_tag_corrupted(
12964                 struct crypto_testsuite_params *ts_params,
12965                 struct crypto_unittest_params *ut_params,
12966                 const struct test_crypto_vector *reference)
12967 {
12968         return test_authentication_verify_GMAC_fail_when_corruption(
12969                         ts_params, ut_params, reference, 0);
12970 }
12971
12972 static int
12973 test_authenticated_decryption_fail_when_data_corrupted(
12974                 struct crypto_testsuite_params *ts_params,
12975                 struct crypto_unittest_params *ut_params,
12976                 const struct test_crypto_vector *reference)
12977 {
12978         return test_authenticated_decryption_fail_when_corruption(
12979                         ts_params, ut_params, reference, 1);
12980 }
12981
12982 static int
12983 test_authenticated_decryption_fail_when_tag_corrupted(
12984                 struct crypto_testsuite_params *ts_params,
12985                 struct crypto_unittest_params *ut_params,
12986                 const struct test_crypto_vector *reference)
12987 {
12988         return test_authenticated_decryption_fail_when_corruption(
12989                         ts_params, ut_params, reference, 0);
12990 }
12991
12992 static int
12993 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
12994 {
12995         return test_authentication_verify_fail_when_data_corrupted(
12996                         &testsuite_params, &unittest_params,
12997                         &hmac_sha1_test_crypto_vector);
12998 }
12999
13000 static int
13001 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
13002 {
13003         return test_authentication_verify_fail_when_tag_corrupted(
13004                         &testsuite_params, &unittest_params,
13005                         &hmac_sha1_test_crypto_vector);
13006 }
13007
13008 static int
13009 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
13010 {
13011         return test_authentication_verify_GMAC_fail_when_data_corrupted(
13012                         &testsuite_params, &unittest_params,
13013                         &aes128_gmac_test_vector);
13014 }
13015
13016 static int
13017 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13018 {
13019         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13020                         &testsuite_params, &unittest_params,
13021                         &aes128_gmac_test_vector);
13022 }
13023
13024 static int
13025 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13026 {
13027         return test_authenticated_decryption_fail_when_data_corrupted(
13028                         &testsuite_params,
13029                         &unittest_params,
13030                         &aes128cbc_hmac_sha1_test_vector);
13031 }
13032
13033 static int
13034 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
13035 {
13036         return test_authenticated_decryption_fail_when_tag_corrupted(
13037                         &testsuite_params,
13038                         &unittest_params,
13039                         &aes128cbc_hmac_sha1_test_vector);
13040 }
13041
13042 static int
13043 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13044 {
13045         return test_authenticated_encryt_with_esn(
13046                         &testsuite_params,
13047                         &unittest_params,
13048                         &aes128cbc_hmac_sha1_aad_test_vector);
13049 }
13050
13051 static int
13052 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13053 {
13054         return test_authenticated_decrypt_with_esn(
13055                         &testsuite_params,
13056                         &unittest_params,
13057                         &aes128cbc_hmac_sha1_aad_test_vector);
13058 }
13059
13060 static int
13061 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
13062 {
13063         return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
13064 }
13065
13066 static int
13067 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
13068 {
13069         return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
13070 }
13071
13072 #ifdef RTE_CRYPTO_SCHEDULER
13073
13074 /* global AESNI worker IDs for the scheduler test */
13075 uint8_t aesni_ids[2];
13076
13077 static int
13078 test_scheduler_attach_slave_op(void)
13079 {
13080         struct crypto_testsuite_params *ts_params = &testsuite_params;
13081         uint8_t sched_id = ts_params->valid_devs[0];
13082         uint32_t nb_devs, i, nb_devs_attached = 0;
13083         int ret;
13084         char vdev_name[32];
13085
13086         /* create 2 AESNI_MB if necessary */
13087         nb_devs = rte_cryptodev_device_count_by_driver(
13088                         rte_cryptodev_driver_id_get(
13089                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
13090         if (nb_devs < 2) {
13091                 for (i = nb_devs; i < 2; i++) {
13092                         snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
13093                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
13094                                         i);
13095                         ret = rte_vdev_init(vdev_name, NULL);
13096
13097                         TEST_ASSERT(ret == 0,
13098                                 "Failed to create instance %u of"
13099                                 " pmd : %s",
13100                                 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13101                 }
13102         }
13103
13104         /* attach 2 AESNI_MB cdevs */
13105         for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
13106                         i++) {
13107                 struct rte_cryptodev_info info;
13108                 unsigned int session_size;
13109
13110                 rte_cryptodev_info_get(i, &info);
13111                 if (info.driver_id != rte_cryptodev_driver_id_get(
13112                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
13113                         continue;
13114
13115                 session_size = rte_cryptodev_sym_get_private_session_size(i);
13116                 /*
13117                  * Create the session mempool again, since now there are new devices
13118                  * to use the mempool.
13119                  */
13120                 if (ts_params->session_mpool) {
13121                         rte_mempool_free(ts_params->session_mpool);
13122                         ts_params->session_mpool = NULL;
13123                 }
13124                 if (ts_params->session_priv_mpool) {
13125                         rte_mempool_free(ts_params->session_priv_mpool);
13126                         ts_params->session_priv_mpool = NULL;
13127                 }
13128
13129                 if (info.sym.max_nb_sessions != 0 &&
13130                                 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
13131                         RTE_LOG(ERR, USER1,
13132                                         "Device does not support "
13133                                         "at least %u sessions\n",
13134                                         MAX_NB_SESSIONS);
13135                         return TEST_FAILED;
13136                 }
13137                 /*
13138                  * Create mempool with maximum number of sessions,
13139                  * to include the session headers
13140                  */
13141                 if (ts_params->session_mpool == NULL) {
13142                         ts_params->session_mpool =
13143                                 rte_cryptodev_sym_session_pool_create(
13144                                                 "test_sess_mp",
13145                                                 MAX_NB_SESSIONS, 0, 0, 0,
13146                                                 SOCKET_ID_ANY);
13147                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
13148                                         "session mempool allocation failed");
13149                 }
13150
13151                 /*
13152                  * Create mempool with maximum number of sessions,
13153                  * to include device specific session private data
13154                  */
13155                 if (ts_params->session_priv_mpool == NULL) {
13156                         ts_params->session_priv_mpool = rte_mempool_create(
13157                                         "test_sess_mp_priv",
13158                                         MAX_NB_SESSIONS,
13159                                         session_size,
13160                                         0, 0, NULL, NULL, NULL,
13161                                         NULL, SOCKET_ID_ANY,
13162                                         0);
13163
13164                         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
13165                                         "session mempool allocation failed");
13166                 }
13167
13168                 ts_params->qp_conf.mp_session = ts_params->session_mpool;
13169                 ts_params->qp_conf.mp_session_private =
13170                                 ts_params->session_priv_mpool;
13171
13172                 ret = rte_cryptodev_scheduler_worker_attach(sched_id,
13173                                 (uint8_t)i);
13174
13175                 TEST_ASSERT(ret == 0,
13176                         "Failed to attach device %u of pmd : %s", i,
13177                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13178
13179                 aesni_ids[nb_devs_attached] = (uint8_t)i;
13180
13181                 nb_devs_attached++;
13182         }
13183
13184         return 0;
13185 }
13186
13187 static int
13188 test_scheduler_detach_slave_op(void)
13189 {
13190         struct crypto_testsuite_params *ts_params = &testsuite_params;
13191         uint8_t sched_id = ts_params->valid_devs[0];
13192         uint32_t i;
13193         int ret;
13194
13195         for (i = 0; i < 2; i++) {
13196                 ret = rte_cryptodev_scheduler_worker_detach(sched_id,
13197                                 aesni_ids[i]);
13198                 TEST_ASSERT(ret == 0,
13199                         "Failed to detach device %u", aesni_ids[i]);
13200         }
13201
13202         return 0;
13203 }
13204
13205 static int
13206 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
13207 {
13208         struct crypto_testsuite_params *ts_params = &testsuite_params;
13209         uint8_t sched_id = ts_params->valid_devs[0];
13210         /* set mode */
13211         return rte_cryptodev_scheduler_mode_set(sched_id,
13212                 scheduler_mode);
13213 }
13214
13215 static int
13216 test_scheduler_mode_roundrobin_op(void)
13217 {
13218         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
13219                         0, "Failed to set roundrobin mode");
13220         return 0;
13221
13222 }
13223
13224 static int
13225 test_scheduler_mode_multicore_op(void)
13226 {
13227         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
13228                         0, "Failed to set multicore mode");
13229
13230         return 0;
13231 }
13232
13233 static int
13234 test_scheduler_mode_failover_op(void)
13235 {
13236         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
13237                         0, "Failed to set failover mode");
13238
13239         return 0;
13240 }
13241
13242 static int
13243 test_scheduler_mode_pkt_size_distr_op(void)
13244 {
13245         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
13246                         0, "Failed to set pktsize mode");
13247
13248         return 0;
13249 }
13250
13251 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
13252         .suite_name = "Crypto Device Scheduler Unit Test Suite",
13253         .setup = testsuite_setup,
13254         .teardown = testsuite_teardown,
13255         .unit_test_cases = {
13256                 /* Multi Core */
13257                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13258                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),
13259                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13260                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13261                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13262                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13263
13264                 /* Round Robin */
13265                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13266                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),
13267                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13268                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13269                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13270                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13271
13272                 /* Fail over */
13273                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13274                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),
13275                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13276                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13277                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13278                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13279
13280                 /* PKT SIZE */
13281                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13282                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),
13283                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13284                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13285                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13286                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13287
13288                 TEST_CASES_END() /**< NULL terminate unit test array */
13289         }
13290 };
13291
13292 #endif /* RTE_CRYPTO_SCHEDULER */
13293
13294 static struct unit_test_suite cryptodev_testsuite  = {
13295         .suite_name = "Crypto Unit Test Suite",
13296         .setup = testsuite_setup,
13297         .teardown = testsuite_teardown,
13298         .unit_test_cases = {
13299                 TEST_CASE_ST(ut_setup, ut_teardown,
13300                                 test_device_configure_invalid_dev_id),
13301                 TEST_CASE_ST(ut_setup, ut_teardown,
13302                                 test_queue_pair_descriptor_setup),
13303                 TEST_CASE_ST(ut_setup, ut_teardown,
13304                                 test_device_configure_invalid_queue_pair_ids),
13305                 TEST_CASE_ST(ut_setup, ut_teardown,
13306                                 test_multi_session),
13307                 TEST_CASE_ST(ut_setup, ut_teardown,
13308                                 test_multi_session_random_usage),
13309
13310                 TEST_CASE_ST(ut_setup, ut_teardown,
13311                         test_null_invalid_operation),
13312                 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
13313                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13314                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13315                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13316                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13317                 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all),
13318                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all),
13319                 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all),
13320                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13321                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
13322
13323                 /** AES CCM Authenticated Encryption 128 bits key */
13324                 TEST_CASE_ST(ut_setup, ut_teardown,
13325                         test_AES_CCM_authenticated_encryption_test_case_128_1),
13326                 TEST_CASE_ST(ut_setup, ut_teardown,
13327                         test_AES_CCM_authenticated_encryption_test_case_128_2),
13328                 TEST_CASE_ST(ut_setup, ut_teardown,
13329                         test_AES_CCM_authenticated_encryption_test_case_128_3),
13330
13331                 /** AES CCM Authenticated Decryption 128 bits key*/
13332                 TEST_CASE_ST(ut_setup, ut_teardown,
13333                         test_AES_CCM_authenticated_decryption_test_case_128_1),
13334                 TEST_CASE_ST(ut_setup, ut_teardown,
13335                         test_AES_CCM_authenticated_decryption_test_case_128_2),
13336                 TEST_CASE_ST(ut_setup, ut_teardown,
13337                         test_AES_CCM_authenticated_decryption_test_case_128_3),
13338
13339                 /** AES CCM Authenticated Encryption 192 bits key */
13340                 TEST_CASE_ST(ut_setup, ut_teardown,
13341                         test_AES_CCM_authenticated_encryption_test_case_192_1),
13342                 TEST_CASE_ST(ut_setup, ut_teardown,
13343                         test_AES_CCM_authenticated_encryption_test_case_192_2),
13344                 TEST_CASE_ST(ut_setup, ut_teardown,
13345                         test_AES_CCM_authenticated_encryption_test_case_192_3),
13346
13347                 /** AES CCM Authenticated Decryption 192 bits key*/
13348                 TEST_CASE_ST(ut_setup, ut_teardown,
13349                         test_AES_CCM_authenticated_decryption_test_case_192_1),
13350                 TEST_CASE_ST(ut_setup, ut_teardown,
13351                         test_AES_CCM_authenticated_decryption_test_case_192_2),
13352                 TEST_CASE_ST(ut_setup, ut_teardown,
13353                         test_AES_CCM_authenticated_decryption_test_case_192_3),
13354
13355                 /** AES CCM Authenticated Encryption 256 bits key */
13356                 TEST_CASE_ST(ut_setup, ut_teardown,
13357                         test_AES_CCM_authenticated_encryption_test_case_256_1),
13358                 TEST_CASE_ST(ut_setup, ut_teardown,
13359                         test_AES_CCM_authenticated_encryption_test_case_256_2),
13360                 TEST_CASE_ST(ut_setup, ut_teardown,
13361                         test_AES_CCM_authenticated_encryption_test_case_256_3),
13362
13363                 /** AES CCM Authenticated Decryption 256 bits key*/
13364                 TEST_CASE_ST(ut_setup, ut_teardown,
13365                         test_AES_CCM_authenticated_decryption_test_case_256_1),
13366                 TEST_CASE_ST(ut_setup, ut_teardown,
13367                         test_AES_CCM_authenticated_decryption_test_case_256_2),
13368                 TEST_CASE_ST(ut_setup, ut_teardown,
13369                         test_AES_CCM_authenticated_decryption_test_case_256_3),
13370
13371                 /** AES GCM Authenticated Encryption */
13372                 TEST_CASE_ST(ut_setup, ut_teardown,
13373                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
13374                 TEST_CASE_ST(ut_setup, ut_teardown,
13375                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
13376                 TEST_CASE_ST(ut_setup, ut_teardown,
13377                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
13378                 TEST_CASE_ST(ut_setup, ut_teardown,
13379                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
13380                 TEST_CASE_ST(ut_setup, ut_teardown,
13381                         test_AES_GCM_authenticated_encryption_test_case_1),
13382                 TEST_CASE_ST(ut_setup, ut_teardown,
13383                         test_AES_GCM_authenticated_encryption_test_case_2),
13384                 TEST_CASE_ST(ut_setup, ut_teardown,
13385                         test_AES_GCM_authenticated_encryption_test_case_3),
13386                 TEST_CASE_ST(ut_setup, ut_teardown,
13387                         test_AES_GCM_authenticated_encryption_test_case_4),
13388                 TEST_CASE_ST(ut_setup, ut_teardown,
13389                         test_AES_GCM_authenticated_encryption_test_case_5),
13390                 TEST_CASE_ST(ut_setup, ut_teardown,
13391                         test_AES_GCM_authenticated_encryption_test_case_6),
13392                 TEST_CASE_ST(ut_setup, ut_teardown,
13393                         test_AES_GCM_authenticated_encryption_test_case_7),
13394                 TEST_CASE_ST(ut_setup, ut_teardown,
13395                         test_AES_GCM_authenticated_encryption_test_case_8),
13396                 TEST_CASE_ST(ut_setup, ut_teardown,
13397                         test_AES_GCM_J0_authenticated_encryption_test_case_1),
13398
13399                 /** AES GCM Authenticated Decryption */
13400                 TEST_CASE_ST(ut_setup, ut_teardown,
13401                         test_AES_GCM_authenticated_decryption_test_case_1),
13402                 TEST_CASE_ST(ut_setup, ut_teardown,
13403                         test_AES_GCM_authenticated_decryption_test_case_2),
13404                 TEST_CASE_ST(ut_setup, ut_teardown,
13405                         test_AES_GCM_authenticated_decryption_test_case_3),
13406                 TEST_CASE_ST(ut_setup, ut_teardown,
13407                         test_AES_GCM_authenticated_decryption_test_case_4),
13408                 TEST_CASE_ST(ut_setup, ut_teardown,
13409                         test_AES_GCM_authenticated_decryption_test_case_5),
13410                 TEST_CASE_ST(ut_setup, ut_teardown,
13411                         test_AES_GCM_authenticated_decryption_test_case_6),
13412                 TEST_CASE_ST(ut_setup, ut_teardown,
13413                         test_AES_GCM_authenticated_decryption_test_case_7),
13414                 TEST_CASE_ST(ut_setup, ut_teardown,
13415                         test_AES_GCM_authenticated_decryption_test_case_8),
13416                 TEST_CASE_ST(ut_setup, ut_teardown,
13417                         test_AES_GCM_J0_authenticated_decryption_test_case_1),
13418
13419                 /** AES GCM Authenticated Encryption 192 bits key */
13420                 TEST_CASE_ST(ut_setup, ut_teardown,
13421                         test_AES_GCM_auth_encryption_test_case_192_1),
13422                 TEST_CASE_ST(ut_setup, ut_teardown,
13423                         test_AES_GCM_auth_encryption_test_case_192_2),
13424                 TEST_CASE_ST(ut_setup, ut_teardown,
13425                         test_AES_GCM_auth_encryption_test_case_192_3),
13426                 TEST_CASE_ST(ut_setup, ut_teardown,
13427                         test_AES_GCM_auth_encryption_test_case_192_4),
13428                 TEST_CASE_ST(ut_setup, ut_teardown,
13429                         test_AES_GCM_auth_encryption_test_case_192_5),
13430                 TEST_CASE_ST(ut_setup, ut_teardown,
13431                         test_AES_GCM_auth_encryption_test_case_192_6),
13432                 TEST_CASE_ST(ut_setup, ut_teardown,
13433                         test_AES_GCM_auth_encryption_test_case_192_7),
13434
13435                 /** AES GCM Authenticated Decryption 192 bits key */
13436                 TEST_CASE_ST(ut_setup, ut_teardown,
13437                         test_AES_GCM_auth_decryption_test_case_192_1),
13438                 TEST_CASE_ST(ut_setup, ut_teardown,
13439                         test_AES_GCM_auth_decryption_test_case_192_2),
13440                 TEST_CASE_ST(ut_setup, ut_teardown,
13441                         test_AES_GCM_auth_decryption_test_case_192_3),
13442                 TEST_CASE_ST(ut_setup, ut_teardown,
13443                         test_AES_GCM_auth_decryption_test_case_192_4),
13444                 TEST_CASE_ST(ut_setup, ut_teardown,
13445                         test_AES_GCM_auth_decryption_test_case_192_5),
13446                 TEST_CASE_ST(ut_setup, ut_teardown,
13447                         test_AES_GCM_auth_decryption_test_case_192_6),
13448                 TEST_CASE_ST(ut_setup, ut_teardown,
13449                         test_AES_GCM_auth_decryption_test_case_192_7),
13450
13451                 /** AES GCM Authenticated Encryption 256 bits key */
13452                 TEST_CASE_ST(ut_setup, ut_teardown,
13453                         test_AES_GCM_auth_encryption_test_case_256_1),
13454                 TEST_CASE_ST(ut_setup, ut_teardown,
13455                         test_AES_GCM_auth_encryption_test_case_256_2),
13456                 TEST_CASE_ST(ut_setup, ut_teardown,
13457                         test_AES_GCM_auth_encryption_test_case_256_3),
13458                 TEST_CASE_ST(ut_setup, ut_teardown,
13459                         test_AES_GCM_auth_encryption_test_case_256_4),
13460                 TEST_CASE_ST(ut_setup, ut_teardown,
13461                         test_AES_GCM_auth_encryption_test_case_256_5),
13462                 TEST_CASE_ST(ut_setup, ut_teardown,
13463                         test_AES_GCM_auth_encryption_test_case_256_6),
13464                 TEST_CASE_ST(ut_setup, ut_teardown,
13465                         test_AES_GCM_auth_encryption_test_case_256_7),
13466
13467                 /** AES GCM Authenticated Decryption 256 bits key */
13468                 TEST_CASE_ST(ut_setup, ut_teardown,
13469                         test_AES_GCM_auth_decryption_test_case_256_1),
13470                 TEST_CASE_ST(ut_setup, ut_teardown,
13471                         test_AES_GCM_auth_decryption_test_case_256_2),
13472                 TEST_CASE_ST(ut_setup, ut_teardown,
13473                         test_AES_GCM_auth_decryption_test_case_256_3),
13474                 TEST_CASE_ST(ut_setup, ut_teardown,
13475                         test_AES_GCM_auth_decryption_test_case_256_4),
13476                 TEST_CASE_ST(ut_setup, ut_teardown,
13477                         test_AES_GCM_auth_decryption_test_case_256_5),
13478                 TEST_CASE_ST(ut_setup, ut_teardown,
13479                         test_AES_GCM_auth_decryption_test_case_256_6),
13480                 TEST_CASE_ST(ut_setup, ut_teardown,
13481                         test_AES_GCM_auth_decryption_test_case_256_7),
13482
13483                 /** AES GCM Authenticated Encryption big aad size */
13484                 TEST_CASE_ST(ut_setup, ut_teardown,
13485                         test_AES_GCM_auth_encryption_test_case_aad_1),
13486                 TEST_CASE_ST(ut_setup, ut_teardown,
13487                         test_AES_GCM_auth_encryption_test_case_aad_2),
13488
13489                 /** AES GCM Authenticated Decryption big aad size */
13490                 TEST_CASE_ST(ut_setup, ut_teardown,
13491                         test_AES_GCM_auth_decryption_test_case_aad_1),
13492                 TEST_CASE_ST(ut_setup, ut_teardown,
13493                         test_AES_GCM_auth_decryption_test_case_aad_2),
13494
13495                 /** Out of place tests */
13496                 TEST_CASE_ST(ut_setup, ut_teardown,
13497                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
13498                 TEST_CASE_ST(ut_setup, ut_teardown,
13499                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
13500
13501                 /** Session-less tests */
13502                 TEST_CASE_ST(ut_setup, ut_teardown,
13503                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
13504                 TEST_CASE_ST(ut_setup, ut_teardown,
13505                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
13506
13507                 /** AES GMAC Authentication */
13508                 TEST_CASE_ST(ut_setup, ut_teardown,
13509                         test_AES_GMAC_authentication_test_case_1),
13510                 TEST_CASE_ST(ut_setup, ut_teardown,
13511                         test_AES_GMAC_authentication_verify_test_case_1),
13512                 TEST_CASE_ST(ut_setup, ut_teardown,
13513                         test_AES_GMAC_authentication_test_case_2),
13514                 TEST_CASE_ST(ut_setup, ut_teardown,
13515                         test_AES_GMAC_authentication_verify_test_case_2),
13516                 TEST_CASE_ST(ut_setup, ut_teardown,
13517                         test_AES_GMAC_authentication_test_case_3),
13518                 TEST_CASE_ST(ut_setup, ut_teardown,
13519                         test_AES_GMAC_authentication_verify_test_case_3),
13520                 TEST_CASE_ST(ut_setup, ut_teardown,
13521                         test_AES_GMAC_authentication_test_case_4),
13522                 TEST_CASE_ST(ut_setup, ut_teardown,
13523                         test_AES_GMAC_authentication_verify_test_case_4),
13524                 TEST_CASE_ST(ut_setup, ut_teardown,
13525                         test_AES_GMAC_authentication_SGL_40B),
13526                 TEST_CASE_ST(ut_setup, ut_teardown,
13527                         test_AES_GMAC_authentication_SGL_80B),
13528                 TEST_CASE_ST(ut_setup, ut_teardown,
13529                         test_AES_GMAC_authentication_SGL_2048B),
13530                 TEST_CASE_ST(ut_setup, ut_teardown,
13531                         test_AES_GMAC_authentication_SGL_2047B),
13532
13533                 /** Chacha20-Poly1305 */
13534                 TEST_CASE_ST(ut_setup, ut_teardown,
13535                         test_chacha20_poly1305_encrypt_test_case_rfc8439),
13536                 TEST_CASE_ST(ut_setup, ut_teardown,
13537                         test_chacha20_poly1305_decrypt_test_case_rfc8439),
13538                 /** SNOW 3G encrypt only (UEA2) */
13539                 TEST_CASE_ST(ut_setup, ut_teardown,
13540                         test_snow3g_encryption_test_case_1),
13541                 TEST_CASE_ST(ut_setup, ut_teardown,
13542                         test_snow3g_encryption_test_case_2),
13543                 TEST_CASE_ST(ut_setup, ut_teardown,
13544                         test_snow3g_encryption_test_case_3),
13545                 TEST_CASE_ST(ut_setup, ut_teardown,
13546                         test_snow3g_encryption_test_case_4),
13547                 TEST_CASE_ST(ut_setup, ut_teardown,
13548                         test_snow3g_encryption_test_case_5),
13549
13550                 TEST_CASE_ST(ut_setup, ut_teardown,
13551                         test_snow3g_encryption_test_case_1_oop),
13552                 TEST_CASE_ST(ut_setup, ut_teardown,
13553                         test_snow3g_encryption_test_case_1_oop_sgl),
13554                 TEST_CASE_ST(ut_setup, ut_teardown,
13555                         test_snow3g_encryption_test_case_1_offset_oop),
13556                 TEST_CASE_ST(ut_setup, ut_teardown,
13557                         test_snow3g_decryption_test_case_1_oop),
13558
13559                 /** SNOW 3G generate auth, then encrypt (UEA2) */
13560                 TEST_CASE_ST(ut_setup, ut_teardown,
13561                         test_snow3g_auth_cipher_test_case_1),
13562                 TEST_CASE_ST(ut_setup, ut_teardown,
13563                         test_snow3g_auth_cipher_test_case_2),
13564                 TEST_CASE_ST(ut_setup, ut_teardown,
13565                         test_snow3g_auth_cipher_test_case_2_oop),
13566                 TEST_CASE_ST(ut_setup, ut_teardown,
13567                         test_snow3g_auth_cipher_part_digest_enc),
13568                 TEST_CASE_ST(ut_setup, ut_teardown,
13569                         test_snow3g_auth_cipher_part_digest_enc_oop),
13570                 TEST_CASE_ST(ut_setup, ut_teardown,
13571                         test_snow3g_auth_cipher_test_case_3_sgl),
13572                 TEST_CASE_ST(ut_setup, ut_teardown,
13573                         test_snow3g_auth_cipher_test_case_3_oop_sgl),
13574                 TEST_CASE_ST(ut_setup, ut_teardown,
13575                         test_snow3g_auth_cipher_part_digest_enc_sgl),
13576                 TEST_CASE_ST(ut_setup, ut_teardown,
13577                         test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
13578
13579                 /** SNOW 3G decrypt (UEA2), then verify auth */
13580                 TEST_CASE_ST(ut_setup, ut_teardown,
13581                         test_snow3g_auth_cipher_verify_test_case_1),
13582                 TEST_CASE_ST(ut_setup, ut_teardown,
13583                         test_snow3g_auth_cipher_verify_test_case_2),
13584                 TEST_CASE_ST(ut_setup, ut_teardown,
13585                         test_snow3g_auth_cipher_verify_test_case_2_oop),
13586                 TEST_CASE_ST(ut_setup, ut_teardown,
13587                         test_snow3g_auth_cipher_verify_part_digest_enc),
13588                 TEST_CASE_ST(ut_setup, ut_teardown,
13589                         test_snow3g_auth_cipher_verify_part_digest_enc_oop),
13590                 TEST_CASE_ST(ut_setup, ut_teardown,
13591                         test_snow3g_auth_cipher_verify_test_case_3_sgl),
13592                 TEST_CASE_ST(ut_setup, ut_teardown,
13593                         test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
13594                 TEST_CASE_ST(ut_setup, ut_teardown,
13595                         test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
13596                 TEST_CASE_ST(ut_setup, ut_teardown,
13597                         test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
13598
13599                 /** SNOW 3G decrypt only (UEA2) */
13600                 TEST_CASE_ST(ut_setup, ut_teardown,
13601                         test_snow3g_decryption_test_case_1),
13602                 TEST_CASE_ST(ut_setup, ut_teardown,
13603                         test_snow3g_decryption_test_case_2),
13604                 TEST_CASE_ST(ut_setup, ut_teardown,
13605                         test_snow3g_decryption_test_case_3),
13606                 TEST_CASE_ST(ut_setup, ut_teardown,
13607                         test_snow3g_decryption_test_case_4),
13608                 TEST_CASE_ST(ut_setup, ut_teardown,
13609                         test_snow3g_decryption_test_case_5),
13610                 TEST_CASE_ST(ut_setup, ut_teardown,
13611                         test_snow3g_decryption_with_digest_test_case_1),
13612                 TEST_CASE_ST(ut_setup, ut_teardown,
13613                         test_snow3g_hash_generate_test_case_1),
13614                 TEST_CASE_ST(ut_setup, ut_teardown,
13615                         test_snow3g_hash_generate_test_case_2),
13616                 TEST_CASE_ST(ut_setup, ut_teardown,
13617                         test_snow3g_hash_generate_test_case_3),
13618                 /* Tests with buffers which length is not byte-aligned */
13619                 TEST_CASE_ST(ut_setup, ut_teardown,
13620                         test_snow3g_hash_generate_test_case_4),
13621                 TEST_CASE_ST(ut_setup, ut_teardown,
13622                         test_snow3g_hash_generate_test_case_5),
13623                 TEST_CASE_ST(ut_setup, ut_teardown,
13624                         test_snow3g_hash_generate_test_case_6),
13625                 TEST_CASE_ST(ut_setup, ut_teardown,
13626                         test_snow3g_hash_verify_test_case_1),
13627                 TEST_CASE_ST(ut_setup, ut_teardown,
13628                         test_snow3g_hash_verify_test_case_2),
13629                 TEST_CASE_ST(ut_setup, ut_teardown,
13630                         test_snow3g_hash_verify_test_case_3),
13631                 /* Tests with buffers which length is not byte-aligned */
13632                 TEST_CASE_ST(ut_setup, ut_teardown,
13633                         test_snow3g_hash_verify_test_case_4),
13634                 TEST_CASE_ST(ut_setup, ut_teardown,
13635                         test_snow3g_hash_verify_test_case_5),
13636                 TEST_CASE_ST(ut_setup, ut_teardown,
13637                         test_snow3g_hash_verify_test_case_6),
13638                 TEST_CASE_ST(ut_setup, ut_teardown,
13639                         test_snow3g_cipher_auth_test_case_1),
13640                 TEST_CASE_ST(ut_setup, ut_teardown,
13641                         test_snow3g_auth_cipher_with_digest_test_case_1),
13642
13643                 /** ZUC encrypt only (EEA3) */
13644                 TEST_CASE_ST(ut_setup, ut_teardown,
13645                         test_zuc_encryption_test_case_1),
13646                 TEST_CASE_ST(ut_setup, ut_teardown,
13647                         test_zuc_encryption_test_case_2),
13648                 TEST_CASE_ST(ut_setup, ut_teardown,
13649                         test_zuc_encryption_test_case_3),
13650                 TEST_CASE_ST(ut_setup, ut_teardown,
13651                         test_zuc_encryption_test_case_4),
13652                 TEST_CASE_ST(ut_setup, ut_teardown,
13653                         test_zuc_encryption_test_case_5),
13654                 TEST_CASE_ST(ut_setup, ut_teardown,
13655                         test_zuc_encryption_test_case_6_sgl),
13656
13657                 /** ZUC authenticate (EIA3) */
13658                 TEST_CASE_ST(ut_setup, ut_teardown,
13659                         test_zuc_hash_generate_test_case_1),
13660                 TEST_CASE_ST(ut_setup, ut_teardown,
13661                         test_zuc_hash_generate_test_case_2),
13662                 TEST_CASE_ST(ut_setup, ut_teardown,
13663                         test_zuc_hash_generate_test_case_3),
13664                 TEST_CASE_ST(ut_setup, ut_teardown,
13665                         test_zuc_hash_generate_test_case_4),
13666                 TEST_CASE_ST(ut_setup, ut_teardown,
13667                         test_zuc_hash_generate_test_case_5),
13668                 TEST_CASE_ST(ut_setup, ut_teardown,
13669                         test_zuc_hash_generate_test_case_6),
13670                 TEST_CASE_ST(ut_setup, ut_teardown,
13671                         test_zuc_hash_generate_test_case_7),
13672                 TEST_CASE_ST(ut_setup, ut_teardown,
13673                         test_zuc_hash_generate_test_case_8),
13674
13675                 /** ZUC alg-chain (EEA3/EIA3) */
13676                 TEST_CASE_ST(ut_setup, ut_teardown,
13677                         test_zuc_cipher_auth_test_case_1),
13678                 TEST_CASE_ST(ut_setup, ut_teardown,
13679                         test_zuc_cipher_auth_test_case_2),
13680
13681                 /** ZUC generate auth, then encrypt (EEA3) */
13682                 TEST_CASE_ST(ut_setup, ut_teardown,
13683                         test_zuc_auth_cipher_test_case_1),
13684                 TEST_CASE_ST(ut_setup, ut_teardown,
13685                         test_zuc_auth_cipher_test_case_1_oop),
13686                 TEST_CASE_ST(ut_setup, ut_teardown,
13687                         test_zuc_auth_cipher_test_case_1_sgl),
13688                 TEST_CASE_ST(ut_setup, ut_teardown,
13689                         test_zuc_auth_cipher_test_case_1_oop_sgl),
13690
13691                 /** ZUC decrypt (EEA3), then verify auth */
13692                 TEST_CASE_ST(ut_setup, ut_teardown,
13693                         test_zuc_auth_cipher_verify_test_case_1),
13694                 TEST_CASE_ST(ut_setup, ut_teardown,
13695                         test_zuc_auth_cipher_verify_test_case_1_oop),
13696                 TEST_CASE_ST(ut_setup, ut_teardown,
13697                         test_zuc_auth_cipher_verify_test_case_1_sgl),
13698                 TEST_CASE_ST(ut_setup, ut_teardown,
13699                         test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
13700
13701                 /** HMAC_MD5 Authentication */
13702                 TEST_CASE_ST(ut_setup, ut_teardown,
13703                         test_MD5_HMAC_generate_case_1),
13704                 TEST_CASE_ST(ut_setup, ut_teardown,
13705                         test_MD5_HMAC_verify_case_1),
13706                 TEST_CASE_ST(ut_setup, ut_teardown,
13707                         test_MD5_HMAC_generate_case_2),
13708                 TEST_CASE_ST(ut_setup, ut_teardown,
13709                         test_MD5_HMAC_verify_case_2),
13710
13711                 /** KASUMI hash only (UIA1) */
13712                 TEST_CASE_ST(ut_setup, ut_teardown,
13713                         test_kasumi_hash_generate_test_case_1),
13714                 TEST_CASE_ST(ut_setup, ut_teardown,
13715                         test_kasumi_hash_generate_test_case_2),
13716                 TEST_CASE_ST(ut_setup, ut_teardown,
13717                         test_kasumi_hash_generate_test_case_3),
13718                 TEST_CASE_ST(ut_setup, ut_teardown,
13719                         test_kasumi_hash_generate_test_case_4),
13720                 TEST_CASE_ST(ut_setup, ut_teardown,
13721                         test_kasumi_hash_generate_test_case_5),
13722                 TEST_CASE_ST(ut_setup, ut_teardown,
13723                         test_kasumi_hash_generate_test_case_6),
13724
13725                 TEST_CASE_ST(ut_setup, ut_teardown,
13726                         test_kasumi_hash_verify_test_case_1),
13727                 TEST_CASE_ST(ut_setup, ut_teardown,
13728                         test_kasumi_hash_verify_test_case_2),
13729                 TEST_CASE_ST(ut_setup, ut_teardown,
13730                         test_kasumi_hash_verify_test_case_3),
13731                 TEST_CASE_ST(ut_setup, ut_teardown,
13732                         test_kasumi_hash_verify_test_case_4),
13733                 TEST_CASE_ST(ut_setup, ut_teardown,
13734                         test_kasumi_hash_verify_test_case_5),
13735
13736                 /** KASUMI encrypt only (UEA1) */
13737                 TEST_CASE_ST(ut_setup, ut_teardown,
13738                         test_kasumi_encryption_test_case_1),
13739                 TEST_CASE_ST(ut_setup, ut_teardown,
13740                         test_kasumi_encryption_test_case_1_sgl),
13741                 TEST_CASE_ST(ut_setup, ut_teardown,
13742                         test_kasumi_encryption_test_case_1_oop),
13743                 TEST_CASE_ST(ut_setup, ut_teardown,
13744                         test_kasumi_encryption_test_case_1_oop_sgl),
13745                 TEST_CASE_ST(ut_setup, ut_teardown,
13746                         test_kasumi_encryption_test_case_2),
13747                 TEST_CASE_ST(ut_setup, ut_teardown,
13748                         test_kasumi_encryption_test_case_3),
13749                 TEST_CASE_ST(ut_setup, ut_teardown,
13750                         test_kasumi_encryption_test_case_4),
13751                 TEST_CASE_ST(ut_setup, ut_teardown,
13752                         test_kasumi_encryption_test_case_5),
13753
13754                 /** KASUMI decrypt only (UEA1) */
13755                 TEST_CASE_ST(ut_setup, ut_teardown,
13756                         test_kasumi_decryption_test_case_1),
13757                 TEST_CASE_ST(ut_setup, ut_teardown,
13758                         test_kasumi_decryption_test_case_2),
13759                 TEST_CASE_ST(ut_setup, ut_teardown,
13760                         test_kasumi_decryption_test_case_3),
13761                 TEST_CASE_ST(ut_setup, ut_teardown,
13762                         test_kasumi_decryption_test_case_4),
13763                 TEST_CASE_ST(ut_setup, ut_teardown,
13764                         test_kasumi_decryption_test_case_5),
13765                 TEST_CASE_ST(ut_setup, ut_teardown,
13766                         test_kasumi_decryption_test_case_1_oop),
13767
13768                 TEST_CASE_ST(ut_setup, ut_teardown,
13769                         test_kasumi_cipher_auth_test_case_1),
13770
13771                 /** KASUMI generate auth, then encrypt (F8) */
13772                 TEST_CASE_ST(ut_setup, ut_teardown,
13773                         test_kasumi_auth_cipher_test_case_1),
13774                 TEST_CASE_ST(ut_setup, ut_teardown,
13775                         test_kasumi_auth_cipher_test_case_2),
13776                 TEST_CASE_ST(ut_setup, ut_teardown,
13777                         test_kasumi_auth_cipher_test_case_2_oop),
13778                 TEST_CASE_ST(ut_setup, ut_teardown,
13779                         test_kasumi_auth_cipher_test_case_2_sgl),
13780                 TEST_CASE_ST(ut_setup, ut_teardown,
13781                         test_kasumi_auth_cipher_test_case_2_oop_sgl),
13782
13783                 /** KASUMI decrypt (F8), then verify auth */
13784                 TEST_CASE_ST(ut_setup, ut_teardown,
13785                         test_kasumi_auth_cipher_verify_test_case_1),
13786                 TEST_CASE_ST(ut_setup, ut_teardown,
13787                         test_kasumi_auth_cipher_verify_test_case_2),
13788                 TEST_CASE_ST(ut_setup, ut_teardown,
13789                         test_kasumi_auth_cipher_verify_test_case_2_oop),
13790                 TEST_CASE_ST(ut_setup, ut_teardown,
13791                         test_kasumi_auth_cipher_verify_test_case_2_sgl),
13792                 TEST_CASE_ST(ut_setup, ut_teardown,
13793                         test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
13794
13795                 /** ESN Testcase */
13796                 TEST_CASE_ST(ut_setup, ut_teardown,
13797                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
13798                 TEST_CASE_ST(ut_setup, ut_teardown,
13799                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
13800
13801                 /** Negative tests */
13802                 TEST_CASE_ST(ut_setup, ut_teardown,
13803                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13804                 TEST_CASE_ST(ut_setup, ut_teardown,
13805                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13806                 TEST_CASE_ST(ut_setup, ut_teardown,
13807                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
13808                 TEST_CASE_ST(ut_setup, ut_teardown,
13809                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
13810                 TEST_CASE_ST(ut_setup, ut_teardown,
13811                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
13812                 TEST_CASE_ST(ut_setup, ut_teardown,
13813                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
13814                 TEST_CASE_ST(ut_setup, ut_teardown,
13815                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
13816                 TEST_CASE_ST(ut_setup, ut_teardown,
13817                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
13818                 TEST_CASE_ST(ut_setup, ut_teardown,
13819                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
13820                 TEST_CASE_ST(ut_setup, ut_teardown,
13821                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
13822                 TEST_CASE_ST(ut_setup, ut_teardown,
13823                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
13824                 TEST_CASE_ST(ut_setup, ut_teardown,
13825                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
13826                 TEST_CASE_ST(ut_setup, ut_teardown,
13827                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
13828                 TEST_CASE_ST(ut_setup, ut_teardown,
13829                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
13830                 TEST_CASE_ST(ut_setup, ut_teardown,
13831                         authentication_verify_AES128_GMAC_fail_data_corrupt),
13832                 TEST_CASE_ST(ut_setup, ut_teardown,
13833                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
13834                 TEST_CASE_ST(ut_setup, ut_teardown,
13835                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13836                 TEST_CASE_ST(ut_setup, ut_teardown,
13837                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13838
13839                 /** Mixed CIPHER + HASH algorithms */
13840                 /** AUTH AES CMAC + CIPHER AES CTR */
13841                 TEST_CASE_ST(ut_setup, ut_teardown,
13842                         test_aes_cmac_aes_ctr_digest_enc_test_case_1),
13843                 TEST_CASE_ST(ut_setup, ut_teardown,
13844                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13845                 TEST_CASE_ST(ut_setup, ut_teardown,
13846                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13847                 TEST_CASE_ST(ut_setup, ut_teardown,
13848                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13849                 TEST_CASE_ST(ut_setup, ut_teardown,
13850                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
13851                 TEST_CASE_ST(ut_setup, ut_teardown,
13852                        test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13853                 TEST_CASE_ST(ut_setup, ut_teardown,
13854                        test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13855                 TEST_CASE_ST(ut_setup, ut_teardown,
13856                    test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13857
13858                 /** AUTH ZUC + CIPHER SNOW3G */
13859                 TEST_CASE_ST(ut_setup, ut_teardown,
13860                         test_auth_zuc_cipher_snow_test_case_1),
13861                 TEST_CASE_ST(ut_setup, ut_teardown,
13862                         test_verify_auth_zuc_cipher_snow_test_case_1),
13863                 /** AUTH AES CMAC + CIPHER SNOW3G */
13864                 TEST_CASE_ST(ut_setup, ut_teardown,
13865                         test_auth_aes_cmac_cipher_snow_test_case_1),
13866                 TEST_CASE_ST(ut_setup, ut_teardown,
13867                         test_verify_auth_aes_cmac_cipher_snow_test_case_1),
13868                 /** AUTH ZUC + CIPHER AES CTR */
13869                 TEST_CASE_ST(ut_setup, ut_teardown,
13870                         test_auth_zuc_cipher_aes_ctr_test_case_1),
13871                 TEST_CASE_ST(ut_setup, ut_teardown,
13872                         test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
13873                 /** AUTH SNOW3G + CIPHER AES CTR */
13874                 TEST_CASE_ST(ut_setup, ut_teardown,
13875                         test_auth_snow_cipher_aes_ctr_test_case_1),
13876                 TEST_CASE_ST(ut_setup, ut_teardown,
13877                         test_verify_auth_snow_cipher_aes_ctr_test_case_1),
13878                 /** AUTH SNOW3G + CIPHER ZUC */
13879                 TEST_CASE_ST(ut_setup, ut_teardown,
13880                         test_auth_snow_cipher_zuc_test_case_1),
13881                 TEST_CASE_ST(ut_setup, ut_teardown,
13882                         test_verify_auth_snow_cipher_zuc_test_case_1),
13883                 /** AUTH AES CMAC + CIPHER ZUC */
13884                 TEST_CASE_ST(ut_setup, ut_teardown,
13885                         test_auth_aes_cmac_cipher_zuc_test_case_1),
13886                 TEST_CASE_ST(ut_setup, ut_teardown,
13887                         test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
13888
13889                 /** AUTH NULL + CIPHER SNOW3G */
13890                 TEST_CASE_ST(ut_setup, ut_teardown,
13891                         test_auth_null_cipher_snow_test_case_1),
13892                 TEST_CASE_ST(ut_setup, ut_teardown,
13893                         test_verify_auth_null_cipher_snow_test_case_1),
13894                 /** AUTH NULL + CIPHER ZUC */
13895                 TEST_CASE_ST(ut_setup, ut_teardown,
13896                         test_auth_null_cipher_zuc_test_case_1),
13897                 TEST_CASE_ST(ut_setup, ut_teardown,
13898                         test_verify_auth_null_cipher_zuc_test_case_1),
13899                 /** AUTH SNOW3G + CIPHER NULL */
13900                 TEST_CASE_ST(ut_setup, ut_teardown,
13901                         test_auth_snow_cipher_null_test_case_1),
13902                 TEST_CASE_ST(ut_setup, ut_teardown,
13903                         test_verify_auth_snow_cipher_null_test_case_1),
13904                 /** AUTH ZUC + CIPHER NULL */
13905                 TEST_CASE_ST(ut_setup, ut_teardown,
13906                         test_auth_zuc_cipher_null_test_case_1),
13907                 TEST_CASE_ST(ut_setup, ut_teardown,
13908                         test_verify_auth_zuc_cipher_null_test_case_1),
13909                 /** AUTH NULL + CIPHER AES CTR */
13910                 TEST_CASE_ST(ut_setup, ut_teardown,
13911                         test_auth_null_cipher_aes_ctr_test_case_1),
13912                 TEST_CASE_ST(ut_setup, ut_teardown,
13913                         test_verify_auth_null_cipher_aes_ctr_test_case_1),
13914                 /** AUTH AES CMAC + CIPHER NULL */
13915                 TEST_CASE_ST(ut_setup, ut_teardown,
13916                         test_auth_aes_cmac_cipher_null_test_case_1),
13917                 TEST_CASE_ST(ut_setup, ut_teardown,
13918                         test_verify_auth_aes_cmac_cipher_null_test_case_1),
13919
13920 #ifdef RTE_LIB_SECURITY
13921                 TEST_CASE_ST(ut_setup_security, ut_teardown,
13922                         test_PDCP_PROTO_all),
13923                 TEST_CASE_ST(ut_setup_security, ut_teardown,
13924                         test_DOCSIS_PROTO_all),
13925 #endif
13926                 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
13927                 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
13928                 TEST_CASES_END() /**< NULL terminate unit test array */
13929         }
13930 };
13931
13932 static struct unit_test_suite cryptodev_virtio_testsuite = {
13933         .suite_name = "Crypto VIRTIO Unit Test Suite",
13934         .setup = testsuite_setup,
13935         .teardown = testsuite_teardown,
13936         .unit_test_cases = {
13937                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13938
13939                 TEST_CASES_END() /**< NULL terminate unit test array */
13940         }
13941 };
13942
13943 static struct unit_test_suite cryptodev_caam_jr_testsuite  = {
13944         .suite_name = "Crypto CAAM JR Unit Test Suite",
13945         .setup = testsuite_setup,
13946         .teardown = testsuite_teardown,
13947         .unit_test_cases = {
13948                 TEST_CASE_ST(ut_setup, ut_teardown,
13949                              test_device_configure_invalid_dev_id),
13950                 TEST_CASE_ST(ut_setup, ut_teardown,
13951                              test_multi_session),
13952
13953                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13954                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13955                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13956                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13957                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13958
13959                 TEST_CASES_END() /**< NULL terminate unit test array */
13960         }
13961 };
13962
13963 static struct unit_test_suite cryptodev_mrvl_testsuite  = {
13964         .suite_name = "Crypto Device Marvell Component Test Suite",
13965         .setup = testsuite_setup,
13966         .teardown = testsuite_teardown,
13967         .unit_test_cases = {
13968                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13969                 TEST_CASE_ST(ut_setup, ut_teardown,
13970                                 test_multi_session_random_usage),
13971                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13972                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13973                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13974                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13975                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13976
13977                 /** Negative tests */
13978                 TEST_CASE_ST(ut_setup, ut_teardown,
13979                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13980                 TEST_CASE_ST(ut_setup, ut_teardown,
13981                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13982                 TEST_CASE_ST(ut_setup, ut_teardown,
13983                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13984                 TEST_CASE_ST(ut_setup, ut_teardown,
13985                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13986
13987                 TEST_CASES_END() /**< NULL terminate unit test array */
13988         }
13989 };
13990
13991 static struct unit_test_suite cryptodev_ccp_testsuite  = {
13992         .suite_name = "Crypto Device CCP Unit Test Suite",
13993         .setup = testsuite_setup,
13994         .teardown = testsuite_teardown,
13995         .unit_test_cases = {
13996                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13997                 TEST_CASE_ST(ut_setup, ut_teardown,
13998                                 test_multi_session_random_usage),
13999                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
14000                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
14001                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
14002                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
14003                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
14004
14005                 /** Negative tests */
14006                 TEST_CASE_ST(ut_setup, ut_teardown,
14007                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
14008                 TEST_CASE_ST(ut_setup, ut_teardown,
14009                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14010                 TEST_CASE_ST(ut_setup, ut_teardown,
14011                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14012                 TEST_CASE_ST(ut_setup, ut_teardown,
14013                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14014
14015                 TEST_CASES_END() /**< NULL terminate unit test array */
14016         }
14017 };
14018
14019 static int
14020 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
14021 {
14022         gbl_driver_id = rte_cryptodev_driver_id_get(
14023                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14024
14025         if (gbl_driver_id == -1) {
14026                 RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14027                 return TEST_SKIPPED;
14028         }
14029
14030         return unit_test_suite_runner(&cryptodev_testsuite);
14031 }
14032
14033 static int
14034 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)
14035 {
14036         gbl_driver_id = rte_cryptodev_driver_id_get(
14037                         RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
14038
14039         if (gbl_driver_id == -1) {
14040                 RTE_LOG(ERR, USER1, "VIRTIO PMD must be loaded.\n");
14041                 return TEST_FAILED;
14042         }
14043
14044         return unit_test_suite_runner(&cryptodev_virtio_testsuite);
14045 }
14046
14047 static int
14048 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
14049 {
14050         gbl_driver_id = rte_cryptodev_driver_id_get(
14051                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14052
14053         if (gbl_driver_id == -1) {
14054                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14055                 return TEST_SKIPPED;
14056         }
14057
14058         return unit_test_suite_runner(&cryptodev_testsuite);
14059 }
14060
14061 static int
14062 test_cryptodev_cpu_aesni_mb(void)
14063 {
14064         int32_t rc;
14065         enum rte_security_session_action_type at;
14066
14067         gbl_driver_id = rte_cryptodev_driver_id_get(
14068                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14069
14070         if (gbl_driver_id == -1) {
14071                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14072                 return TEST_SKIPPED;
14073         }
14074
14075         at = gbl_action_type;
14076         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14077         rc = unit_test_suite_runner(&cryptodev_testsuite);
14078         gbl_action_type = at;
14079         return rc;
14080 }
14081
14082 static int
14083 test_cryptodev_openssl(void)
14084 {
14085         gbl_driver_id = rte_cryptodev_driver_id_get(
14086                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
14087
14088         if (gbl_driver_id == -1) {
14089                 RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded.\n");
14090                 return TEST_SKIPPED;
14091         }
14092
14093         return unit_test_suite_runner(&cryptodev_testsuite);
14094 }
14095
14096 static int
14097 test_cryptodev_aesni_gcm(void)
14098 {
14099         gbl_driver_id = rte_cryptodev_driver_id_get(
14100                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14101
14102         if (gbl_driver_id == -1) {
14103                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
14104                 return TEST_SKIPPED;
14105         }
14106
14107         return unit_test_suite_runner(&cryptodev_testsuite);
14108 }
14109
14110 static int
14111 test_cryptodev_cpu_aesni_gcm(void)
14112 {
14113         int32_t rc;
14114         enum rte_security_session_action_type at;
14115
14116         gbl_driver_id = rte_cryptodev_driver_id_get(
14117                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14118
14119         if (gbl_driver_id == -1) {
14120                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
14121                 return TEST_SKIPPED;
14122         }
14123
14124         at = gbl_action_type;
14125         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14126         rc = unit_test_suite_runner(&cryptodev_testsuite);
14127         gbl_action_type = at;
14128         return rc;
14129 }
14130
14131 static int
14132 test_cryptodev_null(void)
14133 {
14134         gbl_driver_id = rte_cryptodev_driver_id_get(
14135                         RTE_STR(CRYPTODEV_NAME_NULL_PMD));
14136
14137         if (gbl_driver_id == -1) {
14138                 RTE_LOG(ERR, USER1, "NULL PMD must be loaded.\n");
14139                 return TEST_SKIPPED;
14140         }
14141
14142         return unit_test_suite_runner(&cryptodev_testsuite);
14143 }
14144
14145 static int
14146 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
14147 {
14148         gbl_driver_id = rte_cryptodev_driver_id_get(
14149                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
14150
14151         if (gbl_driver_id == -1) {
14152                 RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded.\n");
14153                 return TEST_SKIPPED;
14154         }
14155
14156         return unit_test_suite_runner(&cryptodev_testsuite);
14157 }
14158
14159 static int
14160 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
14161 {
14162         gbl_driver_id = rte_cryptodev_driver_id_get(
14163                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
14164
14165         if (gbl_driver_id == -1) {
14166                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
14167                 return TEST_SKIPPED;
14168         }
14169
14170         return unit_test_suite_runner(&cryptodev_testsuite);
14171 }
14172
14173 static int
14174 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
14175 {
14176         gbl_driver_id = rte_cryptodev_driver_id_get(
14177                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
14178
14179         if (gbl_driver_id == -1) {
14180                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
14181                 return TEST_SKIPPED;
14182         }
14183
14184         return unit_test_suite_runner(&cryptodev_testsuite);
14185 }
14186
14187 static int
14188 test_cryptodev_armv8(void)
14189 {
14190         gbl_driver_id = rte_cryptodev_driver_id_get(
14191                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
14192
14193         if (gbl_driver_id == -1) {
14194                 RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded.\n");
14195                 return TEST_SKIPPED;
14196         }
14197
14198         return unit_test_suite_runner(&cryptodev_testsuite);
14199 }
14200
14201 static int
14202 test_cryptodev_mrvl(void)
14203 {
14204         gbl_driver_id = rte_cryptodev_driver_id_get(
14205                         RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
14206
14207         if (gbl_driver_id == -1) {
14208                 RTE_LOG(ERR, USER1, "MVSAM PMD must be loaded.\n");
14209                 return TEST_SKIPPED;
14210         }
14211
14212         return unit_test_suite_runner(&cryptodev_mrvl_testsuite);
14213 }
14214
14215 #ifdef RTE_CRYPTO_SCHEDULER
14216
14217 static int
14218 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
14219 {
14220         gbl_driver_id = rte_cryptodev_driver_id_get(
14221                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14222
14223         if (gbl_driver_id == -1) {
14224                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
14225                 return TEST_SKIPPED;
14226         }
14227
14228         if (rte_cryptodev_driver_id_get(
14229                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
14230                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14231                 return TEST_SKIPPED;
14232 }
14233         return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
14234 }
14235
14236 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
14237
14238 #endif
14239
14240 static int
14241 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14242 {
14243         gbl_driver_id = rte_cryptodev_driver_id_get(
14244                         RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
14245
14246         if (gbl_driver_id == -1) {
14247                 RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded.\n");
14248                 return TEST_SKIPPED;
14249         }
14250
14251         return unit_test_suite_runner(&cryptodev_testsuite);
14252 }
14253
14254 static int
14255 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14256 {
14257         gbl_driver_id = rte_cryptodev_driver_id_get(
14258                         RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
14259
14260         if (gbl_driver_id == -1) {
14261                 RTE_LOG(ERR, USER1, "DPAA SEC PMD must be loaded.\n");
14262                 return TEST_SKIPPED;
14263         }
14264
14265         return unit_test_suite_runner(&cryptodev_testsuite);
14266 }
14267
14268 static int
14269 test_cryptodev_ccp(void)
14270 {
14271         gbl_driver_id = rte_cryptodev_driver_id_get(
14272                         RTE_STR(CRYPTODEV_NAME_CCP_PMD));
14273
14274         if (gbl_driver_id == -1) {
14275                 RTE_LOG(ERR, USER1, "CCP PMD must be loaded.\n");
14276                 return TEST_FAILED;
14277         }
14278
14279         return unit_test_suite_runner(&cryptodev_ccp_testsuite);
14280 }
14281
14282 static int
14283 test_cryptodev_octeontx(void)
14284 {
14285         gbl_driver_id = rte_cryptodev_driver_id_get(
14286                         RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
14287         if (gbl_driver_id == -1) {
14288                 RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded.\n");
14289                 return TEST_FAILED;
14290         }
14291         return unit_test_suite_runner(&cryptodev_testsuite);
14292 }
14293
14294 static int
14295 test_cryptodev_octeontx2(void)
14296 {
14297         gbl_driver_id = rte_cryptodev_driver_id_get(
14298                         RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
14299         if (gbl_driver_id == -1) {
14300                 RTE_LOG(ERR, USER1, "OCTEON TX2 PMD must be loaded.\n");
14301                 return TEST_FAILED;
14302         }
14303         return unit_test_suite_runner(&cryptodev_testsuite);
14304 }
14305
14306 static int
14307 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)
14308 {
14309         gbl_driver_id = rte_cryptodev_driver_id_get(
14310                         RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
14311
14312         if (gbl_driver_id == -1) {
14313                 RTE_LOG(ERR, USER1, "CAAM_JR PMD must be loaded.\n");
14314                 return TEST_FAILED;
14315         }
14316
14317         return unit_test_suite_runner(&cryptodev_caam_jr_testsuite);
14318 }
14319
14320 static int
14321 test_cryptodev_nitrox(void)
14322 {
14323         gbl_driver_id = rte_cryptodev_driver_id_get(
14324                         RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
14325
14326         if (gbl_driver_id == -1) {
14327                 RTE_LOG(ERR, USER1, "NITROX PMD must be loaded.\n");
14328                 return TEST_FAILED;
14329         }
14330
14331         return unit_test_suite_runner(&cryptodev_testsuite);
14332 }
14333
14334 static int
14335 test_cryptodev_bcmfs(void)
14336 {
14337         gbl_driver_id = rte_cryptodev_driver_id_get(
14338                         RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
14339
14340         if (gbl_driver_id == -1) {
14341                 RTE_LOG(ERR, USER1, "BCMFS PMD must be loaded.\n");
14342                 return TEST_FAILED;
14343         }
14344
14345         return unit_test_suite_runner(&cryptodev_testsuite);
14346 }
14347
14348 static int
14349 test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/)
14350 {
14351         int ret;
14352
14353         gbl_driver_id = rte_cryptodev_driver_id_get(
14354                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14355
14356         if (gbl_driver_id == -1) {
14357                 RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14358                 return TEST_SKIPPED;
14359         }
14360
14361         global_api_test_type = CRYPTODEV_RAW_API_TEST;
14362         ret = unit_test_suite_runner(&cryptodev_testsuite);
14363         global_api_test_type = CRYPTODEV_API_TEST;
14364
14365         return ret;
14366 }
14367
14368 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
14369                 test_cryptodev_qat_raw_api);
14370 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
14371 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
14372 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
14373         test_cryptodev_cpu_aesni_mb);
14374 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
14375 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
14376 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
14377         test_cryptodev_cpu_aesni_gcm);
14378 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
14379 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
14380 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
14381 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
14382 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
14383 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
14384 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
14385 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
14386 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
14387 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
14388 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
14389 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
14390 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
14391 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
14392 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);