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