32e64e2dd1fd2f02ac1fce95fd3f26b9302143af
[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 void
166 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,
167                 uint8_t is_op_success)
168 {
169         struct rte_crypto_op *op = user_data;
170         op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
171                         RTE_CRYPTO_OP_STATUS_ERROR;
172 }
173
174 void
175 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
176                 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
177                 uint8_t len_in_bits, uint8_t cipher_iv_len)
178 {
179         struct rte_crypto_sym_op *sop = op->sym;
180         struct rte_crypto_op *ret_op = NULL;
181         struct rte_crypto_vec data_vec[UINT8_MAX];
182         struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
183         union rte_crypto_sym_ofs ofs;
184         struct rte_crypto_sym_vec vec;
185         struct rte_crypto_sgl sgl;
186         uint32_t max_len;
187         union rte_cryptodev_session_ctx sess;
188         uint32_t count = 0;
189         struct rte_crypto_raw_dp_ctx *ctx;
190         uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
191                         auth_len = 0;
192         int32_t n;
193         uint32_t n_success;
194         int ctx_service_size;
195         int32_t status = 0;
196         int enqueue_status, dequeue_status;
197
198         ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
199         if (ctx_service_size < 0) {
200                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
201                 return;
202         }
203
204         ctx = malloc(ctx_service_size);
205         if (!ctx) {
206                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
207                 return;
208         }
209
210         /* Both are enums, setting crypto_sess will suit any session type */
211         sess.crypto_sess = op->sym->session;
212
213         if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
214                         op->sess_type, sess, 0) < 0) {
215                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
216                 goto exit;
217         }
218
219         cipher_iv.iova = 0;
220         cipher_iv.va = NULL;
221         aad_auth_iv.iova = 0;
222         aad_auth_iv.va = NULL;
223         digest.iova = 0;
224         digest.va = NULL;
225         sgl.vec = data_vec;
226         vec.num = 1;
227         vec.sgl = &sgl;
228         vec.iv = &cipher_iv;
229         vec.digest = &digest;
230         vec.aad = &aad_auth_iv;
231         vec.status = &status;
232
233         ofs.raw = 0;
234
235         if (is_cipher && is_auth) {
236                 cipher_offset = sop->cipher.data.offset;
237                 cipher_len = sop->cipher.data.length;
238                 auth_offset = sop->auth.data.offset;
239                 auth_len = sop->auth.data.length;
240                 max_len = RTE_MAX(cipher_offset + cipher_len,
241                                 auth_offset + auth_len);
242                 if (len_in_bits) {
243                         max_len = max_len >> 3;
244                         cipher_offset = cipher_offset >> 3;
245                         auth_offset = auth_offset >> 3;
246                         cipher_len = cipher_len >> 3;
247                         auth_len = auth_len >> 3;
248                 }
249                 ofs.ofs.cipher.head = cipher_offset;
250                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
251                 ofs.ofs.auth.head = auth_offset;
252                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
253                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
254                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
255                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
256                                 op, void *, IV_OFFSET + cipher_iv_len);
257                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
258                                 cipher_iv_len);
259                 digest.va = (void *)sop->auth.digest.data;
260                 digest.iova = sop->auth.digest.phys_addr;
261
262         } else if (is_cipher) {
263                 cipher_offset = sop->cipher.data.offset;
264                 cipher_len = sop->cipher.data.length;
265                 max_len = cipher_len + cipher_offset;
266                 if (len_in_bits) {
267                         max_len = max_len >> 3;
268                         cipher_offset = cipher_offset >> 3;
269                         cipher_len = cipher_len >> 3;
270                 }
271                 ofs.ofs.cipher.head = cipher_offset;
272                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
273                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
274                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
275
276         } else if (is_auth) {
277                 auth_offset = sop->auth.data.offset;
278                 auth_len = sop->auth.data.length;
279                 max_len = auth_len + auth_offset;
280                 if (len_in_bits) {
281                         max_len = max_len >> 3;
282                         auth_offset = auth_offset >> 3;
283                         auth_len = auth_len >> 3;
284                 }
285                 ofs.ofs.auth.head = auth_offset;
286                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
287                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
288                                 op, void *, IV_OFFSET + cipher_iv_len);
289                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
290                                 cipher_iv_len);
291                 digest.va = (void *)sop->auth.digest.data;
292                 digest.iova = sop->auth.digest.phys_addr;
293
294         } else { /* aead */
295                 cipher_offset = sop->aead.data.offset;
296                 cipher_len = sop->aead.data.length;
297                 max_len = cipher_len + cipher_offset;
298                 if (len_in_bits) {
299                         max_len = max_len >> 3;
300                         cipher_offset = cipher_offset >> 3;
301                         cipher_len = cipher_len >> 3;
302                 }
303                 ofs.ofs.cipher.head = cipher_offset;
304                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
305                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
306                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
307                 aad_auth_iv.va = (void *)sop->aead.aad.data;
308                 aad_auth_iv.iova = sop->aead.aad.phys_addr;
309                 digest.va = (void *)sop->aead.digest.data;
310                 digest.iova = sop->aead.digest.phys_addr;
311         }
312
313         n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
314                         data_vec, RTE_DIM(data_vec));
315         if (n < 0 || n > sop->m_src->nb_segs) {
316                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
317                 goto exit;
318         }
319
320         sgl.num = n;
321
322         if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
323                         &enqueue_status) < 1) {
324                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
325                 goto exit;
326         }
327
328         if (enqueue_status == 0) {
329                 status = rte_cryptodev_raw_enqueue_done(ctx, 1);
330                 if (status < 0) {
331                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
332                         goto exit;
333                 }
334         } else if (enqueue_status < 0) {
335                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
336                 goto exit;
337         }
338
339         n = n_success = 0;
340         while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
341                 n = rte_cryptodev_raw_dequeue_burst(ctx,
342                         NULL, 1, post_process_raw_dp_op,
343                                 (void **)&ret_op, 0, &n_success,
344                                 &dequeue_status);
345                 if (dequeue_status < 0) {
346                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
347                         goto exit;
348                 }
349                 if (n == 0)
350                         rte_pause();
351         }
352
353         if (n == 1 && dequeue_status == 0) {
354                 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
355                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
356                         goto exit;
357                 }
358         }
359
360         op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
361                         n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
362                                         RTE_CRYPTO_OP_STATUS_SUCCESS;
363
364 exit:
365         free(ctx);
366 }
367
368 static void
369 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
370 {
371         int32_t n, st;
372         struct rte_crypto_sym_op *sop;
373         union rte_crypto_sym_ofs ofs;
374         struct rte_crypto_sgl sgl;
375         struct rte_crypto_sym_vec symvec;
376         struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
377         struct rte_crypto_vec vec[UINT8_MAX];
378
379         sop = op->sym;
380
381         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
382                 sop->aead.data.length, vec, RTE_DIM(vec));
383
384         if (n < 0 || n != sop->m_src->nb_segs) {
385                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
386                 return;
387         }
388
389         sgl.vec = vec;
390         sgl.num = n;
391         symvec.sgl = &sgl;
392         symvec.iv = &iv_ptr;
393         symvec.digest = &digest_ptr;
394         symvec.aad = &aad_ptr;
395         symvec.status = &st;
396         symvec.num = 1;
397
398         /* for CPU crypto the IOVA address is not required */
399         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
400         digest_ptr.va = (void *)sop->aead.digest.data;
401         aad_ptr.va = (void *)sop->aead.aad.data;
402
403         ofs.raw = 0;
404
405         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
406                 &symvec);
407
408         if (n != 1)
409                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
410         else
411                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
412 }
413
414 static void
415 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
416 {
417         int32_t n, st;
418         struct rte_crypto_sym_op *sop;
419         union rte_crypto_sym_ofs ofs;
420         struct rte_crypto_sgl sgl;
421         struct rte_crypto_sym_vec symvec;
422         struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
423         struct rte_crypto_vec vec[UINT8_MAX];
424
425         sop = op->sym;
426
427         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
428                 sop->auth.data.length, vec, RTE_DIM(vec));
429
430         if (n < 0 || n != sop->m_src->nb_segs) {
431                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
432                 return;
433         }
434
435         sgl.vec = vec;
436         sgl.num = n;
437         symvec.sgl = &sgl;
438         symvec.iv = &iv_ptr;
439         symvec.digest = &digest_ptr;
440         symvec.status = &st;
441         symvec.num = 1;
442
443         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
444         digest_ptr.va = (void *)sop->auth.digest.data;
445
446         ofs.raw = 0;
447         ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
448         ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
449                 (sop->cipher.data.offset + sop->cipher.data.length);
450
451         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
452                 &symvec);
453
454         if (n != 1)
455                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
456         else
457                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
458 }
459
460 static struct rte_crypto_op *
461 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
462 {
463
464         RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
465
466         if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
467                 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
468                 return NULL;
469         }
470
471         op = NULL;
472
473         while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
474                 rte_pause();
475
476         if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
477                 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
478                 return NULL;
479         }
480
481         return op;
482 }
483
484 static struct crypto_testsuite_params testsuite_params = { NULL };
485 static struct crypto_unittest_params unittest_params;
486
487 static int
488 testsuite_setup(void)
489 {
490         struct crypto_testsuite_params *ts_params = &testsuite_params;
491         struct rte_cryptodev_info info;
492         uint32_t i = 0, nb_devs, dev_id;
493         int ret;
494         uint16_t qp_id;
495
496         memset(ts_params, 0, sizeof(*ts_params));
497
498         ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
499         if (ts_params->mbuf_pool == NULL) {
500                 /* Not already created so create */
501                 ts_params->mbuf_pool = rte_pktmbuf_pool_create(
502                                 "CRYPTO_MBUFPOOL",
503                                 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
504                                 rte_socket_id());
505                 if (ts_params->mbuf_pool == NULL) {
506                         RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
507                         return TEST_FAILED;
508                 }
509         }
510
511         ts_params->large_mbuf_pool = rte_mempool_lookup(
512                         "CRYPTO_LARGE_MBUFPOOL");
513         if (ts_params->large_mbuf_pool == NULL) {
514                 /* Not already created so create */
515                 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
516                                 "CRYPTO_LARGE_MBUFPOOL",
517                                 1, 0, 0, UINT16_MAX,
518                                 rte_socket_id());
519                 if (ts_params->large_mbuf_pool == NULL) {
520                         RTE_LOG(ERR, USER1,
521                                 "Can't create CRYPTO_LARGE_MBUFPOOL\n");
522                         return TEST_FAILED;
523                 }
524         }
525
526         ts_params->op_mpool = rte_crypto_op_pool_create(
527                         "MBUF_CRYPTO_SYM_OP_POOL",
528                         RTE_CRYPTO_OP_TYPE_SYMMETRIC,
529                         NUM_MBUFS, MBUF_CACHE_SIZE,
530                         DEFAULT_NUM_XFORMS *
531                         sizeof(struct rte_crypto_sym_xform) +
532                         MAXIMUM_IV_LENGTH,
533                         rte_socket_id());
534         if (ts_params->op_mpool == NULL) {
535                 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
536                 return TEST_FAILED;
537         }
538
539         /* Create an AESNI MB device if required */
540         if (gbl_driver_id == rte_cryptodev_driver_id_get(
541                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) {
542                 nb_devs = rte_cryptodev_device_count_by_driver(
543                                 rte_cryptodev_driver_id_get(
544                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
545                 if (nb_devs < 1) {
546                         ret = rte_vdev_init(
547                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);
548
549                         TEST_ASSERT(ret == 0,
550                                 "Failed to create instance of"
551                                 " pmd : %s",
552                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
553                 }
554         }
555
556         /* Create an AESNI GCM device if required */
557         if (gbl_driver_id == rte_cryptodev_driver_id_get(
558                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) {
559                 nb_devs = rte_cryptodev_device_count_by_driver(
560                                 rte_cryptodev_driver_id_get(
561                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)));
562                 if (nb_devs < 1) {
563                         TEST_ASSERT_SUCCESS(rte_vdev_init(
564                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL),
565                                 "Failed to create instance of"
566                                 " pmd : %s",
567                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
568                 }
569         }
570
571         /* Create a SNOW 3G device if required */
572         if (gbl_driver_id == rte_cryptodev_driver_id_get(
573                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) {
574                 nb_devs = rte_cryptodev_device_count_by_driver(
575                                 rte_cryptodev_driver_id_get(
576                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)));
577                 if (nb_devs < 1) {
578                         TEST_ASSERT_SUCCESS(rte_vdev_init(
579                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL),
580                                 "Failed to create instance of"
581                                 " pmd : %s",
582                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
583                 }
584         }
585
586         /* Create a KASUMI device if required */
587         if (gbl_driver_id == rte_cryptodev_driver_id_get(
588                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))) {
589                 nb_devs = rte_cryptodev_device_count_by_driver(
590                                 rte_cryptodev_driver_id_get(
591                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)));
592                 if (nb_devs < 1) {
593                         TEST_ASSERT_SUCCESS(rte_vdev_init(
594                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL),
595                                 "Failed to create instance of"
596                                 " pmd : %s",
597                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
598                 }
599         }
600
601         /* Create a ZUC device if required */
602         if (gbl_driver_id == rte_cryptodev_driver_id_get(
603                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) {
604                 nb_devs = rte_cryptodev_device_count_by_driver(
605                                 rte_cryptodev_driver_id_get(
606                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD)));
607                 if (nb_devs < 1) {
608                         TEST_ASSERT_SUCCESS(rte_vdev_init(
609                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL),
610                                 "Failed to create instance of"
611                                 " pmd : %s",
612                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
613                 }
614         }
615
616         /* Create a NULL device if required */
617         if (gbl_driver_id == rte_cryptodev_driver_id_get(
618                         RTE_STR(CRYPTODEV_NAME_NULL_PMD))) {
619                 nb_devs = rte_cryptodev_device_count_by_driver(
620                                 rte_cryptodev_driver_id_get(
621                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD)));
622                 if (nb_devs < 1) {
623                         ret = rte_vdev_init(
624                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL);
625
626                         TEST_ASSERT(ret == 0,
627                                 "Failed to create instance of"
628                                 " pmd : %s",
629                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD));
630                 }
631         }
632
633         /* Create an OPENSSL device if required */
634         if (gbl_driver_id == rte_cryptodev_driver_id_get(
635                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) {
636                 nb_devs = rte_cryptodev_device_count_by_driver(
637                                 rte_cryptodev_driver_id_get(
638                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)));
639                 if (nb_devs < 1) {
640                         ret = rte_vdev_init(
641                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),
642                                 NULL);
643
644                         TEST_ASSERT(ret == 0, "Failed to create "
645                                 "instance of pmd : %s",
646                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
647                 }
648         }
649
650         /* Create a ARMv8 device if required */
651         if (gbl_driver_id == rte_cryptodev_driver_id_get(
652                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) {
653                 nb_devs = rte_cryptodev_device_count_by_driver(
654                                 rte_cryptodev_driver_id_get(
655                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)));
656                 if (nb_devs < 1) {
657                         ret = rte_vdev_init(
658                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD),
659                                 NULL);
660
661                         TEST_ASSERT(ret == 0, "Failed to create "
662                                 "instance of pmd : %s",
663                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
664                 }
665         }
666
667         /* Create a MVSAM device if required */
668         if (gbl_driver_id == rte_cryptodev_driver_id_get(
669                         RTE_STR(CRYPTODEV_NAME_MVSAM_PMD))) {
670                 nb_devs = rte_cryptodev_device_count_by_driver(
671                                 rte_cryptodev_driver_id_get(
672                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)));
673                 if (nb_devs < 1) {
674                         ret = rte_vdev_init(
675                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD),
676                                 NULL);
677
678                         TEST_ASSERT(ret == 0, "Failed to create "
679                                 "instance of pmd : %s",
680                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
681                 }
682         }
683
684         /* Create an CCP device if required */
685         if (gbl_driver_id == rte_cryptodev_driver_id_get(
686                         RTE_STR(CRYPTODEV_NAME_CCP_PMD))) {
687                 nb_devs = rte_cryptodev_device_count_by_driver(
688                                 rte_cryptodev_driver_id_get(
689                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD)));
690                 if (nb_devs < 1) {
691                         ret = rte_vdev_init(
692                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD),
693                                 NULL);
694
695                         TEST_ASSERT(ret == 0, "Failed to create "
696                                 "instance of pmd : %s",
697                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD));
698                 }
699         }
700
701 #ifdef RTE_CRYPTO_SCHEDULER
702         char vdev_args[VDEV_ARGS_SIZE] = {""};
703         char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
704                 "ordering=enable,name=cryptodev_test_scheduler,corelist="};
705         uint16_t worker_core_count = 0;
706         uint16_t socket_id = 0;
707
708         if (gbl_driver_id == rte_cryptodev_driver_id_get(
709                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
710
711                 /* Identify the Worker Cores
712                  * Use 2 worker cores for the device args
713                  */
714                 RTE_LCORE_FOREACH_WORKER(i) {
715                         if (worker_core_count > 1)
716                                 break;
717                         snprintf(vdev_args, sizeof(vdev_args),
718                                         "%s%d", temp_str, i);
719                         strcpy(temp_str, vdev_args);
720                         strlcat(temp_str, ";", sizeof(temp_str));
721                         worker_core_count++;
722                         socket_id = rte_lcore_to_socket_id(i);
723                 }
724                 if (worker_core_count != 2) {
725                         RTE_LOG(ERR, USER1,
726                                 "Cryptodev scheduler test require at least "
727                                 "two worker cores to run. "
728                                 "Please use the correct coremask.\n");
729                         return TEST_FAILED;
730                 }
731                 strcpy(temp_str, vdev_args);
732                 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
733                                 temp_str, socket_id);
734                 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
735                 nb_devs = rte_cryptodev_device_count_by_driver(
736                                 rte_cryptodev_driver_id_get(
737                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
738                 if (nb_devs < 1) {
739                         ret = rte_vdev_init(
740                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
741                                         vdev_args);
742                         TEST_ASSERT(ret == 0,
743                                 "Failed to create instance %u of"
744                                 " pmd : %s",
745                                 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
746                 }
747         }
748 #endif /* RTE_CRYPTO_SCHEDULER */
749
750         nb_devs = rte_cryptodev_count();
751         if (nb_devs < 1) {
752                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
753                 return TEST_SKIPPED;
754         }
755
756         /* Create list of valid crypto devs */
757         for (i = 0; i < nb_devs; i++) {
758                 rte_cryptodev_info_get(i, &info);
759                 if (info.driver_id == gbl_driver_id)
760                         ts_params->valid_devs[ts_params->valid_dev_count++] = i;
761         }
762
763         if (ts_params->valid_dev_count < 1)
764                 return TEST_FAILED;
765
766         /* Set up all the qps on the first of the valid devices found */
767
768         dev_id = ts_params->valid_devs[0];
769
770         rte_cryptodev_info_get(dev_id, &info);
771
772         ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
773         ts_params->conf.socket_id = SOCKET_ID_ANY;
774         ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
775
776         unsigned int session_size =
777                 rte_cryptodev_sym_get_private_session_size(dev_id);
778
779 #ifdef RTE_LIB_SECURITY
780         unsigned int security_session_size = rte_security_session_get_size(
781                         rte_cryptodev_get_sec_ctx(dev_id));
782
783         if (session_size < security_session_size)
784                 session_size = security_session_size;
785 #endif
786         /*
787          * Create mempool with maximum number of sessions.
788          */
789         if (info.sym.max_nb_sessions != 0 &&
790                         info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
791                 RTE_LOG(ERR, USER1, "Device does not support "
792                                 "at least %u sessions\n",
793                                 MAX_NB_SESSIONS);
794                 return TEST_FAILED;
795         }
796
797         ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
798                         "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
799                         SOCKET_ID_ANY);
800         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
801                         "session mempool allocation failed");
802
803         ts_params->session_priv_mpool = rte_mempool_create(
804                         "test_sess_mp_priv",
805                         MAX_NB_SESSIONS,
806                         session_size,
807                         0, 0, NULL, NULL, NULL,
808                         NULL, SOCKET_ID_ANY,
809                         0);
810         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
811                         "session mempool allocation failed");
812
813
814
815         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
816                         &ts_params->conf),
817                         "Failed to configure cryptodev %u with %u qps",
818                         dev_id, ts_params->conf.nb_queue_pairs);
819
820         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
821         ts_params->qp_conf.mp_session = ts_params->session_mpool;
822         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
823
824         for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
825                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
826                         dev_id, qp_id, &ts_params->qp_conf,
827                         rte_cryptodev_socket_id(dev_id)),
828                         "Failed to setup queue pair %u on cryptodev %u",
829                         qp_id, dev_id);
830         }
831
832         return TEST_SUCCESS;
833 }
834
835 static void
836 testsuite_teardown(void)
837 {
838         struct crypto_testsuite_params *ts_params = &testsuite_params;
839         int res;
840
841         if (ts_params->mbuf_pool != NULL) {
842                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
843                 rte_mempool_avail_count(ts_params->mbuf_pool));
844         }
845
846         if (ts_params->op_mpool != NULL) {
847                 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
848                 rte_mempool_avail_count(ts_params->op_mpool));
849         }
850
851         /* Free session mempools */
852         if (ts_params->session_priv_mpool != NULL) {
853                 rte_mempool_free(ts_params->session_priv_mpool);
854                 ts_params->session_priv_mpool = NULL;
855         }
856
857         if (ts_params->session_mpool != NULL) {
858                 rte_mempool_free(ts_params->session_mpool);
859                 ts_params->session_mpool = NULL;
860         }
861
862         res = rte_cryptodev_close(ts_params->valid_devs[0]);
863         if (res)
864                 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
865 }
866
867 static int
868 dev_configure_and_start(uint64_t ff_disable)
869 {
870         struct crypto_testsuite_params *ts_params = &testsuite_params;
871         struct crypto_unittest_params *ut_params = &unittest_params;
872
873         uint16_t qp_id;
874
875         /* Clear unit test parameters before running test */
876         memset(ut_params, 0, sizeof(*ut_params));
877
878         /* Reconfigure device to default parameters */
879         ts_params->conf.socket_id = SOCKET_ID_ANY;
880         ts_params->conf.ff_disable = ff_disable;
881         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
882         ts_params->qp_conf.mp_session = ts_params->session_mpool;
883         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
884
885         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
886                         &ts_params->conf),
887                         "Failed to configure cryptodev %u",
888                         ts_params->valid_devs[0]);
889
890         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
891                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
892                         ts_params->valid_devs[0], qp_id,
893                         &ts_params->qp_conf,
894                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
895                         "Failed to setup queue pair %u on cryptodev %u",
896                         qp_id, ts_params->valid_devs[0]);
897         }
898
899
900         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
901
902         /* Start the device */
903         TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
904                         "Failed to start cryptodev %u",
905                         ts_params->valid_devs[0]);
906
907         return TEST_SUCCESS;
908 }
909
910 static int
911 ut_setup(void)
912 {
913         /* Configure and start the device with security feature disabled */
914         return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
915 }
916
917 static int
918 ut_setup_security(void)
919 {
920         /* Configure and start the device with no features disabled */
921         return dev_configure_and_start(0);
922 }
923
924 static void
925 ut_teardown(void)
926 {
927         struct crypto_testsuite_params *ts_params = &testsuite_params;
928         struct crypto_unittest_params *ut_params = &unittest_params;
929         struct rte_cryptodev_stats stats;
930
931         /* free crypto session structure */
932 #ifdef RTE_LIB_SECURITY
933         if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
934                 if (ut_params->sec_session) {
935                         rte_security_session_destroy(rte_cryptodev_get_sec_ctx
936                                                 (ts_params->valid_devs[0]),
937                                                 ut_params->sec_session);
938                         ut_params->sec_session = NULL;
939                 }
940         } else
941 #endif
942         {
943                 if (ut_params->sess) {
944                         rte_cryptodev_sym_session_clear(
945                                         ts_params->valid_devs[0],
946                                         ut_params->sess);
947                         rte_cryptodev_sym_session_free(ut_params->sess);
948                         ut_params->sess = NULL;
949                 }
950         }
951
952         /* free crypto operation structure */
953         if (ut_params->op)
954                 rte_crypto_op_free(ut_params->op);
955
956         /*
957          * free mbuf - both obuf and ibuf are usually the same,
958          * so check if they point at the same address is necessary,
959          * to avoid freeing the mbuf twice.
960          */
961         if (ut_params->obuf) {
962                 rte_pktmbuf_free(ut_params->obuf);
963                 if (ut_params->ibuf == ut_params->obuf)
964                         ut_params->ibuf = 0;
965                 ut_params->obuf = 0;
966         }
967         if (ut_params->ibuf) {
968                 rte_pktmbuf_free(ut_params->ibuf);
969                 ut_params->ibuf = 0;
970         }
971
972         if (ts_params->mbuf_pool != NULL)
973                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
974                         rte_mempool_avail_count(ts_params->mbuf_pool));
975
976         rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
977
978         /* Stop the device */
979         rte_cryptodev_stop(ts_params->valid_devs[0]);
980 }
981
982 static int
983 test_device_configure_invalid_dev_id(void)
984 {
985         struct crypto_testsuite_params *ts_params = &testsuite_params;
986         uint16_t dev_id, num_devs = 0;
987
988         TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
989                         "Need at least %d devices for test", 1);
990
991         /* valid dev_id values */
992         dev_id = ts_params->valid_devs[0];
993
994         /* Stop the device in case it's started so it can be configured */
995         rte_cryptodev_stop(dev_id);
996
997         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
998                         "Failed test for rte_cryptodev_configure: "
999                         "invalid dev_num %u", dev_id);
1000
1001         /* invalid dev_id values */
1002         dev_id = num_devs;
1003
1004         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1005                         "Failed test for rte_cryptodev_configure: "
1006                         "invalid dev_num %u", dev_id);
1007
1008         dev_id = 0xff;
1009
1010         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1011                         "Failed test for rte_cryptodev_configure:"
1012                         "invalid dev_num %u", dev_id);
1013
1014         return TEST_SUCCESS;
1015 }
1016
1017 static int
1018 test_device_configure_invalid_queue_pair_ids(void)
1019 {
1020         struct crypto_testsuite_params *ts_params = &testsuite_params;
1021         uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1022
1023         /* Stop the device in case it's started so it can be configured */
1024         rte_cryptodev_stop(ts_params->valid_devs[0]);
1025
1026         /* valid - max value queue pairs */
1027         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1028
1029         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1030                         &ts_params->conf),
1031                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1032                         ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1033
1034         /* valid - one queue pairs */
1035         ts_params->conf.nb_queue_pairs = 1;
1036
1037         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1038                         &ts_params->conf),
1039                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1040                         ts_params->valid_devs[0],
1041                         ts_params->conf.nb_queue_pairs);
1042
1043
1044         /* invalid - zero queue pairs */
1045         ts_params->conf.nb_queue_pairs = 0;
1046
1047         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1048                         &ts_params->conf),
1049                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1050                         " invalid qps: %u",
1051                         ts_params->valid_devs[0],
1052                         ts_params->conf.nb_queue_pairs);
1053
1054
1055         /* invalid - max value supported by field queue pairs */
1056         ts_params->conf.nb_queue_pairs = UINT16_MAX;
1057
1058         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1059                         &ts_params->conf),
1060                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1061                         " invalid qps: %u",
1062                         ts_params->valid_devs[0],
1063                         ts_params->conf.nb_queue_pairs);
1064
1065
1066         /* invalid - max value + 1 queue pairs */
1067         ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1068
1069         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1070                         &ts_params->conf),
1071                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1072                         " invalid qps: %u",
1073                         ts_params->valid_devs[0],
1074                         ts_params->conf.nb_queue_pairs);
1075
1076         /* revert to original testsuite value */
1077         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1078
1079         return TEST_SUCCESS;
1080 }
1081
1082 static int
1083 test_queue_pair_descriptor_setup(void)
1084 {
1085         struct crypto_testsuite_params *ts_params = &testsuite_params;
1086         struct rte_cryptodev_qp_conf qp_conf = {
1087                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
1088         };
1089         uint16_t qp_id;
1090
1091         /* Stop the device in case it's started so it can be configured */
1092         rte_cryptodev_stop(ts_params->valid_devs[0]);
1093
1094         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1095                         &ts_params->conf),
1096                         "Failed to configure cryptodev %u",
1097                         ts_params->valid_devs[0]);
1098
1099         /*
1100          * Test various ring sizes on this device. memzones can't be
1101          * freed so are re-used if ring is released and re-created.
1102          */
1103         qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1104         qp_conf.mp_session = ts_params->session_mpool;
1105         qp_conf.mp_session_private = ts_params->session_priv_mpool;
1106
1107         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1108                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1109                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1110                                 rte_cryptodev_socket_id(
1111                                                 ts_params->valid_devs[0])),
1112                                 "Failed test for "
1113                                 "rte_cryptodev_queue_pair_setup: num_inflights "
1114                                 "%u on qp %u on cryptodev %u",
1115                                 qp_conf.nb_descriptors, qp_id,
1116                                 ts_params->valid_devs[0]);
1117         }
1118
1119         qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1120
1121         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1122                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1123                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1124                                 rte_cryptodev_socket_id(
1125                                                 ts_params->valid_devs[0])),
1126                                 "Failed test for"
1127                                 " rte_cryptodev_queue_pair_setup: num_inflights"
1128                                 " %u on qp %u on cryptodev %u",
1129                                 qp_conf.nb_descriptors, qp_id,
1130                                 ts_params->valid_devs[0]);
1131         }
1132
1133         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1134
1135         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1136                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1137                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1138                                 rte_cryptodev_socket_id(
1139                                                 ts_params->valid_devs[0])),
1140                                 "Failed test for "
1141                                 "rte_cryptodev_queue_pair_setup: num_inflights"
1142                                 " %u on qp %u on cryptodev %u",
1143                                 qp_conf.nb_descriptors, qp_id,
1144                                 ts_params->valid_devs[0]);
1145         }
1146
1147         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1148
1149         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1150                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1151                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1152                                 rte_cryptodev_socket_id(
1153                                                 ts_params->valid_devs[0])),
1154                                 "Failed test for"
1155                                 " rte_cryptodev_queue_pair_setup:"
1156                                 "num_inflights %u on qp %u on cryptodev %u",
1157                                 qp_conf.nb_descriptors, qp_id,
1158                                 ts_params->valid_devs[0]);
1159         }
1160
1161         /* test invalid queue pair id */
1162         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;      /*valid */
1163
1164         qp_id = ts_params->conf.nb_queue_pairs;         /*invalid */
1165
1166         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1167                         ts_params->valid_devs[0],
1168                         qp_id, &qp_conf,
1169                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1170                         "Failed test for rte_cryptodev_queue_pair_setup:"
1171                         "invalid qp %u on cryptodev %u",
1172                         qp_id, ts_params->valid_devs[0]);
1173
1174         qp_id = 0xffff; /*invalid*/
1175
1176         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1177                         ts_params->valid_devs[0],
1178                         qp_id, &qp_conf,
1179                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1180                         "Failed test for rte_cryptodev_queue_pair_setup:"
1181                         "invalid qp %u on cryptodev %u",
1182                         qp_id, ts_params->valid_devs[0]);
1183
1184         return TEST_SUCCESS;
1185 }
1186
1187 /* ***** Plaintext data for tests ***** */
1188
1189 const char catch_22_quote_1[] =
1190                 "There was only one catch and that was Catch-22, which "
1191                 "specified that a concern for one's safety in the face of "
1192                 "dangers that were real and immediate was the process of a "
1193                 "rational mind. Orr was crazy and could be grounded. All he "
1194                 "had to do was ask; and as soon as he did, he would no longer "
1195                 "be crazy and would have to fly more missions. Orr would be "
1196                 "crazy to fly more missions and sane if he didn't, but if he "
1197                 "was sane he had to fly them. If he flew them he was crazy "
1198                 "and didn't have to; but if he didn't want to he was sane and "
1199                 "had to. Yossarian was moved very deeply by the absolute "
1200                 "simplicity of this clause of Catch-22 and let out a "
1201                 "respectful whistle. \"That's some catch, that Catch-22\", he "
1202                 "observed. \"It's the best there is,\" Doc Daneeka agreed.";
1203
1204 const char catch_22_quote[] =
1205                 "What a lousy earth! He wondered how many people were "
1206                 "destitute that same night even in his own prosperous country, "
1207                 "how many homes were shanties, how many husbands were drunk "
1208                 "and wives socked, and how many children were bullied, abused, "
1209                 "or abandoned. How many families hungered for food they could "
1210                 "not afford to buy? How many hearts were broken? How many "
1211                 "suicides would take place that same night, how many people "
1212                 "would go insane? How many cockroaches and landlords would "
1213                 "triumph? How many winners were losers, successes failures, "
1214                 "and rich men poor men? How many wise guys were stupid? How "
1215                 "many happy endings were unhappy endings? How many honest men "
1216                 "were liars, brave men cowards, loyal men traitors, how many "
1217                 "sainted men were corrupt, how many people in positions of "
1218                 "trust had sold their souls to bodyguards, how many had never "
1219                 "had souls? How many straight-and-narrow paths were crooked "
1220                 "paths? How many best families were worst families and how "
1221                 "many good people were bad people? When you added them all up "
1222                 "and then subtracted, you might be left with only the children, "
1223                 "and perhaps with Albert Einstein and an old violinist or "
1224                 "sculptor somewhere.";
1225
1226 #define QUOTE_480_BYTES         (480)
1227 #define QUOTE_512_BYTES         (512)
1228 #define QUOTE_768_BYTES         (768)
1229 #define QUOTE_1024_BYTES        (1024)
1230
1231
1232
1233 /* ***** SHA1 Hash Tests ***** */
1234
1235 #define HMAC_KEY_LENGTH_SHA1    (DIGEST_BYTE_LENGTH_SHA1)
1236
1237 static uint8_t hmac_sha1_key[] = {
1238         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1239         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1240         0xDE, 0xF4, 0xDE, 0xAD };
1241
1242 /* ***** SHA224 Hash Tests ***** */
1243
1244 #define HMAC_KEY_LENGTH_SHA224  (DIGEST_BYTE_LENGTH_SHA224)
1245
1246
1247 /* ***** AES-CBC Cipher Tests ***** */
1248
1249 #define CIPHER_KEY_LENGTH_AES_CBC       (16)
1250 #define CIPHER_IV_LENGTH_AES_CBC        (CIPHER_KEY_LENGTH_AES_CBC)
1251
1252 static uint8_t aes_cbc_key[] = {
1253         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1254         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1255
1256 static uint8_t aes_cbc_iv[] = {
1257         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1258         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1259
1260
1261 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1262
1263 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1264         0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1265         0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1266         0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1267         0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1268         0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1269         0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1270         0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1271         0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1272         0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1273         0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1274         0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1275         0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1276         0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1277         0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1278         0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1279         0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1280         0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1281         0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1282         0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1283         0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1284         0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1285         0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1286         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1287         0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1288         0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1289         0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1290         0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1291         0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1292         0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1293         0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1294         0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1295         0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1296         0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1297         0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1298         0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1299         0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1300         0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1301         0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1302         0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1303         0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1304         0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1305         0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1306         0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1307         0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1308         0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1309         0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1310         0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1311         0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1312         0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1313         0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1314         0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1315         0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1316         0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1317         0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1318         0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1319         0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1320         0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1321         0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1322         0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1323         0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1324         0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1325         0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1326         0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1327         0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1328 };
1329
1330 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1331         0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1332         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1333         0x18, 0x8c, 0x1d, 0x32
1334 };
1335
1336
1337 /* Multisession Vector context Test */
1338 /*Begin Session 0 */
1339 static uint8_t ms_aes_cbc_key0[] = {
1340         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1341         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1342 };
1343
1344 static uint8_t ms_aes_cbc_iv0[] = {
1345         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1346         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1347 };
1348
1349 static const uint8_t ms_aes_cbc_cipher0[] = {
1350                 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1351                 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1352                 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1353                 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1354                 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1355                 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1356                 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1357                 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1358                 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1359                 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1360                 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1361                 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1362                 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1363                 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1364                 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1365                 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1366                 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1367                 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1368                 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1369                 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1370                 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1371                 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1372                 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1373                 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1374                 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1375                 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1376                 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1377                 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1378                 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1379                 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1380                 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1381                 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1382                 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1383                 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1384                 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1385                 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1386                 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1387                 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1388                 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1389                 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1390                 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1391                 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1392                 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1393                 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1394                 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1395                 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1396                 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1397                 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1398                 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1399                 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1400                 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1401                 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1402                 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1403                 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1404                 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1405                 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1406                 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1407                 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1408                 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1409                 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1410                 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1411                 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1412                 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1413                 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1414 };
1415
1416
1417 static  uint8_t ms_hmac_key0[] = {
1418                 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1419                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1420                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1421                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1422                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1423                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1424                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1425                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1426 };
1427
1428 static const uint8_t ms_hmac_digest0[] = {
1429                 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1430                 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1431                 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1432                 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1433                 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1434                 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1435                 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1436                 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1437                 };
1438
1439 /* End Session 0 */
1440 /* Begin session 1 */
1441
1442 static  uint8_t ms_aes_cbc_key1[] = {
1443                 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1444                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1445 };
1446
1447 static  uint8_t ms_aes_cbc_iv1[] = {
1448         0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1449         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1450 };
1451
1452 static const uint8_t ms_aes_cbc_cipher1[] = {
1453                 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1454                 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1455                 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1456                 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1457                 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1458                 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1459                 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1460                 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1461                 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1462                 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1463                 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1464                 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1465                 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1466                 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1467                 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1468                 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1469                 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1470                 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1471                 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1472                 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1473                 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1474                 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1475                 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1476                 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1477                 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1478                 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1479                 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1480                 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1481                 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1482                 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1483                 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1484                 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1485                 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1486                 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1487                 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1488                 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1489                 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1490                 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1491                 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1492                 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1493                 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1494                 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1495                 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1496                 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1497                 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1498                 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1499                 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1500                 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1501                 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1502                 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1503                 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1504                 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1505                 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1506                 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1507                 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1508                 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1509                 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1510                 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1511                 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1512                 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1513                 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1514                 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1515                 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1516                 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1517
1518 };
1519
1520 static uint8_t ms_hmac_key1[] = {
1521                 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1522                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1523                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1524                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1525                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1526                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1527                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1528                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1529 };
1530
1531 static const uint8_t ms_hmac_digest1[] = {
1532                 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1533                 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1534                 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1535                 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1536                 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1537                 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1538                 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1539                 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1540 };
1541 /* End Session 1  */
1542 /* Begin Session 2 */
1543 static  uint8_t ms_aes_cbc_key2[] = {
1544                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1545                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1546 };
1547
1548 static  uint8_t ms_aes_cbc_iv2[] = {
1549                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1550                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1551 };
1552
1553 static const uint8_t ms_aes_cbc_cipher2[] = {
1554                 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
1555                 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
1556                 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
1557                 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
1558                 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
1559                 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
1560                 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
1561                 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
1562                 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
1563                 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
1564                 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
1565                 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
1566                 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
1567                 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
1568                 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
1569                 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
1570                 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
1571                 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
1572                 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
1573                 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
1574                 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
1575                 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
1576                 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
1577                 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
1578                 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
1579                 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
1580                 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
1581                 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
1582                 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
1583                 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
1584                 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
1585                 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
1586                 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
1587                 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
1588                 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
1589                 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
1590                 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
1591                 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
1592                 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
1593                 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
1594                 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
1595                 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
1596                 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
1597                 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
1598                 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
1599                 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
1600                 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
1601                 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
1602                 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
1603                 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
1604                 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
1605                 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
1606                 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
1607                 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
1608                 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
1609                 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
1610                 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
1611                 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
1612                 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
1613                 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
1614                 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
1615                 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
1616                 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
1617                 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
1618 };
1619
1620 static  uint8_t ms_hmac_key2[] = {
1621                 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1622                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1623                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1624                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1625                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1626                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1627                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1628                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1629 };
1630
1631 static const uint8_t ms_hmac_digest2[] = {
1632                 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
1633                 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
1634                 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
1635                 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
1636                 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
1637                 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
1638                 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
1639                 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
1640 };
1641
1642 /* End Session 2 */
1643
1644
1645 static int
1646 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
1647 {
1648         struct crypto_testsuite_params *ts_params = &testsuite_params;
1649         struct crypto_unittest_params *ut_params = &unittest_params;
1650
1651         /* Verify the capabilities */
1652         struct rte_cryptodev_sym_capability_idx cap_idx;
1653         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1654         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
1655         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1656                         &cap_idx) == NULL)
1657                 return -ENOTSUP;
1658         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1659         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
1660         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1661                         &cap_idx) == NULL)
1662                 return -ENOTSUP;
1663
1664         /* Generate test mbuf data and space for digest */
1665         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1666                         catch_22_quote, QUOTE_512_BYTES, 0);
1667
1668         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1669                         DIGEST_BYTE_LENGTH_SHA1);
1670         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1671
1672         /* Setup Cipher Parameters */
1673         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1674         ut_params->cipher_xform.next = &ut_params->auth_xform;
1675
1676         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1677         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
1678         ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
1679         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1680         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1681         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1682
1683         /* Setup HMAC Parameters */
1684         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1685
1686         ut_params->auth_xform.next = NULL;
1687
1688         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
1689         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
1690         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
1691         ut_params->auth_xform.auth.key.data = hmac_sha1_key;
1692         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
1693
1694         ut_params->sess = rte_cryptodev_sym_session_create(
1695                         ts_params->session_mpool);
1696
1697         /* Create crypto session*/
1698         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
1699                         ut_params->sess, &ut_params->cipher_xform,
1700                         ts_params->session_priv_mpool);
1701         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1702
1703         /* Generate crypto op data structure */
1704         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1705                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1706         TEST_ASSERT_NOT_NULL(ut_params->op,
1707                         "Failed to allocate symmetric crypto operation struct");
1708
1709         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1710
1711         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1712
1713         /* set crypto operation source mbuf */
1714         sym_op->m_src = ut_params->ibuf;
1715
1716         /* Set crypto operation authentication parameters */
1717         sym_op->auth.digest.data = ut_params->digest;
1718         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1719                         ut_params->ibuf, QUOTE_512_BYTES);
1720
1721         sym_op->auth.data.offset = 0;
1722         sym_op->auth.data.length = QUOTE_512_BYTES;
1723
1724         /* Copy IV at the end of the crypto operation */
1725         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1726                         aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
1727
1728         /* Set crypto operation cipher parameters */
1729         sym_op->cipher.data.offset = 0;
1730         sym_op->cipher.data.length = QUOTE_512_BYTES;
1731
1732         /* Process crypto operation */
1733         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1734                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1735                         ut_params->op);
1736         else
1737                 TEST_ASSERT_NOT_NULL(
1738                         process_crypto_request(ts_params->valid_devs[0],
1739                                 ut_params->op),
1740                                 "failed to process sym crypto op");
1741
1742         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1743                         "crypto op processing failed");
1744
1745         /* Validate obuf */
1746         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
1747                         uint8_t *);
1748
1749         TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
1750                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
1751                         QUOTE_512_BYTES,
1752                         "ciphertext data not as expected");
1753
1754         uint8_t *digest = ciphertext + QUOTE_512_BYTES;
1755
1756         TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
1757                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
1758                         gbl_driver_id == rte_cryptodev_driver_id_get(
1759                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
1760                                         TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
1761                                         DIGEST_BYTE_LENGTH_SHA1,
1762                         "Generated digest data not as expected");
1763
1764         return TEST_SUCCESS;
1765 }
1766
1767 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
1768
1769 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
1770
1771 static uint8_t hmac_sha512_key[] = {
1772         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1773         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1774         0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1775         0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
1776         0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
1777         0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1778         0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
1779         0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
1780
1781 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
1782         0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
1783         0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
1784         0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
1785         0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
1786         0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
1787         0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
1788         0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
1789         0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
1790
1791
1792
1793 static int
1794 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1795                 struct crypto_unittest_params *ut_params,
1796                 uint8_t *cipher_key,
1797                 uint8_t *hmac_key);
1798
1799 static int
1800 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1801                 struct crypto_unittest_params *ut_params,
1802                 struct crypto_testsuite_params *ts_params,
1803                 const uint8_t *cipher,
1804                 const uint8_t *digest,
1805                 const uint8_t *iv);
1806
1807
1808 static int
1809 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1810                 struct crypto_unittest_params *ut_params,
1811                 uint8_t *cipher_key,
1812                 uint8_t *hmac_key)
1813 {
1814
1815         /* Setup Cipher Parameters */
1816         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1817         ut_params->cipher_xform.next = NULL;
1818
1819         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1820         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
1821         ut_params->cipher_xform.cipher.key.data = cipher_key;
1822         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1823         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1824         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1825
1826         /* Setup HMAC Parameters */
1827         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1828         ut_params->auth_xform.next = &ut_params->cipher_xform;
1829
1830         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
1831         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
1832         ut_params->auth_xform.auth.key.data = hmac_key;
1833         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
1834         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
1835
1836         return TEST_SUCCESS;
1837 }
1838
1839
1840 static int
1841 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1842                 struct crypto_unittest_params *ut_params,
1843                 struct crypto_testsuite_params *ts_params,
1844                 const uint8_t *cipher,
1845                 const uint8_t *digest,
1846                 const uint8_t *iv)
1847 {
1848         /* Generate test mbuf data and digest */
1849         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1850                         (const char *)
1851                         cipher,
1852                         QUOTE_512_BYTES, 0);
1853
1854         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1855                         DIGEST_BYTE_LENGTH_SHA512);
1856         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1857
1858         rte_memcpy(ut_params->digest,
1859                         digest,
1860                         DIGEST_BYTE_LENGTH_SHA512);
1861
1862         /* Generate Crypto op data structure */
1863         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1864                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1865         TEST_ASSERT_NOT_NULL(ut_params->op,
1866                         "Failed to allocate symmetric crypto operation struct");
1867
1868         rte_crypto_op_attach_sym_session(ut_params->op, sess);
1869
1870         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1871
1872         /* set crypto operation source mbuf */
1873         sym_op->m_src = ut_params->ibuf;
1874
1875         sym_op->auth.digest.data = ut_params->digest;
1876         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1877                         ut_params->ibuf, QUOTE_512_BYTES);
1878
1879         sym_op->auth.data.offset = 0;
1880         sym_op->auth.data.length = QUOTE_512_BYTES;
1881
1882         /* Copy IV at the end of the crypto operation */
1883         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1884                         iv, CIPHER_IV_LENGTH_AES_CBC);
1885
1886         sym_op->cipher.data.offset = 0;
1887         sym_op->cipher.data.length = QUOTE_512_BYTES;
1888
1889         /* Process crypto operation */
1890         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1891                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1892                         ut_params->op);
1893         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1894                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
1895                                 ut_params->op, 1, 1, 0, 0);
1896         else
1897                 TEST_ASSERT_NOT_NULL(
1898                                 process_crypto_request(ts_params->valid_devs[0],
1899                                         ut_params->op),
1900                                         "failed to process sym crypto op");
1901
1902         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1903                         "crypto op processing failed");
1904
1905         ut_params->obuf = ut_params->op->sym->m_src;
1906
1907         /* Validate obuf */
1908         TEST_ASSERT_BUFFERS_ARE_EQUAL(
1909                         rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
1910                         catch_22_quote,
1911                         QUOTE_512_BYTES,
1912                         "Plaintext data not as expected");
1913
1914         /* Validate obuf */
1915         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1916                         "Digest verification failed");
1917
1918         return TEST_SUCCESS;
1919 }
1920
1921 static int
1922 test_blockcipher(enum blockcipher_test_type test_type)
1923 {
1924         struct crypto_testsuite_params *ts_params = &testsuite_params;
1925         int status;
1926
1927         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1928                 ts_params->op_mpool,
1929                 ts_params->session_mpool, ts_params->session_priv_mpool,
1930                 ts_params->valid_devs[0],
1931                 test_type);
1932
1933         if (status == -ENOTSUP)
1934                 return status;
1935
1936         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1937
1938         return TEST_SUCCESS;
1939 }
1940
1941 static int
1942 test_AES_cipheronly_all(void)
1943 {
1944         return test_blockcipher(BLKCIPHER_AES_CIPHERONLY_TYPE);
1945 }
1946
1947 static int
1948 test_AES_docsis_all(void)
1949 {
1950         /* Data-path service does not support DOCSIS yet */
1951         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1952                 return -ENOTSUP;
1953         return test_blockcipher(BLKCIPHER_AES_DOCSIS_TYPE);
1954 }
1955
1956 static int
1957 test_DES_docsis_all(void)
1958 {
1959         /* Data-path service does not support DOCSIS yet */
1960         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1961                 return -ENOTSUP;
1962         return test_blockcipher(BLKCIPHER_DES_DOCSIS_TYPE);
1963 }
1964
1965 static int
1966 test_DES_cipheronly_all(void)
1967 {
1968         return test_blockcipher(BLKCIPHER_DES_CIPHERONLY_TYPE);
1969 }
1970
1971 static int
1972 test_authonly_all(void)
1973 {
1974         return test_blockcipher(BLKCIPHER_AUTHONLY_TYPE);
1975 }
1976
1977 static int
1978 test_AES_chain_all(void)
1979 {
1980         return test_blockcipher(BLKCIPHER_AES_CHAIN_TYPE);
1981 }
1982
1983 static int
1984 test_3DES_chain_all(void)
1985 {
1986         return test_blockcipher(BLKCIPHER_3DES_CHAIN_TYPE);
1987 }
1988
1989 static int
1990 test_3DES_cipheronly_all(void)
1991 {
1992         return test_blockcipher(BLKCIPHER_3DES_CIPHERONLY_TYPE);
1993 }
1994
1995 /* ***** SNOW 3G Tests ***** */
1996 static int
1997 create_wireless_algo_hash_session(uint8_t dev_id,
1998         const uint8_t *key, const uint8_t key_len,
1999         const uint8_t iv_len, const uint8_t auth_len,
2000         enum rte_crypto_auth_operation op,
2001         enum rte_crypto_auth_algorithm algo)
2002 {
2003         uint8_t hash_key[key_len];
2004         int status;
2005
2006         struct crypto_testsuite_params *ts_params = &testsuite_params;
2007         struct crypto_unittest_params *ut_params = &unittest_params;
2008
2009         memcpy(hash_key, key, key_len);
2010
2011         debug_hexdump(stdout, "key:", key, key_len);
2012
2013         /* Setup Authentication Parameters */
2014         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2015         ut_params->auth_xform.next = NULL;
2016
2017         ut_params->auth_xform.auth.op = op;
2018         ut_params->auth_xform.auth.algo = algo;
2019         ut_params->auth_xform.auth.key.length = key_len;
2020         ut_params->auth_xform.auth.key.data = hash_key;
2021         ut_params->auth_xform.auth.digest_length = auth_len;
2022         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2023         ut_params->auth_xform.auth.iv.length = iv_len;
2024         ut_params->sess = rte_cryptodev_sym_session_create(
2025                         ts_params->session_mpool);
2026
2027         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2028                         &ut_params->auth_xform,
2029                         ts_params->session_priv_mpool);
2030         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2031         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2032         return 0;
2033 }
2034
2035 static int
2036 create_wireless_algo_cipher_session(uint8_t dev_id,
2037                         enum rte_crypto_cipher_operation op,
2038                         enum rte_crypto_cipher_algorithm algo,
2039                         const uint8_t *key, const uint8_t key_len,
2040                         uint8_t iv_len)
2041 {
2042         uint8_t cipher_key[key_len];
2043         int status;
2044         struct crypto_testsuite_params *ts_params = &testsuite_params;
2045         struct crypto_unittest_params *ut_params = &unittest_params;
2046
2047         memcpy(cipher_key, key, key_len);
2048
2049         /* Setup Cipher Parameters */
2050         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2051         ut_params->cipher_xform.next = NULL;
2052
2053         ut_params->cipher_xform.cipher.algo = algo;
2054         ut_params->cipher_xform.cipher.op = op;
2055         ut_params->cipher_xform.cipher.key.data = cipher_key;
2056         ut_params->cipher_xform.cipher.key.length = key_len;
2057         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2058         ut_params->cipher_xform.cipher.iv.length = iv_len;
2059
2060         debug_hexdump(stdout, "key:", key, key_len);
2061
2062         /* Create Crypto session */
2063         ut_params->sess = rte_cryptodev_sym_session_create(
2064                         ts_params->session_mpool);
2065
2066         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2067                         &ut_params->cipher_xform,
2068                         ts_params->session_priv_mpool);
2069         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2070         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2071         return 0;
2072 }
2073
2074 static int
2075 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2076                         unsigned int cipher_len,
2077                         unsigned int cipher_offset)
2078 {
2079         struct crypto_testsuite_params *ts_params = &testsuite_params;
2080         struct crypto_unittest_params *ut_params = &unittest_params;
2081
2082         /* Generate Crypto op data structure */
2083         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2084                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2085         TEST_ASSERT_NOT_NULL(ut_params->op,
2086                                 "Failed to allocate pktmbuf offload");
2087
2088         /* Set crypto operation data parameters */
2089         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2090
2091         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2092
2093         /* set crypto operation source mbuf */
2094         sym_op->m_src = ut_params->ibuf;
2095
2096         /* iv */
2097         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2098                         iv, iv_len);
2099         sym_op->cipher.data.length = cipher_len;
2100         sym_op->cipher.data.offset = cipher_offset;
2101         return 0;
2102 }
2103
2104 static int
2105 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2106                         unsigned int cipher_len,
2107                         unsigned int cipher_offset)
2108 {
2109         struct crypto_testsuite_params *ts_params = &testsuite_params;
2110         struct crypto_unittest_params *ut_params = &unittest_params;
2111
2112         /* Generate Crypto op data structure */
2113         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2114                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2115         TEST_ASSERT_NOT_NULL(ut_params->op,
2116                                 "Failed to allocate pktmbuf offload");
2117
2118         /* Set crypto operation data parameters */
2119         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2120
2121         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2122
2123         /* set crypto operation source mbuf */
2124         sym_op->m_src = ut_params->ibuf;
2125         sym_op->m_dst = ut_params->obuf;
2126
2127         /* iv */
2128         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2129                         iv, iv_len);
2130         sym_op->cipher.data.length = cipher_len;
2131         sym_op->cipher.data.offset = cipher_offset;
2132         return 0;
2133 }
2134
2135 static int
2136 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2137                 enum rte_crypto_cipher_operation cipher_op,
2138                 enum rte_crypto_auth_operation auth_op,
2139                 enum rte_crypto_auth_algorithm auth_algo,
2140                 enum rte_crypto_cipher_algorithm cipher_algo,
2141                 const uint8_t *key, uint8_t key_len,
2142                 uint8_t auth_iv_len, uint8_t auth_len,
2143                 uint8_t cipher_iv_len)
2144
2145 {
2146         uint8_t cipher_auth_key[key_len];
2147         int status;
2148
2149         struct crypto_testsuite_params *ts_params = &testsuite_params;
2150         struct crypto_unittest_params *ut_params = &unittest_params;
2151
2152         memcpy(cipher_auth_key, key, key_len);
2153
2154         /* Setup Authentication Parameters */
2155         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2156         ut_params->auth_xform.next = NULL;
2157
2158         ut_params->auth_xform.auth.op = auth_op;
2159         ut_params->auth_xform.auth.algo = auth_algo;
2160         ut_params->auth_xform.auth.key.length = key_len;
2161         /* Hash key = cipher key */
2162         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2163         ut_params->auth_xform.auth.digest_length = auth_len;
2164         /* Auth IV will be after cipher IV */
2165         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2166         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2167
2168         /* Setup Cipher Parameters */
2169         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2170         ut_params->cipher_xform.next = &ut_params->auth_xform;
2171
2172         ut_params->cipher_xform.cipher.algo = cipher_algo;
2173         ut_params->cipher_xform.cipher.op = cipher_op;
2174         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2175         ut_params->cipher_xform.cipher.key.length = key_len;
2176         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2177         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2178
2179         debug_hexdump(stdout, "key:", key, key_len);
2180
2181         /* Create Crypto session*/
2182         ut_params->sess = rte_cryptodev_sym_session_create(
2183                         ts_params->session_mpool);
2184         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2185
2186         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2187                         &ut_params->cipher_xform,
2188                         ts_params->session_priv_mpool);
2189         if (status == -ENOTSUP)
2190                 return status;
2191
2192         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2193         return 0;
2194 }
2195
2196 static int
2197 create_wireless_cipher_auth_session(uint8_t dev_id,
2198                 enum rte_crypto_cipher_operation cipher_op,
2199                 enum rte_crypto_auth_operation auth_op,
2200                 enum rte_crypto_auth_algorithm auth_algo,
2201                 enum rte_crypto_cipher_algorithm cipher_algo,
2202                 const struct wireless_test_data *tdata)
2203 {
2204         const uint8_t key_len = tdata->key.len;
2205         uint8_t cipher_auth_key[key_len];
2206         int status;
2207
2208         struct crypto_testsuite_params *ts_params = &testsuite_params;
2209         struct crypto_unittest_params *ut_params = &unittest_params;
2210         const uint8_t *key = tdata->key.data;
2211         const uint8_t auth_len = tdata->digest.len;
2212         uint8_t cipher_iv_len = tdata->cipher_iv.len;
2213         uint8_t auth_iv_len = tdata->auth_iv.len;
2214
2215         memcpy(cipher_auth_key, key, key_len);
2216
2217         /* Setup Authentication Parameters */
2218         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2219         ut_params->auth_xform.next = NULL;
2220
2221         ut_params->auth_xform.auth.op = auth_op;
2222         ut_params->auth_xform.auth.algo = auth_algo;
2223         ut_params->auth_xform.auth.key.length = key_len;
2224         /* Hash key = cipher key */
2225         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2226         ut_params->auth_xform.auth.digest_length = auth_len;
2227         /* Auth IV will be after cipher IV */
2228         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2229         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2230
2231         /* Setup Cipher Parameters */
2232         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2233         ut_params->cipher_xform.next = &ut_params->auth_xform;
2234
2235         ut_params->cipher_xform.cipher.algo = cipher_algo;
2236         ut_params->cipher_xform.cipher.op = cipher_op;
2237         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2238         ut_params->cipher_xform.cipher.key.length = key_len;
2239         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2240         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2241
2242
2243         debug_hexdump(stdout, "key:", key, key_len);
2244
2245         /* Create Crypto session*/
2246         ut_params->sess = rte_cryptodev_sym_session_create(
2247                         ts_params->session_mpool);
2248
2249         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2250                         &ut_params->cipher_xform,
2251                         ts_params->session_priv_mpool);
2252         if (status == -ENOTSUP)
2253                 return status;
2254
2255         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2256         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2257         return 0;
2258 }
2259
2260 static int
2261 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2262                 const struct wireless_test_data *tdata)
2263 {
2264         return create_wireless_cipher_auth_session(dev_id,
2265                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2266                 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2267                 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2268 }
2269
2270 static int
2271 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2272                 enum rte_crypto_cipher_operation cipher_op,
2273                 enum rte_crypto_auth_operation auth_op,
2274                 enum rte_crypto_auth_algorithm auth_algo,
2275                 enum rte_crypto_cipher_algorithm cipher_algo,
2276                 const uint8_t *key, const uint8_t key_len,
2277                 uint8_t auth_iv_len, uint8_t auth_len,
2278                 uint8_t cipher_iv_len)
2279 {
2280         uint8_t auth_cipher_key[key_len];
2281         int status;
2282         struct crypto_testsuite_params *ts_params = &testsuite_params;
2283         struct crypto_unittest_params *ut_params = &unittest_params;
2284
2285         memcpy(auth_cipher_key, key, key_len);
2286
2287         /* Setup Authentication Parameters */
2288         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2289         ut_params->auth_xform.auth.op = auth_op;
2290         ut_params->auth_xform.next = &ut_params->cipher_xform;
2291         ut_params->auth_xform.auth.algo = auth_algo;
2292         ut_params->auth_xform.auth.key.length = key_len;
2293         ut_params->auth_xform.auth.key.data = auth_cipher_key;
2294         ut_params->auth_xform.auth.digest_length = auth_len;
2295         /* Auth IV will be after cipher IV */
2296         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2297         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2298
2299         /* Setup Cipher Parameters */
2300         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2301         ut_params->cipher_xform.next = NULL;
2302         ut_params->cipher_xform.cipher.algo = cipher_algo;
2303         ut_params->cipher_xform.cipher.op = cipher_op;
2304         ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2305         ut_params->cipher_xform.cipher.key.length = key_len;
2306         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2307         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2308
2309         debug_hexdump(stdout, "key:", key, key_len);
2310
2311         /* Create Crypto session*/
2312         ut_params->sess = rte_cryptodev_sym_session_create(
2313                         ts_params->session_mpool);
2314         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2315
2316         if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2317                 ut_params->auth_xform.next = NULL;
2318                 ut_params->cipher_xform.next = &ut_params->auth_xform;
2319                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2320                                 &ut_params->cipher_xform,
2321                                 ts_params->session_priv_mpool);
2322
2323         } else
2324                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2325                                 &ut_params->auth_xform,
2326                                 ts_params->session_priv_mpool);
2327
2328         if (status == -ENOTSUP)
2329                 return status;
2330
2331         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2332
2333         return 0;
2334 }
2335
2336 static int
2337 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2338                 unsigned int auth_tag_len,
2339                 const uint8_t *iv, unsigned int iv_len,
2340                 unsigned int data_pad_len,
2341                 enum rte_crypto_auth_operation op,
2342                 unsigned int auth_len, unsigned int auth_offset)
2343 {
2344         struct crypto_testsuite_params *ts_params = &testsuite_params;
2345
2346         struct crypto_unittest_params *ut_params = &unittest_params;
2347
2348         /* Generate Crypto op data structure */
2349         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2350                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2351         TEST_ASSERT_NOT_NULL(ut_params->op,
2352                 "Failed to allocate pktmbuf offload");
2353
2354         /* Set crypto operation data parameters */
2355         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2356
2357         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2358
2359         /* set crypto operation source mbuf */
2360         sym_op->m_src = ut_params->ibuf;
2361
2362         /* iv */
2363         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2364                         iv, iv_len);
2365         /* digest */
2366         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2367                                         ut_params->ibuf, auth_tag_len);
2368
2369         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2370                                 "no room to append auth tag");
2371         ut_params->digest = sym_op->auth.digest.data;
2372         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2373                         ut_params->ibuf, data_pad_len);
2374         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2375                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2376         else
2377                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2378
2379         debug_hexdump(stdout, "digest:",
2380                 sym_op->auth.digest.data,
2381                 auth_tag_len);
2382
2383         sym_op->auth.data.length = auth_len;
2384         sym_op->auth.data.offset = auth_offset;
2385
2386         return 0;
2387 }
2388
2389 static int
2390 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2391         enum rte_crypto_auth_operation op)
2392 {
2393         struct crypto_testsuite_params *ts_params = &testsuite_params;
2394         struct crypto_unittest_params *ut_params = &unittest_params;
2395
2396         const uint8_t *auth_tag = tdata->digest.data;
2397         const unsigned int auth_tag_len = tdata->digest.len;
2398         unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2399         unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2400
2401         const uint8_t *cipher_iv = tdata->cipher_iv.data;
2402         const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2403         const uint8_t *auth_iv = tdata->auth_iv.data;
2404         const uint8_t auth_iv_len = tdata->auth_iv.len;
2405         const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2406         const unsigned int auth_len = tdata->validAuthLenInBits.len;
2407
2408         /* Generate Crypto op data structure */
2409         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2410                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2411         TEST_ASSERT_NOT_NULL(ut_params->op,
2412                         "Failed to allocate pktmbuf offload");
2413         /* Set crypto operation data parameters */
2414         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2415
2416         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2417
2418         /* set crypto operation source mbuf */
2419         sym_op->m_src = ut_params->ibuf;
2420
2421         /* digest */
2422         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2423                         ut_params->ibuf, auth_tag_len);
2424
2425         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2426                         "no room to append auth tag");
2427         ut_params->digest = sym_op->auth.digest.data;
2428         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2429                         ut_params->ibuf, data_pad_len);
2430         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2431                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2432         else
2433                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2434
2435         debug_hexdump(stdout, "digest:",
2436                 sym_op->auth.digest.data,
2437                 auth_tag_len);
2438
2439         /* Copy cipher and auth IVs at the end of the crypto operation */
2440         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2441                                                 IV_OFFSET);
2442         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2443         iv_ptr += cipher_iv_len;
2444         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2445
2446         sym_op->cipher.data.length = cipher_len;
2447         sym_op->cipher.data.offset = 0;
2448         sym_op->auth.data.length = auth_len;
2449         sym_op->auth.data.offset = 0;
2450
2451         return 0;
2452 }
2453
2454 static int
2455 create_zuc_cipher_hash_generate_operation(
2456                 const struct wireless_test_data *tdata)
2457 {
2458         return create_wireless_cipher_hash_operation(tdata,
2459                 RTE_CRYPTO_AUTH_OP_GENERATE);
2460 }
2461
2462 static int
2463 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2464                 const unsigned auth_tag_len,
2465                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2466                 unsigned data_pad_len,
2467                 enum rte_crypto_auth_operation op,
2468                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2469                 const unsigned cipher_len, const unsigned cipher_offset,
2470                 const unsigned auth_len, const unsigned auth_offset)
2471 {
2472         struct crypto_testsuite_params *ts_params = &testsuite_params;
2473         struct crypto_unittest_params *ut_params = &unittest_params;
2474
2475         enum rte_crypto_cipher_algorithm cipher_algo =
2476                         ut_params->cipher_xform.cipher.algo;
2477         enum rte_crypto_auth_algorithm auth_algo =
2478                         ut_params->auth_xform.auth.algo;
2479
2480         /* Generate Crypto op data structure */
2481         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2482                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2483         TEST_ASSERT_NOT_NULL(ut_params->op,
2484                         "Failed to allocate pktmbuf offload");
2485         /* Set crypto operation data parameters */
2486         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2487
2488         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2489
2490         /* set crypto operation source mbuf */
2491         sym_op->m_src = ut_params->ibuf;
2492
2493         /* digest */
2494         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2495                         ut_params->ibuf, auth_tag_len);
2496
2497         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2498                         "no room to append auth tag");
2499         ut_params->digest = sym_op->auth.digest.data;
2500
2501         if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2502                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2503                                 ut_params->ibuf, data_pad_len);
2504         } else {
2505                 struct rte_mbuf *m = ut_params->ibuf;
2506                 unsigned int offset = data_pad_len;
2507
2508                 while (offset > m->data_len && m->next != NULL) {
2509                         offset -= m->data_len;
2510                         m = m->next;
2511                 }
2512                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2513                         m, offset);
2514         }
2515
2516         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2517                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2518         else
2519                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2520
2521         debug_hexdump(stdout, "digest:",
2522                 sym_op->auth.digest.data,
2523                 auth_tag_len);
2524
2525         /* Copy cipher and auth IVs at the end of the crypto operation */
2526         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2527                                                 IV_OFFSET);
2528         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2529         iv_ptr += cipher_iv_len;
2530         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2531
2532         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2533                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2534                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2535                 sym_op->cipher.data.length = cipher_len;
2536                 sym_op->cipher.data.offset = cipher_offset;
2537         } else {
2538                 sym_op->cipher.data.length = cipher_len >> 3;
2539                 sym_op->cipher.data.offset = cipher_offset >> 3;
2540         }
2541
2542         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2543                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2544                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2545                 sym_op->auth.data.length = auth_len;
2546                 sym_op->auth.data.offset = auth_offset;
2547         } else {
2548                 sym_op->auth.data.length = auth_len >> 3;
2549                 sym_op->auth.data.offset = auth_offset >> 3;
2550         }
2551
2552         return 0;
2553 }
2554
2555 static int
2556 create_wireless_algo_auth_cipher_operation(
2557                 const uint8_t *auth_tag, unsigned int auth_tag_len,
2558                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2559                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2560                 unsigned int data_pad_len,
2561                 unsigned int cipher_len, unsigned int cipher_offset,
2562                 unsigned int auth_len, unsigned int auth_offset,
2563                 uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2564 {
2565         struct crypto_testsuite_params *ts_params = &testsuite_params;
2566         struct crypto_unittest_params *ut_params = &unittest_params;
2567
2568         enum rte_crypto_cipher_algorithm cipher_algo =
2569                         ut_params->cipher_xform.cipher.algo;
2570         enum rte_crypto_auth_algorithm auth_algo =
2571                         ut_params->auth_xform.auth.algo;
2572
2573         /* Generate Crypto op data structure */
2574         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2575                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2576         TEST_ASSERT_NOT_NULL(ut_params->op,
2577                         "Failed to allocate pktmbuf offload");
2578
2579         /* Set crypto operation data parameters */
2580         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2581
2582         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2583
2584         /* set crypto operation mbufs */
2585         sym_op->m_src = ut_params->ibuf;
2586         if (op_mode == OUT_OF_PLACE)
2587                 sym_op->m_dst = ut_params->obuf;
2588
2589         /* digest */
2590         if (!do_sgl) {
2591                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2592                         (op_mode == IN_PLACE ?
2593                                 ut_params->ibuf : ut_params->obuf),
2594                         uint8_t *, data_pad_len);
2595                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2596                         (op_mode == IN_PLACE ?
2597                                 ut_params->ibuf : ut_params->obuf),
2598                         data_pad_len);
2599                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2600         } else {
2601                 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
2602                 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
2603                                 sym_op->m_src : sym_op->m_dst);
2604                 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
2605                         remaining_off -= rte_pktmbuf_data_len(sgl_buf);
2606                         sgl_buf = sgl_buf->next;
2607                 }
2608                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
2609                                 uint8_t *, remaining_off);
2610                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
2611                                 remaining_off);
2612                 memset(sym_op->auth.digest.data, 0, remaining_off);
2613                 while (sgl_buf->next != NULL) {
2614                         memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
2615                                 0, rte_pktmbuf_data_len(sgl_buf));
2616                         sgl_buf = sgl_buf->next;
2617                 }
2618         }
2619
2620         /* Copy digest for the verification */
2621         if (verify)
2622                 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2623
2624         /* Copy cipher and auth IVs at the end of the crypto operation */
2625         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
2626                         ut_params->op, uint8_t *, IV_OFFSET);
2627
2628         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2629         iv_ptr += cipher_iv_len;
2630         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2631
2632         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2633                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2634                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2635                 sym_op->cipher.data.length = cipher_len;
2636                 sym_op->cipher.data.offset = cipher_offset;
2637         } else {
2638                 sym_op->cipher.data.length = cipher_len >> 3;
2639                 sym_op->cipher.data.offset = cipher_offset >> 3;
2640         }
2641
2642         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2643                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2644                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2645                 sym_op->auth.data.length = auth_len;
2646                 sym_op->auth.data.offset = auth_offset;
2647         } else {
2648                 sym_op->auth.data.length = auth_len >> 3;
2649                 sym_op->auth.data.offset = auth_offset >> 3;
2650         }
2651
2652         return 0;
2653 }
2654
2655 static int
2656 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
2657 {
2658         struct crypto_testsuite_params *ts_params = &testsuite_params;
2659         struct crypto_unittest_params *ut_params = &unittest_params;
2660
2661         int retval;
2662         unsigned plaintext_pad_len;
2663         unsigned plaintext_len;
2664         uint8_t *plaintext;
2665         struct rte_cryptodev_info dev_info;
2666
2667         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2668         uint64_t feat_flags = dev_info.feature_flags;
2669
2670         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
2671                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
2672                 printf("Device doesn't support NON-Byte Aligned Data.\n");
2673                 return -ENOTSUP;
2674         }
2675
2676         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2677                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2678                 printf("Device doesn't support RAW data-path APIs.\n");
2679                 return -ENOTSUP;
2680         }
2681
2682         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2683                 return -ENOTSUP;
2684
2685         /* Verify the capabilities */
2686         struct rte_cryptodev_sym_capability_idx cap_idx;
2687         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2688         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2689         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2690                         &cap_idx) == NULL)
2691                 return -ENOTSUP;
2692
2693         /* Create SNOW 3G session */
2694         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2695                         tdata->key.data, tdata->key.len,
2696                         tdata->auth_iv.len, tdata->digest.len,
2697                         RTE_CRYPTO_AUTH_OP_GENERATE,
2698                         RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2699         if (retval < 0)
2700                 return retval;
2701
2702         /* alloc mbuf and set payload */
2703         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2704
2705         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2706         rte_pktmbuf_tailroom(ut_params->ibuf));
2707
2708         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2709         /* Append data which is padded to a multiple of */
2710         /* the algorithms block size */
2711         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2712         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2713                                 plaintext_pad_len);
2714         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2715
2716         /* Create SNOW 3G operation */
2717         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2718                         tdata->auth_iv.data, tdata->auth_iv.len,
2719                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2720                         tdata->validAuthLenInBits.len,
2721                         0);
2722         if (retval < 0)
2723                 return retval;
2724
2725         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2726                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2727                                 ut_params->op, 0, 1, 1, 0);
2728         else
2729                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2730                                 ut_params->op);
2731         ut_params->obuf = ut_params->op->sym->m_src;
2732         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2733         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2734                         + plaintext_pad_len;
2735
2736         /* Validate obuf */
2737         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2738         ut_params->digest,
2739         tdata->digest.data,
2740         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
2741         "SNOW 3G Generated auth tag not as expected");
2742
2743         return 0;
2744 }
2745
2746 static int
2747 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
2748 {
2749         struct crypto_testsuite_params *ts_params = &testsuite_params;
2750         struct crypto_unittest_params *ut_params = &unittest_params;
2751
2752         int retval;
2753         unsigned plaintext_pad_len;
2754         unsigned plaintext_len;
2755         uint8_t *plaintext;
2756         struct rte_cryptodev_info dev_info;
2757
2758         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2759         uint64_t feat_flags = dev_info.feature_flags;
2760
2761         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
2762                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
2763                 printf("Device doesn't support NON-Byte Aligned Data.\n");
2764                 return -ENOTSUP;
2765         }
2766
2767         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2768                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2769                 printf("Device doesn't support RAW data-path APIs.\n");
2770                 return -ENOTSUP;
2771         }
2772
2773         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2774                 return -ENOTSUP;
2775
2776         /* Verify the capabilities */
2777         struct rte_cryptodev_sym_capability_idx cap_idx;
2778         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2779         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2780         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2781                         &cap_idx) == NULL)
2782                 return -ENOTSUP;
2783
2784         /* Create SNOW 3G session */
2785         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2786                                 tdata->key.data, tdata->key.len,
2787                                 tdata->auth_iv.len, tdata->digest.len,
2788                                 RTE_CRYPTO_AUTH_OP_VERIFY,
2789                                 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2790         if (retval < 0)
2791                 return retval;
2792         /* alloc mbuf and set payload */
2793         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2794
2795         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2796         rte_pktmbuf_tailroom(ut_params->ibuf));
2797
2798         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2799         /* Append data which is padded to a multiple of */
2800         /* the algorithms block size */
2801         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2802         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2803                                 plaintext_pad_len);
2804         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2805
2806         /* Create SNOW 3G operation */
2807         retval = create_wireless_algo_hash_operation(tdata->digest.data,
2808                         tdata->digest.len,
2809                         tdata->auth_iv.data, tdata->auth_iv.len,
2810                         plaintext_pad_len,
2811                         RTE_CRYPTO_AUTH_OP_VERIFY,
2812                         tdata->validAuthLenInBits.len,
2813                         0);
2814         if (retval < 0)
2815                 return retval;
2816
2817         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2818                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2819                                 ut_params->op, 0, 1, 1, 0);
2820         else
2821                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2822                                 ut_params->op);
2823         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2824         ut_params->obuf = ut_params->op->sym->m_src;
2825         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2826                                 + plaintext_pad_len;
2827
2828         /* Validate obuf */
2829         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
2830                 return 0;
2831         else
2832                 return -1;
2833
2834         return 0;
2835 }
2836
2837 static int
2838 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
2839 {
2840         struct crypto_testsuite_params *ts_params = &testsuite_params;
2841         struct crypto_unittest_params *ut_params = &unittest_params;
2842
2843         int retval;
2844         unsigned plaintext_pad_len;
2845         unsigned plaintext_len;
2846         uint8_t *plaintext;
2847         struct rte_cryptodev_info dev_info;
2848
2849         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2850         uint64_t feat_flags = dev_info.feature_flags;
2851
2852         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2853                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2854                 printf("Device doesn't support RAW data-path APIs.\n");
2855                 return -ENOTSUP;
2856         }
2857
2858         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2859                 return -ENOTSUP;
2860
2861         /* Verify the capabilities */
2862         struct rte_cryptodev_sym_capability_idx cap_idx;
2863         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2864         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2865         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2866                         &cap_idx) == NULL)
2867                 return -ENOTSUP;
2868
2869         /* Create KASUMI session */
2870         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2871                         tdata->key.data, tdata->key.len,
2872                         0, tdata->digest.len,
2873                         RTE_CRYPTO_AUTH_OP_GENERATE,
2874                         RTE_CRYPTO_AUTH_KASUMI_F9);
2875         if (retval < 0)
2876                 return retval;
2877
2878         /* alloc mbuf and set payload */
2879         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2880
2881         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2882         rte_pktmbuf_tailroom(ut_params->ibuf));
2883
2884         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2885         /* Append data which is padded to a multiple of */
2886         /* the algorithms block size */
2887         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2888         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2889                                 plaintext_pad_len);
2890         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2891
2892         /* Create KASUMI operation */
2893         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2894                         NULL, 0,
2895                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2896                         tdata->plaintext.len,
2897                         0);
2898         if (retval < 0)
2899                 return retval;
2900
2901         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2902                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2903                         ut_params->op);
2904         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2905                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2906                                 ut_params->op, 0, 1, 1, 0);
2907         else
2908                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2909                         ut_params->op);
2910
2911         ut_params->obuf = ut_params->op->sym->m_src;
2912         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2913         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2914                         + plaintext_pad_len;
2915
2916         /* Validate obuf */
2917         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2918         ut_params->digest,
2919         tdata->digest.data,
2920         DIGEST_BYTE_LENGTH_KASUMI_F9,
2921         "KASUMI Generated auth tag not as expected");
2922
2923         return 0;
2924 }
2925
2926 static int
2927 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
2928 {
2929         struct crypto_testsuite_params *ts_params = &testsuite_params;
2930         struct crypto_unittest_params *ut_params = &unittest_params;
2931
2932         int retval;
2933         unsigned plaintext_pad_len;
2934         unsigned plaintext_len;
2935         uint8_t *plaintext;
2936         struct rte_cryptodev_info dev_info;
2937
2938         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2939         uint64_t feat_flags = dev_info.feature_flags;
2940
2941         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2942                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2943                 printf("Device doesn't support RAW data-path APIs.\n");
2944                 return -ENOTSUP;
2945         }
2946
2947         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2948                 return -ENOTSUP;
2949
2950         /* Verify the capabilities */
2951         struct rte_cryptodev_sym_capability_idx cap_idx;
2952         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2953         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2954         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2955                         &cap_idx) == NULL)
2956                 return -ENOTSUP;
2957
2958         /* Create KASUMI session */
2959         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2960                                 tdata->key.data, tdata->key.len,
2961                                 0, tdata->digest.len,
2962                                 RTE_CRYPTO_AUTH_OP_VERIFY,
2963                                 RTE_CRYPTO_AUTH_KASUMI_F9);
2964         if (retval < 0)
2965                 return retval;
2966         /* alloc mbuf and set payload */
2967         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2968
2969         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2970         rte_pktmbuf_tailroom(ut_params->ibuf));
2971
2972         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2973         /* Append data which is padded to a multiple */
2974         /* of the algorithms block size */
2975         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2976         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2977                                 plaintext_pad_len);
2978         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2979
2980         /* Create KASUMI operation */
2981         retval = create_wireless_algo_hash_operation(tdata->digest.data,
2982                         tdata->digest.len,
2983                         NULL, 0,
2984                         plaintext_pad_len,
2985                         RTE_CRYPTO_AUTH_OP_VERIFY,
2986                         tdata->plaintext.len,
2987                         0);
2988         if (retval < 0)
2989                 return retval;
2990
2991         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2992                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2993                                 ut_params->op, 0, 1, 1, 0);
2994         else
2995                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2996                                 ut_params->op);
2997         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2998         ut_params->obuf = ut_params->op->sym->m_src;
2999         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3000                                 + plaintext_pad_len;
3001
3002         /* Validate obuf */
3003         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3004                 return 0;
3005         else
3006                 return -1;
3007
3008         return 0;
3009 }
3010
3011 static int
3012 test_snow3g_hash_generate_test_case_1(void)
3013 {
3014         return test_snow3g_authentication(&snow3g_hash_test_case_1);
3015 }
3016
3017 static int
3018 test_snow3g_hash_generate_test_case_2(void)
3019 {
3020         return test_snow3g_authentication(&snow3g_hash_test_case_2);
3021 }
3022
3023 static int
3024 test_snow3g_hash_generate_test_case_3(void)
3025 {
3026         return test_snow3g_authentication(&snow3g_hash_test_case_3);
3027 }
3028
3029 static int
3030 test_snow3g_hash_generate_test_case_4(void)
3031 {
3032         return test_snow3g_authentication(&snow3g_hash_test_case_4);
3033 }
3034
3035 static int
3036 test_snow3g_hash_generate_test_case_5(void)
3037 {
3038         return test_snow3g_authentication(&snow3g_hash_test_case_5);
3039 }
3040
3041 static int
3042 test_snow3g_hash_generate_test_case_6(void)
3043 {
3044         return test_snow3g_authentication(&snow3g_hash_test_case_6);
3045 }
3046
3047 static int
3048 test_snow3g_hash_verify_test_case_1(void)
3049 {
3050         return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3051
3052 }
3053
3054 static int
3055 test_snow3g_hash_verify_test_case_2(void)
3056 {
3057         return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3058 }
3059
3060 static int
3061 test_snow3g_hash_verify_test_case_3(void)
3062 {
3063         return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3064 }
3065
3066 static int
3067 test_snow3g_hash_verify_test_case_4(void)
3068 {
3069         return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3070 }
3071
3072 static int
3073 test_snow3g_hash_verify_test_case_5(void)
3074 {
3075         return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3076 }
3077
3078 static int
3079 test_snow3g_hash_verify_test_case_6(void)
3080 {
3081         return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3082 }
3083
3084 static int
3085 test_kasumi_hash_generate_test_case_1(void)
3086 {
3087         return test_kasumi_authentication(&kasumi_hash_test_case_1);
3088 }
3089
3090 static int
3091 test_kasumi_hash_generate_test_case_2(void)
3092 {
3093         return test_kasumi_authentication(&kasumi_hash_test_case_2);
3094 }
3095
3096 static int
3097 test_kasumi_hash_generate_test_case_3(void)
3098 {
3099         return test_kasumi_authentication(&kasumi_hash_test_case_3);
3100 }
3101
3102 static int
3103 test_kasumi_hash_generate_test_case_4(void)
3104 {
3105         return test_kasumi_authentication(&kasumi_hash_test_case_4);
3106 }
3107
3108 static int
3109 test_kasumi_hash_generate_test_case_5(void)
3110 {
3111         return test_kasumi_authentication(&kasumi_hash_test_case_5);
3112 }
3113
3114 static int
3115 test_kasumi_hash_generate_test_case_6(void)
3116 {
3117         return test_kasumi_authentication(&kasumi_hash_test_case_6);
3118 }
3119
3120 static int
3121 test_kasumi_hash_verify_test_case_1(void)
3122 {
3123         return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3124 }
3125
3126 static int
3127 test_kasumi_hash_verify_test_case_2(void)
3128 {
3129         return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3130 }
3131
3132 static int
3133 test_kasumi_hash_verify_test_case_3(void)
3134 {
3135         return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3136 }
3137
3138 static int
3139 test_kasumi_hash_verify_test_case_4(void)
3140 {
3141         return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3142 }
3143
3144 static int
3145 test_kasumi_hash_verify_test_case_5(void)
3146 {
3147         return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3148 }
3149
3150 static int
3151 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3152 {
3153         struct crypto_testsuite_params *ts_params = &testsuite_params;
3154         struct crypto_unittest_params *ut_params = &unittest_params;
3155
3156         int retval;
3157         uint8_t *plaintext, *ciphertext;
3158         unsigned plaintext_pad_len;
3159         unsigned plaintext_len;
3160         struct rte_cryptodev_info dev_info;
3161
3162         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3163         uint64_t feat_flags = dev_info.feature_flags;
3164
3165         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3166                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3167                 printf("Device doesn't support RAW data-path APIs.\n");
3168                 return -ENOTSUP;
3169         }
3170
3171         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3172                 return -ENOTSUP;
3173
3174         /* Verify the capabilities */
3175         struct rte_cryptodev_sym_capability_idx cap_idx;
3176         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3177         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3178         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3179                         &cap_idx) == NULL)
3180                 return -ENOTSUP;
3181
3182         /* Create KASUMI session */
3183         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3184                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3185                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3186                                         tdata->key.data, tdata->key.len,
3187                                         tdata->cipher_iv.len);
3188         if (retval < 0)
3189                 return retval;
3190
3191         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3192
3193         /* Clear mbuf payload */
3194         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3195                rte_pktmbuf_tailroom(ut_params->ibuf));
3196
3197         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3198         /* Append data which is padded to a multiple */
3199         /* of the algorithms block size */
3200         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3201         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3202                                 plaintext_pad_len);
3203         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3204
3205         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3206
3207         /* Create KASUMI operation */
3208         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3209                                 tdata->cipher_iv.len,
3210                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3211                                 tdata->validCipherOffsetInBits.len);
3212         if (retval < 0)
3213                 return retval;
3214
3215         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3216                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3217                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3218         else
3219                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3220                                 ut_params->op);
3221         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3222
3223         ut_params->obuf = ut_params->op->sym->m_dst;
3224         if (ut_params->obuf)
3225                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3226         else
3227                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3228
3229         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3230
3231         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3232                                 (tdata->validCipherOffsetInBits.len >> 3);
3233         /* Validate obuf */
3234         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3235                 ciphertext,
3236                 reference_ciphertext,
3237                 tdata->validCipherLenInBits.len,
3238                 "KASUMI Ciphertext data not as expected");
3239         return 0;
3240 }
3241
3242 static int
3243 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3244 {
3245         struct crypto_testsuite_params *ts_params = &testsuite_params;
3246         struct crypto_unittest_params *ut_params = &unittest_params;
3247
3248         int retval;
3249
3250         unsigned int plaintext_pad_len;
3251         unsigned int plaintext_len;
3252
3253         uint8_t buffer[10000];
3254         const uint8_t *ciphertext;
3255
3256         struct rte_cryptodev_info dev_info;
3257
3258         /* Verify the capabilities */
3259         struct rte_cryptodev_sym_capability_idx cap_idx;
3260         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3261         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3262         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3263                         &cap_idx) == NULL)
3264                 return -ENOTSUP;
3265
3266         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3267
3268         uint64_t feat_flags = dev_info.feature_flags;
3269
3270         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3271                 printf("Device doesn't support in-place scatter-gather. "
3272                                 "Test Skipped.\n");
3273                 return -ENOTSUP;
3274         }
3275
3276         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3277                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3278                 printf("Device doesn't support RAW data-path APIs.\n");
3279                 return -ENOTSUP;
3280         }
3281
3282         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3283                 return -ENOTSUP;
3284
3285         /* Create KASUMI session */
3286         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3287                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3288                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3289                                         tdata->key.data, tdata->key.len,
3290                                         tdata->cipher_iv.len);
3291         if (retval < 0)
3292                 return retval;
3293
3294         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3295
3296
3297         /* Append data which is padded to a multiple */
3298         /* of the algorithms block size */
3299         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3300
3301         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3302                         plaintext_pad_len, 10, 0);
3303
3304         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3305
3306         /* Create KASUMI operation */
3307         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3308                                 tdata->cipher_iv.len,
3309                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3310                                 tdata->validCipherOffsetInBits.len);
3311         if (retval < 0)
3312                 return retval;
3313
3314         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3315                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3316                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3317         else
3318                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3319                                                 ut_params->op);
3320         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3321
3322         ut_params->obuf = ut_params->op->sym->m_dst;
3323
3324         if (ut_params->obuf)
3325                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3326                                 plaintext_len, buffer);
3327         else
3328                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3329                                 tdata->validCipherOffsetInBits.len >> 3,
3330                                 plaintext_len, buffer);
3331
3332         /* Validate obuf */
3333         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3334
3335         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3336                                 (tdata->validCipherOffsetInBits.len >> 3);
3337         /* Validate obuf */
3338         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3339                 ciphertext,
3340                 reference_ciphertext,
3341                 tdata->validCipherLenInBits.len,
3342                 "KASUMI Ciphertext data not as expected");
3343         return 0;
3344 }
3345
3346 static int
3347 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3348 {
3349         struct crypto_testsuite_params *ts_params = &testsuite_params;
3350         struct crypto_unittest_params *ut_params = &unittest_params;
3351
3352         int retval;
3353         uint8_t *plaintext, *ciphertext;
3354         unsigned plaintext_pad_len;
3355         unsigned plaintext_len;
3356
3357         /* Verify the capabilities */
3358         struct rte_cryptodev_sym_capability_idx cap_idx;
3359         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3360         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3361         /* Data-path service does not support OOP */
3362         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3363                         &cap_idx) == NULL)
3364                 return -ENOTSUP;
3365
3366         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3367                 return -ENOTSUP;
3368
3369         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3370                 return -ENOTSUP;
3371
3372         /* Create KASUMI session */
3373         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3374                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3375                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3376                                         tdata->key.data, tdata->key.len,
3377                                         tdata->cipher_iv.len);
3378         if (retval < 0)
3379                 return retval;
3380
3381         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3382         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3383
3384         /* Clear mbuf payload */
3385         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3386                rte_pktmbuf_tailroom(ut_params->ibuf));
3387
3388         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3389         /* Append data which is padded to a multiple */
3390         /* of the algorithms block size */
3391         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3392         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3393                                 plaintext_pad_len);
3394         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3395         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3396
3397         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3398
3399         /* Create KASUMI operation */
3400         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3401                                 tdata->cipher_iv.len,
3402                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3403                                 tdata->validCipherOffsetInBits.len);
3404         if (retval < 0)
3405                 return retval;
3406
3407         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3408                                                 ut_params->op);
3409         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3410
3411         ut_params->obuf = ut_params->op->sym->m_dst;
3412         if (ut_params->obuf)
3413                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3414         else
3415                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3416
3417         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3418
3419         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3420                                 (tdata->validCipherOffsetInBits.len >> 3);
3421         /* Validate obuf */
3422         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3423                 ciphertext,
3424                 reference_ciphertext,
3425                 tdata->validCipherLenInBits.len,
3426                 "KASUMI Ciphertext data not as expected");
3427         return 0;
3428 }
3429
3430 static int
3431 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3432 {
3433         struct crypto_testsuite_params *ts_params = &testsuite_params;
3434         struct crypto_unittest_params *ut_params = &unittest_params;
3435
3436         int retval;
3437         unsigned int plaintext_pad_len;
3438         unsigned int plaintext_len;
3439
3440         const uint8_t *ciphertext;
3441         uint8_t buffer[2048];
3442
3443         struct rte_cryptodev_info dev_info;
3444
3445         /* Verify the capabilities */
3446         struct rte_cryptodev_sym_capability_idx cap_idx;
3447         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3448         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3449         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3450                         &cap_idx) == NULL)
3451                 return -ENOTSUP;
3452
3453         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3454                 return -ENOTSUP;
3455
3456         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3457                 return -ENOTSUP;
3458
3459         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3460
3461         uint64_t feat_flags = dev_info.feature_flags;
3462         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3463                 printf("Device doesn't support out-of-place scatter-gather "
3464                                 "in both input and output mbufs. "
3465                                 "Test Skipped.\n");
3466                 return -ENOTSUP;
3467         }
3468
3469         /* Create KASUMI session */
3470         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3471                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3472                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3473                                         tdata->key.data, tdata->key.len,
3474                                         tdata->cipher_iv.len);
3475         if (retval < 0)
3476                 return retval;
3477
3478         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3479         /* Append data which is padded to a multiple */
3480         /* of the algorithms block size */
3481         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3482
3483         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3484                         plaintext_pad_len, 10, 0);
3485         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3486                         plaintext_pad_len, 3, 0);
3487
3488         /* Append data which is padded to a multiple */
3489         /* of the algorithms block size */
3490         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3491
3492         /* Create KASUMI operation */
3493         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3494                                 tdata->cipher_iv.len,
3495                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3496                                 tdata->validCipherOffsetInBits.len);
3497         if (retval < 0)
3498                 return retval;
3499
3500         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3501                                                 ut_params->op);
3502         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3503
3504         ut_params->obuf = ut_params->op->sym->m_dst;
3505         if (ut_params->obuf)
3506                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3507                                 plaintext_pad_len, buffer);
3508         else
3509                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3510                                 tdata->validCipherOffsetInBits.len >> 3,
3511                                 plaintext_pad_len, buffer);
3512
3513         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3514                                 (tdata->validCipherOffsetInBits.len >> 3);
3515         /* Validate obuf */
3516         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3517                 ciphertext,
3518                 reference_ciphertext,
3519                 tdata->validCipherLenInBits.len,
3520                 "KASUMI Ciphertext data not as expected");
3521         return 0;
3522 }
3523
3524
3525 static int
3526 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3527 {
3528         struct crypto_testsuite_params *ts_params = &testsuite_params;
3529         struct crypto_unittest_params *ut_params = &unittest_params;
3530
3531         int retval;
3532         uint8_t *ciphertext, *plaintext;
3533         unsigned ciphertext_pad_len;
3534         unsigned ciphertext_len;
3535
3536         /* Verify the capabilities */
3537         struct rte_cryptodev_sym_capability_idx cap_idx;
3538         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3539         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3540         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3541                         &cap_idx) == NULL)
3542                 return -ENOTSUP;
3543
3544         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3545                 return -ENOTSUP;
3546
3547         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3548                 return -ENOTSUP;
3549
3550         /* Create KASUMI session */
3551         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3552                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3553                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3554                                         tdata->key.data, tdata->key.len,
3555                                         tdata->cipher_iv.len);
3556         if (retval < 0)
3557                 return retval;
3558
3559         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3560         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3561
3562         /* Clear mbuf payload */
3563         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3564                rte_pktmbuf_tailroom(ut_params->ibuf));
3565
3566         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3567         /* Append data which is padded to a multiple */
3568         /* of the algorithms block size */
3569         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3570         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3571                                 ciphertext_pad_len);
3572         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3573         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3574
3575         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3576
3577         /* Create KASUMI operation */
3578         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3579                                 tdata->cipher_iv.len,
3580                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3581                                 tdata->validCipherOffsetInBits.len);
3582         if (retval < 0)
3583                 return retval;
3584
3585         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3586                                                 ut_params->op);
3587         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3588
3589         ut_params->obuf = ut_params->op->sym->m_dst;
3590         if (ut_params->obuf)
3591                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3592         else
3593                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3594
3595         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3596
3597         const uint8_t *reference_plaintext = tdata->plaintext.data +
3598                                 (tdata->validCipherOffsetInBits.len >> 3);
3599         /* Validate obuf */
3600         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3601                 plaintext,
3602                 reference_plaintext,
3603                 tdata->validCipherLenInBits.len,
3604                 "KASUMI Plaintext data not as expected");
3605         return 0;
3606 }
3607
3608 static int
3609 test_kasumi_decryption(const struct kasumi_test_data *tdata)
3610 {
3611         struct crypto_testsuite_params *ts_params = &testsuite_params;
3612         struct crypto_unittest_params *ut_params = &unittest_params;
3613
3614         int retval;
3615         uint8_t *ciphertext, *plaintext;
3616         unsigned ciphertext_pad_len;
3617         unsigned ciphertext_len;
3618         struct rte_cryptodev_info dev_info;
3619
3620         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3621         uint64_t feat_flags = dev_info.feature_flags;
3622
3623         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3624                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3625                 printf("Device doesn't support RAW data-path APIs.\n");
3626                 return -ENOTSUP;
3627         }
3628
3629         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3630                 return -ENOTSUP;
3631
3632         /* Verify the capabilities */
3633         struct rte_cryptodev_sym_capability_idx cap_idx;
3634         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3635         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3636         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3637                         &cap_idx) == NULL)
3638                 return -ENOTSUP;
3639
3640         /* Create KASUMI session */
3641         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3642                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3643                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3644                                         tdata->key.data, tdata->key.len,
3645                                         tdata->cipher_iv.len);
3646         if (retval < 0)
3647                 return retval;
3648
3649         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3650
3651         /* Clear mbuf payload */
3652         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3653                rte_pktmbuf_tailroom(ut_params->ibuf));
3654
3655         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3656         /* Append data which is padded to a multiple */
3657         /* of the algorithms block size */
3658         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3659         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3660                                 ciphertext_pad_len);
3661         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3662
3663         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3664
3665         /* Create KASUMI operation */
3666         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3667                                         tdata->cipher_iv.len,
3668                                         tdata->ciphertext.len,
3669                                         tdata->validCipherOffsetInBits.len);
3670         if (retval < 0)
3671                 return retval;
3672
3673         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3674                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3675                                 ut_params->op, 1, 0, 1, 0);
3676         else
3677                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3678                                                 ut_params->op);
3679         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3680
3681         ut_params->obuf = ut_params->op->sym->m_dst;
3682         if (ut_params->obuf)
3683                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3684         else
3685                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3686
3687         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3688
3689         const uint8_t *reference_plaintext = tdata->plaintext.data +
3690                                 (tdata->validCipherOffsetInBits.len >> 3);
3691         /* Validate obuf */
3692         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3693                 plaintext,
3694                 reference_plaintext,
3695                 tdata->validCipherLenInBits.len,
3696                 "KASUMI Plaintext data not as expected");
3697         return 0;
3698 }
3699
3700 static int
3701 test_snow3g_encryption(const struct snow3g_test_data *tdata)
3702 {
3703         struct crypto_testsuite_params *ts_params = &testsuite_params;
3704         struct crypto_unittest_params *ut_params = &unittest_params;
3705
3706         int retval;
3707         uint8_t *plaintext, *ciphertext;
3708         unsigned plaintext_pad_len;
3709         unsigned plaintext_len;
3710         struct rte_cryptodev_info dev_info;
3711
3712         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3713         uint64_t feat_flags = dev_info.feature_flags;
3714
3715         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3716                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3717                 printf("Device doesn't support RAW data-path APIs.\n");
3718                 return -ENOTSUP;
3719         }
3720
3721         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3722                 return -ENOTSUP;
3723
3724         /* Verify the capabilities */
3725         struct rte_cryptodev_sym_capability_idx cap_idx;
3726         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3727         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3728         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3729                         &cap_idx) == NULL)
3730                 return -ENOTSUP;
3731
3732         /* Create SNOW 3G session */
3733         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3734                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3735                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3736                                         tdata->key.data, tdata->key.len,
3737                                         tdata->cipher_iv.len);
3738         if (retval < 0)
3739                 return retval;
3740
3741         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3742
3743         /* Clear mbuf payload */
3744         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3745                rte_pktmbuf_tailroom(ut_params->ibuf));
3746
3747         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3748         /* Append data which is padded to a multiple of */
3749         /* the algorithms block size */
3750         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3751         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3752                                 plaintext_pad_len);
3753         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3754
3755         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3756
3757         /* Create SNOW 3G operation */
3758         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3759                                         tdata->cipher_iv.len,
3760                                         tdata->validCipherLenInBits.len,
3761                                         0);
3762         if (retval < 0)
3763                 return retval;
3764
3765         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3766                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3767                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3768         else
3769                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3770                                                 ut_params->op);
3771         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3772
3773         ut_params->obuf = ut_params->op->sym->m_dst;
3774         if (ut_params->obuf)
3775                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3776         else
3777                 ciphertext = plaintext;
3778
3779         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3780
3781         /* Validate obuf */
3782         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3783                 ciphertext,
3784                 tdata->ciphertext.data,
3785                 tdata->validDataLenInBits.len,
3786                 "SNOW 3G Ciphertext data not as expected");
3787         return 0;
3788 }
3789
3790
3791 static int
3792 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
3793 {
3794         struct crypto_testsuite_params *ts_params = &testsuite_params;
3795         struct crypto_unittest_params *ut_params = &unittest_params;
3796         uint8_t *plaintext, *ciphertext;
3797
3798         int retval;
3799         unsigned plaintext_pad_len;
3800         unsigned plaintext_len;
3801
3802         /* Verify the capabilities */
3803         struct rte_cryptodev_sym_capability_idx cap_idx;
3804         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3805         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3806         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3807                         &cap_idx) == NULL)
3808                 return -ENOTSUP;
3809
3810         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3811                 return -ENOTSUP;
3812
3813         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3814                 return -ENOTSUP;
3815
3816         /* Create SNOW 3G session */
3817         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3818                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3819                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3820                                         tdata->key.data, tdata->key.len,
3821                                         tdata->cipher_iv.len);
3822         if (retval < 0)
3823                 return retval;
3824
3825         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3826         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3827
3828         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3829                         "Failed to allocate input buffer in mempool");
3830         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3831                         "Failed to allocate output buffer in mempool");
3832
3833         /* Clear mbuf payload */
3834         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3835                rte_pktmbuf_tailroom(ut_params->ibuf));
3836
3837         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3838         /* Append data which is padded to a multiple of */
3839         /* the algorithms block size */
3840         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3841         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3842                                 plaintext_pad_len);
3843         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3844         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3845
3846         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3847
3848         /* Create SNOW 3G operation */
3849         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3850                                         tdata->cipher_iv.len,
3851                                         tdata->validCipherLenInBits.len,
3852                                         0);
3853         if (retval < 0)
3854                 return retval;
3855
3856         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3857                                                 ut_params->op);
3858         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3859
3860         ut_params->obuf = ut_params->op->sym->m_dst;
3861         if (ut_params->obuf)
3862                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3863         else
3864                 ciphertext = plaintext;
3865
3866         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3867
3868         /* Validate obuf */
3869         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3870                 ciphertext,
3871                 tdata->ciphertext.data,
3872                 tdata->validDataLenInBits.len,
3873                 "SNOW 3G Ciphertext data not as expected");
3874         return 0;
3875 }
3876
3877 static int
3878 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
3879 {
3880         struct crypto_testsuite_params *ts_params = &testsuite_params;
3881         struct crypto_unittest_params *ut_params = &unittest_params;
3882
3883         int retval;
3884         unsigned int plaintext_pad_len;
3885         unsigned int plaintext_len;
3886         uint8_t buffer[10000];
3887         const uint8_t *ciphertext;
3888
3889         struct rte_cryptodev_info dev_info;
3890
3891         /* Verify the capabilities */
3892         struct rte_cryptodev_sym_capability_idx cap_idx;
3893         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3894         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3895         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3896                         &cap_idx) == NULL)
3897                 return -ENOTSUP;
3898
3899         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3900                 return -ENOTSUP;
3901
3902         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3903                 return -ENOTSUP;
3904
3905         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3906
3907         uint64_t feat_flags = dev_info.feature_flags;
3908
3909         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3910                 printf("Device doesn't support out-of-place scatter-gather "
3911                                 "in both input and output mbufs. "
3912                                 "Test Skipped.\n");
3913                 return -ENOTSUP;
3914         }
3915
3916         /* Create SNOW 3G session */
3917         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3918                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3919                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3920                                         tdata->key.data, tdata->key.len,
3921                                         tdata->cipher_iv.len);
3922         if (retval < 0)
3923                 return retval;
3924
3925         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3926         /* Append data which is padded to a multiple of */
3927         /* the algorithms block size */
3928         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3929
3930         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3931                         plaintext_pad_len, 10, 0);
3932         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3933                         plaintext_pad_len, 3, 0);
3934
3935         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3936                         "Failed to allocate input buffer in mempool");
3937         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3938                         "Failed to allocate output buffer in mempool");
3939
3940         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3941
3942         /* Create SNOW 3G operation */
3943         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3944                                         tdata->cipher_iv.len,
3945                                         tdata->validCipherLenInBits.len,
3946                                         0);
3947         if (retval < 0)
3948                 return retval;
3949
3950         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3951                                                 ut_params->op);
3952         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3953
3954         ut_params->obuf = ut_params->op->sym->m_dst;
3955         if (ut_params->obuf)
3956                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3957                                 plaintext_len, buffer);
3958         else
3959                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
3960                                 plaintext_len, buffer);
3961
3962         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3963
3964         /* Validate obuf */
3965         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3966                 ciphertext,
3967                 tdata->ciphertext.data,
3968                 tdata->validDataLenInBits.len,
3969                 "SNOW 3G Ciphertext data not as expected");
3970
3971         return 0;
3972 }
3973
3974 /* Shift right a buffer by "offset" bits, "offset" < 8 */
3975 static void
3976 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
3977 {
3978         uint8_t curr_byte, prev_byte;
3979         uint32_t length_in_bytes = ceil_byte_length(length + offset);
3980         uint8_t lower_byte_mask = (1 << offset) - 1;
3981         unsigned i;
3982
3983         prev_byte = buffer[0];
3984         buffer[0] >>= offset;
3985
3986         for (i = 1; i < length_in_bytes; i++) {
3987                 curr_byte = buffer[i];
3988                 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
3989                                 (curr_byte >> offset);
3990                 prev_byte = curr_byte;
3991         }
3992 }
3993
3994 static int
3995 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
3996 {
3997         struct crypto_testsuite_params *ts_params = &testsuite_params;
3998         struct crypto_unittest_params *ut_params = &unittest_params;
3999         uint8_t *plaintext, *ciphertext;
4000         int retval;
4001         uint32_t plaintext_len;
4002         uint32_t plaintext_pad_len;
4003         uint8_t extra_offset = 4;
4004         uint8_t *expected_ciphertext_shifted;
4005         struct rte_cryptodev_info dev_info;
4006
4007         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4008         uint64_t feat_flags = dev_info.feature_flags;
4009
4010         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4011                         ((tdata->validDataLenInBits.len % 8) != 0)) {
4012                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4013                 return -ENOTSUP;
4014         }
4015
4016         /* Verify the capabilities */
4017         struct rte_cryptodev_sym_capability_idx cap_idx;
4018         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4019         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4020         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4021                         &cap_idx) == NULL)
4022                 return -ENOTSUP;
4023
4024         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4025                 return -ENOTSUP;
4026
4027         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4028                 return -ENOTSUP;
4029
4030         /* Create SNOW 3G session */
4031         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4032                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4033                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4034                                         tdata->key.data, tdata->key.len,
4035                                         tdata->cipher_iv.len);
4036         if (retval < 0)
4037                 return retval;
4038
4039         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4040         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4041
4042         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4043                         "Failed to allocate input buffer in mempool");
4044         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4045                         "Failed to allocate output buffer in mempool");
4046
4047         /* Clear mbuf payload */
4048         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4049                rte_pktmbuf_tailroom(ut_params->ibuf));
4050
4051         plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4052         /*
4053          * Append data which is padded to a
4054          * multiple of the algorithms block size
4055          */
4056         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4057
4058         plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4059                                                 plaintext_pad_len);
4060
4061         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4062
4063         memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4064         buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4065
4066 #ifdef RTE_APP_TEST_DEBUG
4067         rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4068 #endif
4069         /* Create SNOW 3G operation */
4070         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4071                                         tdata->cipher_iv.len,
4072                                         tdata->validCipherLenInBits.len,
4073                                         extra_offset);
4074         if (retval < 0)
4075                 return retval;
4076
4077         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4078                                                 ut_params->op);
4079         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4080
4081         ut_params->obuf = ut_params->op->sym->m_dst;
4082         if (ut_params->obuf)
4083                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4084         else
4085                 ciphertext = plaintext;
4086
4087 #ifdef RTE_APP_TEST_DEBUG
4088         rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4089 #endif
4090
4091         expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4092
4093         TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4094                         "failed to reserve memory for ciphertext shifted\n");
4095
4096         memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4097                         ceil_byte_length(tdata->ciphertext.len));
4098         buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4099                         extra_offset);
4100         /* Validate obuf */
4101         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4102                 ciphertext,
4103                 expected_ciphertext_shifted,
4104                 tdata->validDataLenInBits.len,
4105                 extra_offset,
4106                 "SNOW 3G Ciphertext data not as expected");
4107         return 0;
4108 }
4109
4110 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4111 {
4112         struct crypto_testsuite_params *ts_params = &testsuite_params;
4113         struct crypto_unittest_params *ut_params = &unittest_params;
4114
4115         int retval;
4116
4117         uint8_t *plaintext, *ciphertext;
4118         unsigned ciphertext_pad_len;
4119         unsigned ciphertext_len;
4120         struct rte_cryptodev_info dev_info;
4121
4122         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4123         uint64_t feat_flags = dev_info.feature_flags;
4124
4125         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4126                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4127                 printf("Device doesn't support RAW data-path APIs.\n");
4128                 return -ENOTSUP;
4129         }
4130
4131         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4132                 return -ENOTSUP;
4133
4134         /* Verify the capabilities */
4135         struct rte_cryptodev_sym_capability_idx cap_idx;
4136         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4137         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4138         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4139                         &cap_idx) == NULL)
4140                 return -ENOTSUP;
4141
4142         /* Create SNOW 3G session */
4143         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4144                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4145                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4146                                         tdata->key.data, tdata->key.len,
4147                                         tdata->cipher_iv.len);
4148         if (retval < 0)
4149                 return retval;
4150
4151         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4152
4153         /* Clear mbuf payload */
4154         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4155                rte_pktmbuf_tailroom(ut_params->ibuf));
4156
4157         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4158         /* Append data which is padded to a multiple of */
4159         /* the algorithms block size */
4160         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4161         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4162                                 ciphertext_pad_len);
4163         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4164
4165         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4166
4167         /* Create SNOW 3G operation */
4168         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4169                                         tdata->cipher_iv.len,
4170                                         tdata->validCipherLenInBits.len,
4171                                         tdata->cipher.offset_bits);
4172         if (retval < 0)
4173                 return retval;
4174
4175         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4176                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4177                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4178         else
4179                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4180                                                 ut_params->op);
4181         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4182         ut_params->obuf = ut_params->op->sym->m_dst;
4183         if (ut_params->obuf)
4184                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4185         else
4186                 plaintext = ciphertext;
4187
4188         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4189
4190         /* Validate obuf */
4191         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4192                                 tdata->plaintext.data,
4193                                 tdata->validDataLenInBits.len,
4194                                 "SNOW 3G Plaintext data not as expected");
4195         return 0;
4196 }
4197
4198 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4199 {
4200         struct crypto_testsuite_params *ts_params = &testsuite_params;
4201         struct crypto_unittest_params *ut_params = &unittest_params;
4202
4203         int retval;
4204
4205         uint8_t *plaintext, *ciphertext;
4206         unsigned ciphertext_pad_len;
4207         unsigned ciphertext_len;
4208
4209         /* Verify the capabilities */
4210         struct rte_cryptodev_sym_capability_idx cap_idx;
4211         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4212         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4213         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4214                         &cap_idx) == NULL)
4215                 return -ENOTSUP;
4216
4217         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4218                 return -ENOTSUP;
4219
4220         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4221                 return -ENOTSUP;
4222
4223         /* Create SNOW 3G session */
4224         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4225                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4226                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4227                                         tdata->key.data, tdata->key.len,
4228                                         tdata->cipher_iv.len);
4229         if (retval < 0)
4230                 return retval;
4231
4232         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4233         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4234
4235         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4236                         "Failed to allocate input buffer");
4237         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4238                         "Failed to allocate output buffer");
4239
4240         /* Clear mbuf payload */
4241         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4242                rte_pktmbuf_tailroom(ut_params->ibuf));
4243
4244         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4245                        rte_pktmbuf_tailroom(ut_params->obuf));
4246
4247         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4248         /* Append data which is padded to a multiple of */
4249         /* the algorithms block size */
4250         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4251         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4252                                 ciphertext_pad_len);
4253         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4254         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4255
4256         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4257
4258         /* Create SNOW 3G operation */
4259         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4260                                         tdata->cipher_iv.len,
4261                                         tdata->validCipherLenInBits.len,
4262                                         0);
4263         if (retval < 0)
4264                 return retval;
4265
4266         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4267                                                 ut_params->op);
4268         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4269         ut_params->obuf = ut_params->op->sym->m_dst;
4270         if (ut_params->obuf)
4271                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4272         else
4273                 plaintext = ciphertext;
4274
4275         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4276
4277         /* Validate obuf */
4278         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4279                                 tdata->plaintext.data,
4280                                 tdata->validDataLenInBits.len,
4281                                 "SNOW 3G Plaintext data not as expected");
4282         return 0;
4283 }
4284
4285 static int
4286 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4287 {
4288         struct crypto_testsuite_params *ts_params = &testsuite_params;
4289         struct crypto_unittest_params *ut_params = &unittest_params;
4290
4291         int retval;
4292
4293         uint8_t *plaintext, *ciphertext;
4294         unsigned int plaintext_pad_len;
4295         unsigned int plaintext_len;
4296
4297         struct rte_cryptodev_info dev_info;
4298         struct rte_cryptodev_sym_capability_idx cap_idx;
4299
4300         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4301         uint64_t feat_flags = dev_info.feature_flags;
4302
4303         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4304                         ((tdata->validAuthLenInBits.len % 8 != 0) ||
4305                         (tdata->validDataLenInBits.len % 8 != 0))) {
4306                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4307                 return -ENOTSUP;
4308         }
4309
4310         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4311                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4312                 printf("Device doesn't support RAW data-path APIs.\n");
4313                 return -ENOTSUP;
4314         }
4315
4316         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4317                 return -ENOTSUP;
4318
4319         /* Check if device supports ZUC EEA3 */
4320         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4321         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4322
4323         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4324                         &cap_idx) == NULL)
4325                 return -ENOTSUP;
4326
4327         /* Check if device supports ZUC EIA3 */
4328         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4329         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4330
4331         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4332                         &cap_idx) == NULL)
4333                 return -ENOTSUP;
4334
4335         /* Create ZUC session */
4336         retval = create_zuc_cipher_auth_encrypt_generate_session(
4337                         ts_params->valid_devs[0],
4338                         tdata);
4339         if (retval < 0)
4340                 return retval;
4341         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4342
4343         /* clear mbuf payload */
4344         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4345                         rte_pktmbuf_tailroom(ut_params->ibuf));
4346
4347         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4348         /* Append data which is padded to a multiple of */
4349         /* the algorithms block size */
4350         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4351         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4352                                 plaintext_pad_len);
4353         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4354
4355         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4356
4357         /* Create ZUC operation */
4358         retval = create_zuc_cipher_hash_generate_operation(tdata);
4359         if (retval < 0)
4360                 return retval;
4361
4362         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4363                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4364                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4365         else
4366                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4367                         ut_params->op);
4368         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4369         ut_params->obuf = ut_params->op->sym->m_src;
4370         if (ut_params->obuf)
4371                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4372         else
4373                 ciphertext = plaintext;
4374
4375         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4376         /* Validate obuf */
4377         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4378                         ciphertext,
4379                         tdata->ciphertext.data,
4380                         tdata->validDataLenInBits.len,
4381                         "ZUC Ciphertext data not as expected");
4382
4383         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4384             + plaintext_pad_len;
4385
4386         /* Validate obuf */
4387         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4388                         ut_params->digest,
4389                         tdata->digest.data,
4390                         4,
4391                         "ZUC Generated auth tag not as expected");
4392         return 0;
4393 }
4394
4395 static int
4396 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4397 {
4398         struct crypto_testsuite_params *ts_params = &testsuite_params;
4399         struct crypto_unittest_params *ut_params = &unittest_params;
4400
4401         int retval;
4402
4403         uint8_t *plaintext, *ciphertext;
4404         unsigned plaintext_pad_len;
4405         unsigned plaintext_len;
4406         struct rte_cryptodev_info dev_info;
4407
4408         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4409         uint64_t feat_flags = dev_info.feature_flags;
4410
4411         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4412                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4413                 printf("Device doesn't support RAW data-path APIs.\n");
4414                 return -ENOTSUP;
4415         }
4416
4417         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4418                 return -ENOTSUP;
4419
4420         /* Verify the capabilities */
4421         struct rte_cryptodev_sym_capability_idx cap_idx;
4422         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4423         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4424         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4425                         &cap_idx) == NULL)
4426                 return -ENOTSUP;
4427         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4428         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4429         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4430                         &cap_idx) == NULL)
4431                 return -ENOTSUP;
4432
4433         /* Create SNOW 3G session */
4434         retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4435                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4436                         RTE_CRYPTO_AUTH_OP_GENERATE,
4437                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4438                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4439                         tdata->key.data, tdata->key.len,
4440                         tdata->auth_iv.len, tdata->digest.len,
4441                         tdata->cipher_iv.len);
4442         if (retval < 0)
4443                 return retval;
4444         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4445
4446         /* clear mbuf payload */
4447         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4448                         rte_pktmbuf_tailroom(ut_params->ibuf));
4449
4450         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4451         /* Append data which is padded to a multiple of */
4452         /* the algorithms block size */
4453         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4454         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4455                                 plaintext_pad_len);
4456         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4457
4458         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4459
4460         /* Create SNOW 3G operation */
4461         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4462                         tdata->digest.len, tdata->auth_iv.data,
4463                         tdata->auth_iv.len,
4464                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4465                         tdata->cipher_iv.data, tdata->cipher_iv.len,
4466                         tdata->validCipherLenInBits.len,
4467                         0,
4468                         tdata->validAuthLenInBits.len,
4469                         0
4470                         );
4471         if (retval < 0)
4472                 return retval;
4473
4474         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4475                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4476                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4477         else
4478                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4479                         ut_params->op);
4480         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4481         ut_params->obuf = ut_params->op->sym->m_src;
4482         if (ut_params->obuf)
4483                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4484         else
4485                 ciphertext = plaintext;
4486
4487         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4488         /* Validate obuf */
4489         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4490                         ciphertext,
4491                         tdata->ciphertext.data,
4492                         tdata->validDataLenInBits.len,
4493                         "SNOW 3G Ciphertext data not as expected");
4494
4495         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4496             + plaintext_pad_len;
4497
4498         /* Validate obuf */
4499         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4500                         ut_params->digest,
4501                         tdata->digest.data,
4502                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4503                         "SNOW 3G Generated auth tag not as expected");
4504         return 0;
4505 }
4506
4507 static int
4508 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4509         uint8_t op_mode, uint8_t verify)
4510 {
4511         struct crypto_testsuite_params *ts_params = &testsuite_params;
4512         struct crypto_unittest_params *ut_params = &unittest_params;
4513
4514         int retval;
4515
4516         uint8_t *plaintext = NULL, *ciphertext = NULL;
4517         unsigned int plaintext_pad_len;
4518         unsigned int plaintext_len;
4519         unsigned int ciphertext_pad_len;
4520         unsigned int ciphertext_len;
4521
4522         struct rte_cryptodev_info dev_info;
4523
4524         /* Verify the capabilities */
4525         struct rte_cryptodev_sym_capability_idx cap_idx;
4526         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4527         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4528         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4529                         &cap_idx) == NULL)
4530                 return -ENOTSUP;
4531         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4532         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4533         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4534                         &cap_idx) == NULL)
4535                 return -ENOTSUP;
4536
4537         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4538                 return -ENOTSUP;
4539
4540         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4541
4542         uint64_t feat_flags = dev_info.feature_flags;
4543
4544         if (op_mode == OUT_OF_PLACE) {
4545                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4546                         printf("Device doesn't support digest encrypted.\n");
4547                         return -ENOTSUP;
4548                 }
4549                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4550                         return -ENOTSUP;
4551         }
4552
4553         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4554                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4555                 printf("Device doesn't support RAW data-path APIs.\n");
4556                 return -ENOTSUP;
4557         }
4558
4559         /* Create SNOW 3G session */
4560         retval = create_wireless_algo_auth_cipher_session(
4561                         ts_params->valid_devs[0],
4562                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4563                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4564                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4565                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4566                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4567                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4568                         tdata->key.data, tdata->key.len,
4569                         tdata->auth_iv.len, tdata->digest.len,
4570                         tdata->cipher_iv.len);
4571
4572         if (retval < 0)
4573                 return retval;
4574
4575         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4576         if (op_mode == OUT_OF_PLACE)
4577                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4578
4579         /* clear mbuf payload */
4580         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4581                 rte_pktmbuf_tailroom(ut_params->ibuf));
4582         if (op_mode == OUT_OF_PLACE)
4583                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4584                         rte_pktmbuf_tailroom(ut_params->obuf));
4585
4586         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4587         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4588         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4589         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4590
4591         if (verify) {
4592                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4593                                         ciphertext_pad_len);
4594                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4595                 if (op_mode == OUT_OF_PLACE)
4596                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4597                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4598                         ciphertext_len);
4599         } else {
4600                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4601                                         plaintext_pad_len);
4602                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4603                 if (op_mode == OUT_OF_PLACE)
4604                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4605                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4606         }
4607
4608         /* Create SNOW 3G operation */
4609         retval = create_wireless_algo_auth_cipher_operation(
4610                 tdata->digest.data, tdata->digest.len,
4611                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4612                 tdata->auth_iv.data, tdata->auth_iv.len,
4613                 (tdata->digest.offset_bytes == 0 ?
4614                 (verify ? ciphertext_pad_len : plaintext_pad_len)
4615                         : tdata->digest.offset_bytes),
4616                 tdata->validCipherLenInBits.len,
4617                 tdata->cipher.offset_bits,
4618                 tdata->validAuthLenInBits.len,
4619                 tdata->auth.offset_bits,
4620                 op_mode, 0, verify);
4621
4622         if (retval < 0)
4623                 return retval;
4624
4625         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4626                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4627                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4628         else
4629                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4630                         ut_params->op);
4631
4632         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4633
4634         ut_params->obuf = (op_mode == IN_PLACE ?
4635                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4636
4637         if (verify) {
4638                 if (ut_params->obuf)
4639                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
4640                                                         uint8_t *);
4641                 else
4642                         plaintext = ciphertext +
4643                                 (tdata->cipher.offset_bits >> 3);
4644
4645                 debug_hexdump(stdout, "plaintext:", plaintext,
4646                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4647                 debug_hexdump(stdout, "plaintext expected:",
4648                         tdata->plaintext.data,
4649                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4650         } else {
4651                 if (ut_params->obuf)
4652                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
4653                                                         uint8_t *);
4654                 else
4655                         ciphertext = plaintext;
4656
4657                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4658                         ciphertext_len);
4659                 debug_hexdump(stdout, "ciphertext expected:",
4660                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4661
4662                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4663                         + (tdata->digest.offset_bytes == 0 ?
4664                 plaintext_pad_len : tdata->digest.offset_bytes);
4665
4666                 debug_hexdump(stdout, "digest:", ut_params->digest,
4667                         tdata->digest.len);
4668                 debug_hexdump(stdout, "digest expected:", tdata->digest.data,
4669                                 tdata->digest.len);
4670         }
4671
4672         /* Validate obuf */
4673         if (verify) {
4674                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4675                         plaintext,
4676                         tdata->plaintext.data,
4677                         tdata->plaintext.len >> 3,
4678                         "SNOW 3G Plaintext data not as expected");
4679         } else {
4680                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4681                         ciphertext,
4682                         tdata->ciphertext.data,
4683                         tdata->validDataLenInBits.len,
4684                         "SNOW 3G Ciphertext data not as expected");
4685
4686                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4687                         ut_params->digest,
4688                         tdata->digest.data,
4689                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4690                         "SNOW 3G Generated auth tag not as expected");
4691         }
4692         return 0;
4693 }
4694
4695 static int
4696 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
4697         uint8_t op_mode, uint8_t verify)
4698 {
4699         struct crypto_testsuite_params *ts_params = &testsuite_params;
4700         struct crypto_unittest_params *ut_params = &unittest_params;
4701
4702         int retval;
4703
4704         const uint8_t *plaintext = NULL;
4705         const uint8_t *ciphertext = NULL;
4706         const uint8_t *digest = NULL;
4707         unsigned int plaintext_pad_len;
4708         unsigned int plaintext_len;
4709         unsigned int ciphertext_pad_len;
4710         unsigned int ciphertext_len;
4711         uint8_t buffer[10000];
4712         uint8_t digest_buffer[10000];
4713
4714         struct rte_cryptodev_info dev_info;
4715
4716         /* Verify the capabilities */
4717         struct rte_cryptodev_sym_capability_idx cap_idx;
4718         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4719         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4720         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4721                         &cap_idx) == NULL)
4722                 return -ENOTSUP;
4723         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4724         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4725         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4726                         &cap_idx) == NULL)
4727                 return -ENOTSUP;
4728
4729         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4730                 return -ENOTSUP;
4731
4732         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4733
4734         uint64_t feat_flags = dev_info.feature_flags;
4735
4736         if (op_mode == IN_PLACE) {
4737                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
4738                         printf("Device doesn't support in-place scatter-gather "
4739                                         "in both input and output mbufs.\n");
4740                         return -ENOTSUP;
4741                 }
4742                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4743                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4744                         printf("Device doesn't support RAW data-path APIs.\n");
4745                         return -ENOTSUP;
4746                 }
4747         } else {
4748                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4749                         return -ENOTSUP;
4750                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4751                         printf("Device doesn't support out-of-place scatter-gather "
4752                                         "in both input and output mbufs.\n");
4753                         return -ENOTSUP;
4754                 }
4755                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4756                         printf("Device doesn't support digest encrypted.\n");
4757                         return -ENOTSUP;
4758                 }
4759         }
4760
4761         /* Create SNOW 3G session */
4762         retval = create_wireless_algo_auth_cipher_session(
4763                         ts_params->valid_devs[0],
4764                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4765                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4766                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4767                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4768                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4769                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4770                         tdata->key.data, tdata->key.len,
4771                         tdata->auth_iv.len, tdata->digest.len,
4772                         tdata->cipher_iv.len);
4773
4774         if (retval < 0)
4775                 return retval;
4776
4777         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4778         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4779         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4780         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4781
4782         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4783                         plaintext_pad_len, 15, 0);
4784         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4785                         "Failed to allocate input buffer in mempool");
4786
4787         if (op_mode == OUT_OF_PLACE) {
4788                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4789                                 plaintext_pad_len, 15, 0);
4790                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4791                                 "Failed to allocate output buffer in mempool");
4792         }
4793
4794         if (verify) {
4795                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
4796                         tdata->ciphertext.data);
4797                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4798                                         ciphertext_len, buffer);
4799                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4800                         ciphertext_len);
4801         } else {
4802                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
4803                         tdata->plaintext.data);
4804                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4805                                         plaintext_len, buffer);
4806                 debug_hexdump(stdout, "plaintext:", plaintext,
4807                         plaintext_len);
4808         }
4809         memset(buffer, 0, sizeof(buffer));
4810
4811         /* Create SNOW 3G operation */
4812         retval = create_wireless_algo_auth_cipher_operation(
4813                 tdata->digest.data, tdata->digest.len,
4814                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4815                 tdata->auth_iv.data, tdata->auth_iv.len,
4816                 (tdata->digest.offset_bytes == 0 ?
4817                 (verify ? ciphertext_pad_len : plaintext_pad_len)
4818                         : tdata->digest.offset_bytes),
4819                 tdata->validCipherLenInBits.len,
4820                 tdata->cipher.offset_bits,
4821                 tdata->validAuthLenInBits.len,
4822                 tdata->auth.offset_bits,
4823                 op_mode, 1, verify);
4824
4825         if (retval < 0)
4826                 return retval;
4827
4828         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4829                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4830                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4831         else
4832                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4833                         ut_params->op);
4834
4835         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4836
4837         ut_params->obuf = (op_mode == IN_PLACE ?
4838                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4839
4840         if (verify) {
4841                 if (ut_params->obuf)
4842                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
4843                                         plaintext_len, buffer);
4844                 else
4845                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4846                                         plaintext_len, buffer);
4847
4848                 debug_hexdump(stdout, "plaintext:", plaintext,
4849                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4850                 debug_hexdump(stdout, "plaintext expected:",
4851                         tdata->plaintext.data,
4852                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4853         } else {
4854                 if (ut_params->obuf)
4855                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4856                                         ciphertext_len, buffer);
4857                 else
4858                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4859                                         ciphertext_len, buffer);
4860
4861                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4862                         ciphertext_len);
4863                 debug_hexdump(stdout, "ciphertext expected:",
4864                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4865
4866                 if (ut_params->obuf)
4867                         digest = rte_pktmbuf_read(ut_params->obuf,
4868                                 (tdata->digest.offset_bytes == 0 ?
4869                                 plaintext_pad_len : tdata->digest.offset_bytes),
4870                                 tdata->digest.len, digest_buffer);
4871                 else
4872                         digest = rte_pktmbuf_read(ut_params->ibuf,
4873                                 (tdata->digest.offset_bytes == 0 ?
4874                                 plaintext_pad_len : tdata->digest.offset_bytes),
4875                                 tdata->digest.len, digest_buffer);
4876
4877                 debug_hexdump(stdout, "digest:", digest,
4878                         tdata->digest.len);
4879                 debug_hexdump(stdout, "digest expected:",
4880                         tdata->digest.data, tdata->digest.len);
4881         }
4882
4883         /* Validate obuf */
4884         if (verify) {
4885                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4886                         plaintext,
4887                         tdata->plaintext.data,
4888                         tdata->plaintext.len >> 3,
4889                         "SNOW 3G Plaintext data not as expected");
4890         } else {
4891                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4892                         ciphertext,
4893                         tdata->ciphertext.data,
4894                         tdata->validDataLenInBits.len,
4895                         "SNOW 3G Ciphertext data not as expected");
4896
4897                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4898                         digest,
4899                         tdata->digest.data,
4900                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4901                         "SNOW 3G Generated auth tag not as expected");
4902         }
4903         return 0;
4904 }
4905
4906 static int
4907 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
4908         uint8_t op_mode, uint8_t verify)
4909 {
4910         struct crypto_testsuite_params *ts_params = &testsuite_params;
4911         struct crypto_unittest_params *ut_params = &unittest_params;
4912
4913         int retval;
4914
4915         uint8_t *plaintext = NULL, *ciphertext = NULL;
4916         unsigned int plaintext_pad_len;
4917         unsigned int plaintext_len;
4918         unsigned int ciphertext_pad_len;
4919         unsigned int ciphertext_len;
4920
4921         struct rte_cryptodev_info dev_info;
4922
4923         /* Verify the capabilities */
4924         struct rte_cryptodev_sym_capability_idx cap_idx;
4925         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4926         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
4927         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4928                         &cap_idx) == NULL)
4929                 return -ENOTSUP;
4930         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4931         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4932         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4933                         &cap_idx) == NULL)
4934                 return -ENOTSUP;
4935
4936         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4937
4938         uint64_t feat_flags = dev_info.feature_flags;
4939
4940         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4941                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4942                 printf("Device doesn't support RAW data-path APIs.\n");
4943                 return -ENOTSUP;
4944         }
4945
4946         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4947                 return -ENOTSUP;
4948
4949         if (op_mode == OUT_OF_PLACE) {
4950                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4951                         return -ENOTSUP;
4952                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4953                         printf("Device doesn't support digest encrypted.\n");
4954                         return -ENOTSUP;
4955                 }
4956         }
4957
4958         /* Create KASUMI session */
4959         retval = create_wireless_algo_auth_cipher_session(
4960                         ts_params->valid_devs[0],
4961                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4962                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4963                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4964                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4965                         RTE_CRYPTO_AUTH_KASUMI_F9,
4966                         RTE_CRYPTO_CIPHER_KASUMI_F8,
4967                         tdata->key.data, tdata->key.len,
4968                         0, tdata->digest.len,
4969                         tdata->cipher_iv.len);
4970
4971         if (retval < 0)
4972                 return retval;
4973
4974         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4975         if (op_mode == OUT_OF_PLACE)
4976                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4977
4978         /* clear mbuf payload */
4979         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4980                 rte_pktmbuf_tailroom(ut_params->ibuf));
4981         if (op_mode == OUT_OF_PLACE)
4982                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4983                         rte_pktmbuf_tailroom(ut_params->obuf));
4984
4985         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4986         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4987         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4988         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4989
4990         if (verify) {
4991                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4992                                         ciphertext_pad_len);
4993                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4994                 if (op_mode == OUT_OF_PLACE)
4995                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4996                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4997                         ciphertext_len);
4998         } else {
4999                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5000                                         plaintext_pad_len);
5001                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5002                 if (op_mode == OUT_OF_PLACE)
5003                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5004                 debug_hexdump(stdout, "plaintext:", plaintext,
5005                         plaintext_len);
5006         }
5007
5008         /* Create KASUMI operation */
5009         retval = create_wireless_algo_auth_cipher_operation(
5010                 tdata->digest.data, tdata->digest.len,
5011                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5012                 NULL, 0,
5013                 (tdata->digest.offset_bytes == 0 ?
5014                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5015                         : tdata->digest.offset_bytes),
5016                 tdata->validCipherLenInBits.len,
5017                 tdata->validCipherOffsetInBits.len,
5018                 tdata->validAuthLenInBits.len,
5019                 0,
5020                 op_mode, 0, verify);
5021
5022         if (retval < 0)
5023                 return retval;
5024
5025         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5026                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5027                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5028         else
5029                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5030                         ut_params->op);
5031
5032         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5033
5034         ut_params->obuf = (op_mode == IN_PLACE ?
5035                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5036
5037
5038         if (verify) {
5039                 if (ut_params->obuf)
5040                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5041                                                         uint8_t *);
5042                 else
5043                         plaintext = ciphertext;
5044
5045                 debug_hexdump(stdout, "plaintext:", plaintext,
5046                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5047                 debug_hexdump(stdout, "plaintext expected:",
5048                         tdata->plaintext.data,
5049                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5050         } else {
5051                 if (ut_params->obuf)
5052                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5053                                                         uint8_t *);
5054                 else
5055                         ciphertext = plaintext;
5056
5057                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5058                         ciphertext_len);
5059                 debug_hexdump(stdout, "ciphertext expected:",
5060                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5061
5062                 ut_params->digest = rte_pktmbuf_mtod(
5063                         ut_params->obuf, uint8_t *) +
5064                         (tdata->digest.offset_bytes == 0 ?
5065                         plaintext_pad_len : tdata->digest.offset_bytes);
5066
5067                 debug_hexdump(stdout, "digest:", ut_params->digest,
5068                         tdata->digest.len);
5069                 debug_hexdump(stdout, "digest expected:",
5070                         tdata->digest.data, tdata->digest.len);
5071         }
5072
5073         /* Validate obuf */
5074         if (verify) {
5075                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5076                         plaintext,
5077                         tdata->plaintext.data,
5078                         tdata->plaintext.len >> 3,
5079                         "KASUMI Plaintext data not as expected");
5080         } else {
5081                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5082                         ciphertext,
5083                         tdata->ciphertext.data,
5084                         tdata->ciphertext.len >> 3,
5085                         "KASUMI Ciphertext data not as expected");
5086
5087                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5088                         ut_params->digest,
5089                         tdata->digest.data,
5090                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5091                         "KASUMI Generated auth tag not as expected");
5092         }
5093         return 0;
5094 }
5095
5096 static int
5097 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5098         uint8_t op_mode, uint8_t verify)
5099 {
5100         struct crypto_testsuite_params *ts_params = &testsuite_params;
5101         struct crypto_unittest_params *ut_params = &unittest_params;
5102
5103         int retval;
5104
5105         const uint8_t *plaintext = NULL;
5106         const uint8_t *ciphertext = NULL;
5107         const uint8_t *digest = NULL;
5108         unsigned int plaintext_pad_len;
5109         unsigned int plaintext_len;
5110         unsigned int ciphertext_pad_len;
5111         unsigned int ciphertext_len;
5112         uint8_t buffer[10000];
5113         uint8_t digest_buffer[10000];
5114
5115         struct rte_cryptodev_info dev_info;
5116
5117         /* Verify the capabilities */
5118         struct rte_cryptodev_sym_capability_idx cap_idx;
5119         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5120         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5121         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5122                         &cap_idx) == NULL)
5123                 return -ENOTSUP;
5124         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5125         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5126         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5127                         &cap_idx) == NULL)
5128                 return -ENOTSUP;
5129
5130         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5131                 return -ENOTSUP;
5132
5133         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5134
5135         uint64_t feat_flags = dev_info.feature_flags;
5136
5137         if (op_mode == IN_PLACE) {
5138                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5139                         printf("Device doesn't support in-place scatter-gather "
5140                                         "in both input and output mbufs.\n");
5141                         return -ENOTSUP;
5142                 }
5143                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5144                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5145                         printf("Device doesn't support RAW data-path APIs.\n");
5146                         return -ENOTSUP;
5147                 }
5148         } else {
5149                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5150                         return -ENOTSUP;
5151                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5152                         printf("Device doesn't support out-of-place scatter-gather "
5153                                         "in both input and output mbufs.\n");
5154                         return -ENOTSUP;
5155                 }
5156                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5157                         printf("Device doesn't support digest encrypted.\n");
5158                         return -ENOTSUP;
5159                 }
5160         }
5161
5162         /* Create KASUMI session */
5163         retval = create_wireless_algo_auth_cipher_session(
5164                         ts_params->valid_devs[0],
5165                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5166                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5167                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5168                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5169                         RTE_CRYPTO_AUTH_KASUMI_F9,
5170                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5171                         tdata->key.data, tdata->key.len,
5172                         0, tdata->digest.len,
5173                         tdata->cipher_iv.len);
5174
5175         if (retval < 0)
5176                 return retval;
5177
5178         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5179         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5180         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5181         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5182
5183         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5184                         plaintext_pad_len, 15, 0);
5185         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5186                         "Failed to allocate input buffer in mempool");
5187
5188         if (op_mode == OUT_OF_PLACE) {
5189                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5190                                 plaintext_pad_len, 15, 0);
5191                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5192                                 "Failed to allocate output buffer in mempool");
5193         }
5194
5195         if (verify) {
5196                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5197                         tdata->ciphertext.data);
5198                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5199                                         ciphertext_len, buffer);
5200                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5201                         ciphertext_len);
5202         } else {
5203                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5204                         tdata->plaintext.data);
5205                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5206                                         plaintext_len, buffer);
5207                 debug_hexdump(stdout, "plaintext:", plaintext,
5208                         plaintext_len);
5209         }
5210         memset(buffer, 0, sizeof(buffer));
5211
5212         /* Create KASUMI operation */
5213         retval = create_wireless_algo_auth_cipher_operation(
5214                 tdata->digest.data, tdata->digest.len,
5215                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5216                 NULL, 0,
5217                 (tdata->digest.offset_bytes == 0 ?
5218                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5219                         : tdata->digest.offset_bytes),
5220                 tdata->validCipherLenInBits.len,
5221                 tdata->validCipherOffsetInBits.len,
5222                 tdata->validAuthLenInBits.len,
5223                 0,
5224                 op_mode, 1, verify);
5225
5226         if (retval < 0)
5227                 return retval;
5228
5229         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5230                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5231                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5232         else
5233                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5234                         ut_params->op);
5235
5236         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5237
5238         ut_params->obuf = (op_mode == IN_PLACE ?
5239                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5240
5241         if (verify) {
5242                 if (ut_params->obuf)
5243                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5244                                         plaintext_len, buffer);
5245                 else
5246                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5247                                         plaintext_len, buffer);
5248
5249                 debug_hexdump(stdout, "plaintext:", plaintext,
5250                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5251                 debug_hexdump(stdout, "plaintext expected:",
5252                         tdata->plaintext.data,
5253                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5254         } else {
5255                 if (ut_params->obuf)
5256                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5257                                         ciphertext_len, buffer);
5258                 else
5259                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5260                                         ciphertext_len, buffer);
5261
5262                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5263                         ciphertext_len);
5264                 debug_hexdump(stdout, "ciphertext expected:",
5265                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5266
5267                 if (ut_params->obuf)
5268                         digest = rte_pktmbuf_read(ut_params->obuf,
5269                                 (tdata->digest.offset_bytes == 0 ?
5270                                 plaintext_pad_len : tdata->digest.offset_bytes),
5271                                 tdata->digest.len, digest_buffer);
5272                 else
5273                         digest = rte_pktmbuf_read(ut_params->ibuf,
5274                                 (tdata->digest.offset_bytes == 0 ?
5275                                 plaintext_pad_len : tdata->digest.offset_bytes),
5276                                 tdata->digest.len, digest_buffer);
5277
5278                 debug_hexdump(stdout, "digest:", digest,
5279                         tdata->digest.len);
5280                 debug_hexdump(stdout, "digest expected:",
5281                         tdata->digest.data, tdata->digest.len);
5282         }
5283
5284         /* Validate obuf */
5285         if (verify) {
5286                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5287                         plaintext,
5288                         tdata->plaintext.data,
5289                         tdata->plaintext.len >> 3,
5290                         "KASUMI Plaintext data not as expected");
5291         } else {
5292                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5293                         ciphertext,
5294                         tdata->ciphertext.data,
5295                         tdata->validDataLenInBits.len,
5296                         "KASUMI Ciphertext data not as expected");
5297
5298                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5299                         digest,
5300                         tdata->digest.data,
5301                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5302                         "KASUMI Generated auth tag not as expected");
5303         }
5304         return 0;
5305 }
5306
5307 static int
5308 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5309 {
5310         struct crypto_testsuite_params *ts_params = &testsuite_params;
5311         struct crypto_unittest_params *ut_params = &unittest_params;
5312
5313         int retval;
5314
5315         uint8_t *plaintext, *ciphertext;
5316         unsigned plaintext_pad_len;
5317         unsigned plaintext_len;
5318         struct rte_cryptodev_info dev_info;
5319
5320         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5321         uint64_t feat_flags = dev_info.feature_flags;
5322
5323         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5324                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5325                 printf("Device doesn't support RAW data-path APIs.\n");
5326                 return -ENOTSUP;
5327         }
5328
5329         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5330                 return -ENOTSUP;
5331
5332         /* Verify the capabilities */
5333         struct rte_cryptodev_sym_capability_idx cap_idx;
5334         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5335         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5336         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5337                         &cap_idx) == NULL)
5338                 return -ENOTSUP;
5339         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5340         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5341         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5342                         &cap_idx) == NULL)
5343                 return -ENOTSUP;
5344
5345         /* Create KASUMI session */
5346         retval = create_wireless_algo_cipher_auth_session(
5347                         ts_params->valid_devs[0],
5348                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5349                         RTE_CRYPTO_AUTH_OP_GENERATE,
5350                         RTE_CRYPTO_AUTH_KASUMI_F9,
5351                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5352                         tdata->key.data, tdata->key.len,
5353                         0, tdata->digest.len,
5354                         tdata->cipher_iv.len);
5355         if (retval < 0)
5356                 return retval;
5357
5358         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5359
5360         /* clear mbuf payload */
5361         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5362                         rte_pktmbuf_tailroom(ut_params->ibuf));
5363
5364         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5365         /* Append data which is padded to a multiple of */
5366         /* the algorithms block size */
5367         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5368         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5369                                 plaintext_pad_len);
5370         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5371
5372         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5373
5374         /* Create KASUMI operation */
5375         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5376                                 tdata->digest.len, NULL, 0,
5377                                 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5378                                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5379                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5380                                 tdata->validCipherOffsetInBits.len,
5381                                 tdata->validAuthLenInBits.len,
5382                                 0
5383                                 );
5384         if (retval < 0)
5385                 return retval;
5386
5387         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5388                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5389                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5390         else
5391                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5392                         ut_params->op);
5393         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5394
5395         if (ut_params->op->sym->m_dst)
5396                 ut_params->obuf = ut_params->op->sym->m_dst;
5397         else
5398                 ut_params->obuf = ut_params->op->sym->m_src;
5399
5400         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5401                                 tdata->validCipherOffsetInBits.len >> 3);
5402
5403         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5404                         + plaintext_pad_len;
5405
5406         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5407                                 (tdata->validCipherOffsetInBits.len >> 3);
5408         /* Validate obuf */
5409         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5410                 ciphertext,
5411                 reference_ciphertext,
5412                 tdata->validCipherLenInBits.len,
5413                 "KASUMI Ciphertext data not as expected");
5414
5415         /* Validate obuf */
5416         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5417                 ut_params->digest,
5418                 tdata->digest.data,
5419                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5420                 "KASUMI Generated auth tag not as expected");
5421         return 0;
5422 }
5423
5424 static int
5425 test_zuc_encryption(const struct wireless_test_data *tdata)
5426 {
5427         struct crypto_testsuite_params *ts_params = &testsuite_params;
5428         struct crypto_unittest_params *ut_params = &unittest_params;
5429
5430         int retval;
5431         uint8_t *plaintext, *ciphertext;
5432         unsigned plaintext_pad_len;
5433         unsigned plaintext_len;
5434         struct rte_cryptodev_info dev_info;
5435
5436         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5437         uint64_t feat_flags = dev_info.feature_flags;
5438
5439         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5440                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5441                 printf("Device doesn't support RAW data-path APIs.\n");
5442                 return -ENOTSUP;
5443         }
5444
5445         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5446                 return -ENOTSUP;
5447
5448         struct rte_cryptodev_sym_capability_idx cap_idx;
5449
5450         /* Check if device supports ZUC EEA3 */
5451         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5452         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5453
5454         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5455                         &cap_idx) == NULL)
5456                 return -ENOTSUP;
5457
5458         /* Create ZUC session */
5459         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5460                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5461                                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5462                                         tdata->key.data, tdata->key.len,
5463                                         tdata->cipher_iv.len);
5464         if (retval < 0)
5465                 return retval;
5466
5467         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5468
5469         /* Clear mbuf payload */
5470         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5471                rte_pktmbuf_tailroom(ut_params->ibuf));
5472
5473         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5474         /* Append data which is padded to a multiple */
5475         /* of the algorithms block size */
5476         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5477         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5478                                 plaintext_pad_len);
5479         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5480
5481         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5482
5483         /* Create ZUC operation */
5484         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5485                                         tdata->cipher_iv.len,
5486                                         tdata->plaintext.len,
5487                                         0);
5488         if (retval < 0)
5489                 return retval;
5490
5491         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5492                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5493                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5494         else
5495                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5496                                                 ut_params->op);
5497         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5498
5499         ut_params->obuf = ut_params->op->sym->m_dst;
5500         if (ut_params->obuf)
5501                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5502         else
5503                 ciphertext = plaintext;
5504
5505         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5506
5507         /* Validate obuf */
5508         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5509                 ciphertext,
5510                 tdata->ciphertext.data,
5511                 tdata->validCipherLenInBits.len,
5512                 "ZUC Ciphertext data not as expected");
5513         return 0;
5514 }
5515
5516 static int
5517 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
5518 {
5519         struct crypto_testsuite_params *ts_params = &testsuite_params;
5520         struct crypto_unittest_params *ut_params = &unittest_params;
5521
5522         int retval;
5523
5524         unsigned int plaintext_pad_len;
5525         unsigned int plaintext_len;
5526         const uint8_t *ciphertext;
5527         uint8_t ciphertext_buffer[2048];
5528         struct rte_cryptodev_info dev_info;
5529
5530         struct rte_cryptodev_sym_capability_idx cap_idx;
5531
5532         /* Check if device supports ZUC EEA3 */
5533         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5534         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5535
5536         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5537                         &cap_idx) == NULL)
5538                 return -ENOTSUP;
5539
5540         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5541                 return -ENOTSUP;
5542
5543         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5544
5545         uint64_t feat_flags = dev_info.feature_flags;
5546
5547         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5548                 printf("Device doesn't support in-place scatter-gather. "
5549                                 "Test Skipped.\n");
5550                 return -ENOTSUP;
5551         }
5552
5553         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5554                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5555                 printf("Device doesn't support RAW data-path APIs.\n");
5556                 return -ENOTSUP;
5557         }
5558
5559         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5560
5561         /* Append data which is padded to a multiple */
5562         /* of the algorithms block size */
5563         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5564
5565         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5566                         plaintext_pad_len, 10, 0);
5567
5568         pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5569                         tdata->plaintext.data);
5570
5571         /* Create ZUC session */
5572         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5573                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5574                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5575                         tdata->key.data, tdata->key.len,
5576                         tdata->cipher_iv.len);
5577         if (retval < 0)
5578                 return retval;
5579
5580         /* Clear mbuf payload */
5581
5582         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
5583
5584         /* Create ZUC operation */
5585         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5586                         tdata->cipher_iv.len, tdata->plaintext.len,
5587                         0);
5588         if (retval < 0)
5589                 return retval;
5590
5591         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5592                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5593                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5594         else
5595                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5596                                                 ut_params->op);
5597         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5598
5599         ut_params->obuf = ut_params->op->sym->m_dst;
5600         if (ut_params->obuf)
5601                 ciphertext = rte_pktmbuf_read(ut_params->obuf,
5602                         0, plaintext_len, ciphertext_buffer);
5603         else
5604                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
5605                         0, plaintext_len, ciphertext_buffer);
5606
5607         /* Validate obuf */
5608         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5609
5610         /* Validate obuf */
5611         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5612                 ciphertext,
5613                 tdata->ciphertext.data,
5614                 tdata->validCipherLenInBits.len,
5615                 "ZUC Ciphertext data not as expected");
5616
5617         return 0;
5618 }
5619
5620 static int
5621 test_zuc_authentication(const struct wireless_test_data *tdata)
5622 {
5623         struct crypto_testsuite_params *ts_params = &testsuite_params;
5624         struct crypto_unittest_params *ut_params = &unittest_params;
5625
5626         int retval;
5627         unsigned plaintext_pad_len;
5628         unsigned plaintext_len;
5629         uint8_t *plaintext;
5630
5631         struct rte_cryptodev_sym_capability_idx cap_idx;
5632         struct rte_cryptodev_info dev_info;
5633
5634         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5635         uint64_t feat_flags = dev_info.feature_flags;
5636
5637         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
5638                         (tdata->validAuthLenInBits.len % 8 != 0)) {
5639                 printf("Device doesn't support NON-Byte Aligned Data.\n");
5640                 return -ENOTSUP;
5641         }
5642
5643         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5644                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5645                 printf("Device doesn't support RAW data-path APIs.\n");
5646                 return -ENOTSUP;
5647         }
5648
5649         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5650                 return -ENOTSUP;
5651
5652         /* Check if device supports ZUC EIA3 */
5653         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5654         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5655
5656         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5657                         &cap_idx) == NULL)
5658                 return -ENOTSUP;
5659
5660         /* Create ZUC session */
5661         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
5662                         tdata->key.data, tdata->key.len,
5663                         tdata->auth_iv.len, tdata->digest.len,
5664                         RTE_CRYPTO_AUTH_OP_GENERATE,
5665                         RTE_CRYPTO_AUTH_ZUC_EIA3);
5666         if (retval < 0)
5667                 return retval;
5668
5669         /* alloc mbuf and set payload */
5670         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5671
5672         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5673         rte_pktmbuf_tailroom(ut_params->ibuf));
5674
5675         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5676         /* Append data which is padded to a multiple of */
5677         /* the algorithms block size */
5678         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5679         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5680                                 plaintext_pad_len);
5681         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5682
5683         /* Create ZUC operation */
5684         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
5685                         tdata->auth_iv.data, tdata->auth_iv.len,
5686                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5687                         tdata->validAuthLenInBits.len,
5688                         0);
5689         if (retval < 0)
5690                 return retval;
5691
5692         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5693                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5694                                 ut_params->op, 0, 1, 1, 0);
5695         else
5696                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5697                                 ut_params->op);
5698         ut_params->obuf = ut_params->op->sym->m_src;
5699         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5700         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5701                         + plaintext_pad_len;
5702
5703         /* Validate obuf */
5704         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5705         ut_params->digest,
5706         tdata->digest.data,
5707         tdata->digest.len,
5708         "ZUC Generated auth tag not as expected");
5709
5710         return 0;
5711 }
5712
5713 static int
5714 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
5715         uint8_t op_mode, uint8_t verify)
5716 {
5717         struct crypto_testsuite_params *ts_params = &testsuite_params;
5718         struct crypto_unittest_params *ut_params = &unittest_params;
5719
5720         int retval;
5721
5722         uint8_t *plaintext = NULL, *ciphertext = NULL;
5723         unsigned int plaintext_pad_len;
5724         unsigned int plaintext_len;
5725         unsigned int ciphertext_pad_len;
5726         unsigned int ciphertext_len;
5727
5728         struct rte_cryptodev_info dev_info;
5729         struct rte_cryptodev_sym_capability_idx cap_idx;
5730
5731         /* Check if device supports ZUC EIA3 */
5732         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5733         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5734
5735         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5736                         &cap_idx) == NULL)
5737                 return -ENOTSUP;
5738
5739         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5740
5741         uint64_t feat_flags = dev_info.feature_flags;
5742
5743         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5744                 printf("Device doesn't support digest encrypted.\n");
5745                 return -ENOTSUP;
5746         }
5747         if (op_mode == IN_PLACE) {
5748                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5749                         printf("Device doesn't support in-place scatter-gather "
5750                                         "in both input and output mbufs.\n");
5751                         return -ENOTSUP;
5752                 }
5753
5754                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5755                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5756                         printf("Device doesn't support RAW data-path APIs.\n");
5757                         return -ENOTSUP;
5758                 }
5759         } else {
5760                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5761                         return -ENOTSUP;
5762                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5763                         printf("Device doesn't support out-of-place scatter-gather "
5764                                         "in both input and output mbufs.\n");
5765                         return -ENOTSUP;
5766                 }
5767         }
5768
5769         /* Create ZUC session */
5770         retval = create_wireless_algo_auth_cipher_session(
5771                         ts_params->valid_devs[0],
5772                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5773                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5774                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5775                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5776                         RTE_CRYPTO_AUTH_ZUC_EIA3,
5777                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5778                         tdata->key.data, tdata->key.len,
5779                         tdata->auth_iv.len, tdata->digest.len,
5780                         tdata->cipher_iv.len);
5781
5782         if (retval < 0)
5783                 return retval;
5784
5785         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5786         if (op_mode == OUT_OF_PLACE)
5787                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5788
5789         /* clear mbuf payload */
5790         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5791                 rte_pktmbuf_tailroom(ut_params->ibuf));
5792         if (op_mode == OUT_OF_PLACE)
5793                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5794                         rte_pktmbuf_tailroom(ut_params->obuf));
5795
5796         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5797         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5798         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5799         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5800
5801         if (verify) {
5802                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5803                                         ciphertext_pad_len);
5804                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5805                 if (op_mode == OUT_OF_PLACE)
5806                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5807                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5808                         ciphertext_len);
5809         } else {
5810                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5811                                         plaintext_pad_len);
5812                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5813                 if (op_mode == OUT_OF_PLACE)
5814                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5815                 debug_hexdump(stdout, "plaintext:", plaintext,
5816                         plaintext_len);
5817         }
5818
5819         /* Create ZUC operation */
5820         retval = create_wireless_algo_auth_cipher_operation(
5821                 tdata->digest.data, tdata->digest.len,
5822                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5823                 tdata->auth_iv.data, tdata->auth_iv.len,
5824                 (tdata->digest.offset_bytes == 0 ?
5825                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5826                         : tdata->digest.offset_bytes),
5827                 tdata->validCipherLenInBits.len,
5828                 tdata->validCipherOffsetInBits.len,
5829                 tdata->validAuthLenInBits.len,
5830                 0,
5831                 op_mode, 0, verify);
5832
5833         if (retval < 0)
5834                 return retval;
5835
5836         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5837                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5838                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5839         else
5840                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5841                         ut_params->op);
5842
5843         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5844
5845         ut_params->obuf = (op_mode == IN_PLACE ?
5846                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5847
5848
5849         if (verify) {
5850                 if (ut_params->obuf)
5851                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5852                                                         uint8_t *);
5853                 else
5854                         plaintext = ciphertext;
5855
5856                 debug_hexdump(stdout, "plaintext:", plaintext,
5857                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5858                 debug_hexdump(stdout, "plaintext expected:",
5859                         tdata->plaintext.data,
5860                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5861         } else {
5862                 if (ut_params->obuf)
5863                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5864                                                         uint8_t *);
5865                 else
5866                         ciphertext = plaintext;
5867
5868                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5869                         ciphertext_len);
5870                 debug_hexdump(stdout, "ciphertext expected:",
5871                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5872
5873                 ut_params->digest = rte_pktmbuf_mtod(
5874                         ut_params->obuf, uint8_t *) +
5875                         (tdata->digest.offset_bytes == 0 ?
5876                         plaintext_pad_len : tdata->digest.offset_bytes);
5877
5878                 debug_hexdump(stdout, "digest:", ut_params->digest,
5879                         tdata->digest.len);
5880                 debug_hexdump(stdout, "digest expected:",
5881                         tdata->digest.data, tdata->digest.len);
5882         }
5883
5884         /* Validate obuf */
5885         if (verify) {
5886                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5887                         plaintext,
5888                         tdata->plaintext.data,
5889                         tdata->plaintext.len >> 3,
5890                         "ZUC Plaintext data not as expected");
5891         } else {
5892                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5893                         ciphertext,
5894                         tdata->ciphertext.data,
5895                         tdata->ciphertext.len >> 3,
5896                         "ZUC Ciphertext data not as expected");
5897
5898                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5899                         ut_params->digest,
5900                         tdata->digest.data,
5901                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5902                         "ZUC Generated auth tag not as expected");
5903         }
5904         return 0;
5905 }
5906
5907 static int
5908 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
5909         uint8_t op_mode, uint8_t verify)
5910 {
5911         struct crypto_testsuite_params *ts_params = &testsuite_params;
5912         struct crypto_unittest_params *ut_params = &unittest_params;
5913
5914         int retval;
5915
5916         const uint8_t *plaintext = NULL;
5917         const uint8_t *ciphertext = NULL;
5918         const uint8_t *digest = NULL;
5919         unsigned int plaintext_pad_len;
5920         unsigned int plaintext_len;
5921         unsigned int ciphertext_pad_len;
5922         unsigned int ciphertext_len;
5923         uint8_t buffer[10000];
5924         uint8_t digest_buffer[10000];
5925
5926         struct rte_cryptodev_info dev_info;
5927         struct rte_cryptodev_sym_capability_idx cap_idx;
5928
5929         /* Check if device supports ZUC EIA3 */
5930         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5931         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5932
5933         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5934                         &cap_idx) == NULL)
5935                 return -ENOTSUP;
5936
5937         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5938
5939         uint64_t feat_flags = dev_info.feature_flags;
5940
5941         if (op_mode == IN_PLACE) {
5942                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5943                         printf("Device doesn't support in-place scatter-gather "
5944                                         "in both input and output mbufs.\n");
5945                         return -ENOTSUP;
5946                 }
5947
5948                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5949                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5950                         printf("Device doesn't support RAW data-path APIs.\n");
5951                         return -ENOTSUP;
5952                 }
5953         } else {
5954                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5955                         return -ENOTSUP;
5956                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5957                         printf("Device doesn't support out-of-place scatter-gather "
5958                                         "in both input and output mbufs.\n");
5959                         return -ENOTSUP;
5960                 }
5961                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5962                         printf("Device doesn't support digest encrypted.\n");
5963                         return -ENOTSUP;
5964                 }
5965         }
5966
5967         /* Create ZUC session */
5968         retval = create_wireless_algo_auth_cipher_session(
5969                         ts_params->valid_devs[0],
5970                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5971                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5972                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5973                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5974                         RTE_CRYPTO_AUTH_ZUC_EIA3,
5975                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5976                         tdata->key.data, tdata->key.len,
5977                         tdata->auth_iv.len, tdata->digest.len,
5978                         tdata->cipher_iv.len);
5979
5980         if (retval < 0)
5981                 return retval;
5982
5983         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5984         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5985         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5986         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5987
5988         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5989                         plaintext_pad_len, 15, 0);
5990         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5991                         "Failed to allocate input buffer in mempool");
5992
5993         if (op_mode == OUT_OF_PLACE) {
5994                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5995                                 plaintext_pad_len, 15, 0);
5996                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5997                                 "Failed to allocate output buffer in mempool");
5998         }
5999
6000         if (verify) {
6001                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6002                         tdata->ciphertext.data);
6003                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6004                                         ciphertext_len, buffer);
6005                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6006                         ciphertext_len);
6007         } else {
6008                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6009                         tdata->plaintext.data);
6010                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6011                                         plaintext_len, buffer);
6012                 debug_hexdump(stdout, "plaintext:", plaintext,
6013                         plaintext_len);
6014         }
6015         memset(buffer, 0, sizeof(buffer));
6016
6017         /* Create ZUC operation */
6018         retval = create_wireless_algo_auth_cipher_operation(
6019                 tdata->digest.data, tdata->digest.len,
6020                 tdata->cipher_iv.data, tdata->cipher_iv.len,
6021                 NULL, 0,
6022                 (tdata->digest.offset_bytes == 0 ?
6023                 (verify ? ciphertext_pad_len : plaintext_pad_len)
6024                         : tdata->digest.offset_bytes),
6025                 tdata->validCipherLenInBits.len,
6026                 tdata->validCipherOffsetInBits.len,
6027                 tdata->validAuthLenInBits.len,
6028                 0,
6029                 op_mode, 1, verify);
6030
6031         if (retval < 0)
6032                 return retval;
6033
6034         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6035                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6036                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6037         else
6038                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6039                         ut_params->op);
6040
6041         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6042
6043         ut_params->obuf = (op_mode == IN_PLACE ?
6044                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6045
6046         if (verify) {
6047                 if (ut_params->obuf)
6048                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6049                                         plaintext_len, buffer);
6050                 else
6051                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6052                                         plaintext_len, buffer);
6053
6054                 debug_hexdump(stdout, "plaintext:", plaintext,
6055                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6056                 debug_hexdump(stdout, "plaintext expected:",
6057                         tdata->plaintext.data,
6058                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6059         } else {
6060                 if (ut_params->obuf)
6061                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6062                                         ciphertext_len, buffer);
6063                 else
6064                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6065                                         ciphertext_len, buffer);
6066
6067                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6068                         ciphertext_len);
6069                 debug_hexdump(stdout, "ciphertext expected:",
6070                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6071
6072                 if (ut_params->obuf)
6073                         digest = rte_pktmbuf_read(ut_params->obuf,
6074                                 (tdata->digest.offset_bytes == 0 ?
6075                                 plaintext_pad_len : tdata->digest.offset_bytes),
6076                                 tdata->digest.len, digest_buffer);
6077                 else
6078                         digest = rte_pktmbuf_read(ut_params->ibuf,
6079                                 (tdata->digest.offset_bytes == 0 ?
6080                                 plaintext_pad_len : tdata->digest.offset_bytes),
6081                                 tdata->digest.len, digest_buffer);
6082
6083                 debug_hexdump(stdout, "digest:", digest,
6084                         tdata->digest.len);
6085                 debug_hexdump(stdout, "digest expected:",
6086                         tdata->digest.data, tdata->digest.len);
6087         }
6088
6089         /* Validate obuf */
6090         if (verify) {
6091                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6092                         plaintext,
6093                         tdata->plaintext.data,
6094                         tdata->plaintext.len >> 3,
6095                         "ZUC Plaintext data not as expected");
6096         } else {
6097                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6098                         ciphertext,
6099                         tdata->ciphertext.data,
6100                         tdata->validDataLenInBits.len,
6101                         "ZUC Ciphertext data not as expected");
6102
6103                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6104                         digest,
6105                         tdata->digest.data,
6106                         DIGEST_BYTE_LENGTH_KASUMI_F9,
6107                         "ZUC Generated auth tag not as expected");
6108         }
6109         return 0;
6110 }
6111
6112 static int
6113 test_kasumi_encryption_test_case_1(void)
6114 {
6115         return test_kasumi_encryption(&kasumi_test_case_1);
6116 }
6117
6118 static int
6119 test_kasumi_encryption_test_case_1_sgl(void)
6120 {
6121         return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6122 }
6123
6124 static int
6125 test_kasumi_encryption_test_case_1_oop(void)
6126 {
6127         return test_kasumi_encryption_oop(&kasumi_test_case_1);
6128 }
6129
6130 static int
6131 test_kasumi_encryption_test_case_1_oop_sgl(void)
6132 {
6133         return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6134 }
6135
6136 static int
6137 test_kasumi_encryption_test_case_2(void)
6138 {
6139         return test_kasumi_encryption(&kasumi_test_case_2);
6140 }
6141
6142 static int
6143 test_kasumi_encryption_test_case_3(void)
6144 {
6145         return test_kasumi_encryption(&kasumi_test_case_3);
6146 }
6147
6148 static int
6149 test_kasumi_encryption_test_case_4(void)
6150 {
6151         return test_kasumi_encryption(&kasumi_test_case_4);
6152 }
6153
6154 static int
6155 test_kasumi_encryption_test_case_5(void)
6156 {
6157         return test_kasumi_encryption(&kasumi_test_case_5);
6158 }
6159
6160 static int
6161 test_kasumi_decryption_test_case_1(void)
6162 {
6163         return test_kasumi_decryption(&kasumi_test_case_1);
6164 }
6165
6166 static int
6167 test_kasumi_decryption_test_case_1_oop(void)
6168 {
6169         return test_kasumi_decryption_oop(&kasumi_test_case_1);
6170 }
6171
6172 static int
6173 test_kasumi_decryption_test_case_2(void)
6174 {
6175         return test_kasumi_decryption(&kasumi_test_case_2);
6176 }
6177
6178 static int
6179 test_kasumi_decryption_test_case_3(void)
6180 {
6181         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6182         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6183                 return -ENOTSUP;
6184         return test_kasumi_decryption(&kasumi_test_case_3);
6185 }
6186
6187 static int
6188 test_kasumi_decryption_test_case_4(void)
6189 {
6190         return test_kasumi_decryption(&kasumi_test_case_4);
6191 }
6192
6193 static int
6194 test_kasumi_decryption_test_case_5(void)
6195 {
6196         return test_kasumi_decryption(&kasumi_test_case_5);
6197 }
6198 static int
6199 test_snow3g_encryption_test_case_1(void)
6200 {
6201         return test_snow3g_encryption(&snow3g_test_case_1);
6202 }
6203
6204 static int
6205 test_snow3g_encryption_test_case_1_oop(void)
6206 {
6207         return test_snow3g_encryption_oop(&snow3g_test_case_1);
6208 }
6209
6210 static int
6211 test_snow3g_encryption_test_case_1_oop_sgl(void)
6212 {
6213         return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6214 }
6215
6216
6217 static int
6218 test_snow3g_encryption_test_case_1_offset_oop(void)
6219 {
6220         return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6221 }
6222
6223 static int
6224 test_snow3g_encryption_test_case_2(void)
6225 {
6226         return test_snow3g_encryption(&snow3g_test_case_2);
6227 }
6228
6229 static int
6230 test_snow3g_encryption_test_case_3(void)
6231 {
6232         return test_snow3g_encryption(&snow3g_test_case_3);
6233 }
6234
6235 static int
6236 test_snow3g_encryption_test_case_4(void)
6237 {
6238         return test_snow3g_encryption(&snow3g_test_case_4);
6239 }
6240
6241 static int
6242 test_snow3g_encryption_test_case_5(void)
6243 {
6244         return test_snow3g_encryption(&snow3g_test_case_5);
6245 }
6246
6247 static int
6248 test_snow3g_decryption_test_case_1(void)
6249 {
6250         return test_snow3g_decryption(&snow3g_test_case_1);
6251 }
6252
6253 static int
6254 test_snow3g_decryption_test_case_1_oop(void)
6255 {
6256         return test_snow3g_decryption_oop(&snow3g_test_case_1);
6257 }
6258
6259 static int
6260 test_snow3g_decryption_test_case_2(void)
6261 {
6262         return test_snow3g_decryption(&snow3g_test_case_2);
6263 }
6264
6265 static int
6266 test_snow3g_decryption_test_case_3(void)
6267 {
6268         return test_snow3g_decryption(&snow3g_test_case_3);
6269 }
6270
6271 static int
6272 test_snow3g_decryption_test_case_4(void)
6273 {
6274         return test_snow3g_decryption(&snow3g_test_case_4);
6275 }
6276
6277 static int
6278 test_snow3g_decryption_test_case_5(void)
6279 {
6280         return test_snow3g_decryption(&snow3g_test_case_5);
6281 }
6282
6283 /*
6284  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6285  * Pattern digest from snow3g_test_data must be allocated as
6286  * 4 last bytes in plaintext.
6287  */
6288 static void
6289 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6290                 struct snow3g_hash_test_data *output)
6291 {
6292         if ((pattern != NULL) && (output != NULL)) {
6293                 output->key.len = pattern->key.len;
6294
6295                 memcpy(output->key.data,
6296                 pattern->key.data, pattern->key.len);
6297
6298                 output->auth_iv.len = pattern->auth_iv.len;
6299
6300                 memcpy(output->auth_iv.data,
6301                 pattern->auth_iv.data, pattern->auth_iv.len);
6302
6303                 output->plaintext.len = pattern->plaintext.len;
6304
6305                 memcpy(output->plaintext.data,
6306                 pattern->plaintext.data, pattern->plaintext.len >> 3);
6307
6308                 output->digest.len = pattern->digest.len;
6309
6310                 memcpy(output->digest.data,
6311                 &pattern->plaintext.data[pattern->digest.offset_bytes],
6312                 pattern->digest.len);
6313
6314                 output->validAuthLenInBits.len =
6315                 pattern->validAuthLenInBits.len;
6316         }
6317 }
6318
6319 /*
6320  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6321  */
6322 static int
6323 test_snow3g_decryption_with_digest_test_case_1(void)
6324 {
6325         struct snow3g_hash_test_data snow3g_hash_data;
6326         struct rte_cryptodev_info dev_info;
6327         struct crypto_testsuite_params *ts_params = &testsuite_params;
6328
6329         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6330         uint64_t feat_flags = dev_info.feature_flags;
6331
6332         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6333                 printf("Device doesn't support encrypted digest operations.\n");
6334                 return -ENOTSUP;
6335         }
6336
6337         /*
6338          * Function prepare data for hash veryfication test case.
6339          * Digest is allocated in 4 last bytes in plaintext, pattern.
6340          */
6341         snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6342
6343         return test_snow3g_decryption(&snow3g_test_case_7) &
6344                         test_snow3g_authentication_verify(&snow3g_hash_data);
6345 }
6346
6347 static int
6348 test_snow3g_cipher_auth_test_case_1(void)
6349 {
6350         return test_snow3g_cipher_auth(&snow3g_test_case_3);
6351 }
6352
6353 static int
6354 test_snow3g_auth_cipher_test_case_1(void)
6355 {
6356         return test_snow3g_auth_cipher(
6357                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6358 }
6359
6360 static int
6361 test_snow3g_auth_cipher_test_case_2(void)
6362 {
6363         return test_snow3g_auth_cipher(
6364                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6365 }
6366
6367 static int
6368 test_snow3g_auth_cipher_test_case_2_oop(void)
6369 {
6370         return test_snow3g_auth_cipher(
6371                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6372 }
6373
6374 static int
6375 test_snow3g_auth_cipher_part_digest_enc(void)
6376 {
6377         return test_snow3g_auth_cipher(
6378                 &snow3g_auth_cipher_partial_digest_encryption,
6379                         IN_PLACE, 0);
6380 }
6381
6382 static int
6383 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6384 {
6385         return test_snow3g_auth_cipher(
6386                 &snow3g_auth_cipher_partial_digest_encryption,
6387                         OUT_OF_PLACE, 0);
6388 }
6389
6390 static int
6391 test_snow3g_auth_cipher_test_case_3_sgl(void)
6392 {
6393         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6394         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6395                 return -ENOTSUP;
6396         return test_snow3g_auth_cipher_sgl(
6397                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6398 }
6399
6400 static int
6401 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6402 {
6403         return test_snow3g_auth_cipher_sgl(
6404                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6405 }
6406
6407 static int
6408 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6409 {
6410         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6411         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6412                 return -ENOTSUP;
6413         return test_snow3g_auth_cipher_sgl(
6414                 &snow3g_auth_cipher_partial_digest_encryption,
6415                         IN_PLACE, 0);
6416 }
6417
6418 static int
6419 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6420 {
6421         return test_snow3g_auth_cipher_sgl(
6422                 &snow3g_auth_cipher_partial_digest_encryption,
6423                         OUT_OF_PLACE, 0);
6424 }
6425
6426 static int
6427 test_snow3g_auth_cipher_verify_test_case_1(void)
6428 {
6429         return test_snow3g_auth_cipher(
6430                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6431 }
6432
6433 static int
6434 test_snow3g_auth_cipher_verify_test_case_2(void)
6435 {
6436         return test_snow3g_auth_cipher(
6437                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6438 }
6439
6440 static int
6441 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6442 {
6443         return test_snow3g_auth_cipher(
6444                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6445 }
6446
6447 static int
6448 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6449 {
6450         return test_snow3g_auth_cipher(
6451                 &snow3g_auth_cipher_partial_digest_encryption,
6452                         IN_PLACE, 1);
6453 }
6454
6455 static int
6456 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6457 {
6458         return test_snow3g_auth_cipher(
6459                 &snow3g_auth_cipher_partial_digest_encryption,
6460                         OUT_OF_PLACE, 1);
6461 }
6462
6463 static int
6464 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6465 {
6466         return test_snow3g_auth_cipher_sgl(
6467                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6468 }
6469
6470 static int
6471 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6472 {
6473         return test_snow3g_auth_cipher_sgl(
6474                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6475 }
6476
6477 static int
6478 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6479 {
6480         return test_snow3g_auth_cipher_sgl(
6481                 &snow3g_auth_cipher_partial_digest_encryption,
6482                         IN_PLACE, 1);
6483 }
6484
6485 static int
6486 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6487 {
6488         return test_snow3g_auth_cipher_sgl(
6489                 &snow3g_auth_cipher_partial_digest_encryption,
6490                         OUT_OF_PLACE, 1);
6491 }
6492
6493 static int
6494 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6495 {
6496         return test_snow3g_auth_cipher(
6497                 &snow3g_test_case_7, IN_PLACE, 0);
6498 }
6499
6500 static int
6501 test_kasumi_auth_cipher_test_case_1(void)
6502 {
6503         return test_kasumi_auth_cipher(
6504                 &kasumi_test_case_3, IN_PLACE, 0);
6505 }
6506
6507 static int
6508 test_kasumi_auth_cipher_test_case_2(void)
6509 {
6510         return test_kasumi_auth_cipher(
6511                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6512 }
6513
6514 static int
6515 test_kasumi_auth_cipher_test_case_2_oop(void)
6516 {
6517         return test_kasumi_auth_cipher(
6518                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6519 }
6520
6521 static int
6522 test_kasumi_auth_cipher_test_case_2_sgl(void)
6523 {
6524         return test_kasumi_auth_cipher_sgl(
6525                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6526 }
6527
6528 static int
6529 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6530 {
6531         return test_kasumi_auth_cipher_sgl(
6532                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6533 }
6534
6535 static int
6536 test_kasumi_auth_cipher_verify_test_case_1(void)
6537 {
6538         return test_kasumi_auth_cipher(
6539                 &kasumi_test_case_3, IN_PLACE, 1);
6540 }
6541
6542 static int
6543 test_kasumi_auth_cipher_verify_test_case_2(void)
6544 {
6545         return test_kasumi_auth_cipher(
6546                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6547 }
6548
6549 static int
6550 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
6551 {
6552         return test_kasumi_auth_cipher(
6553                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6554 }
6555
6556 static int
6557 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
6558 {
6559         return test_kasumi_auth_cipher_sgl(
6560                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6561 }
6562
6563 static int
6564 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
6565 {
6566         return test_kasumi_auth_cipher_sgl(
6567                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6568 }
6569
6570 static int
6571 test_kasumi_cipher_auth_test_case_1(void)
6572 {
6573         return test_kasumi_cipher_auth(&kasumi_test_case_6);
6574 }
6575
6576 static int
6577 test_zuc_encryption_test_case_1(void)
6578 {
6579         return test_zuc_encryption(&zuc_test_case_cipher_193b);
6580 }
6581
6582 static int
6583 test_zuc_encryption_test_case_2(void)
6584 {
6585         return test_zuc_encryption(&zuc_test_case_cipher_800b);
6586 }
6587
6588 static int
6589 test_zuc_encryption_test_case_3(void)
6590 {
6591         return test_zuc_encryption(&zuc_test_case_cipher_1570b);
6592 }
6593
6594 static int
6595 test_zuc_encryption_test_case_4(void)
6596 {
6597         return test_zuc_encryption(&zuc_test_case_cipher_2798b);
6598 }
6599
6600 static int
6601 test_zuc_encryption_test_case_5(void)
6602 {
6603         return test_zuc_encryption(&zuc_test_case_cipher_4019b);
6604 }
6605
6606 static int
6607 test_zuc_encryption_test_case_6_sgl(void)
6608 {
6609         return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
6610 }
6611
6612 static int
6613 test_zuc_hash_generate_test_case_1(void)
6614 {
6615         return test_zuc_authentication(&zuc_test_case_auth_1b);
6616 }
6617
6618 static int
6619 test_zuc_hash_generate_test_case_2(void)
6620 {
6621         return test_zuc_authentication(&zuc_test_case_auth_90b);
6622 }
6623
6624 static int
6625 test_zuc_hash_generate_test_case_3(void)
6626 {
6627         return test_zuc_authentication(&zuc_test_case_auth_577b);
6628 }
6629
6630 static int
6631 test_zuc_hash_generate_test_case_4(void)
6632 {
6633         return test_zuc_authentication(&zuc_test_case_auth_2079b);
6634 }
6635
6636 static int
6637 test_zuc_hash_generate_test_case_5(void)
6638 {
6639         return test_zuc_authentication(&zuc_test_auth_5670b);
6640 }
6641
6642 static int
6643 test_zuc_hash_generate_test_case_6(void)
6644 {
6645         return test_zuc_authentication(&zuc_test_case_auth_128b);
6646 }
6647
6648 static int
6649 test_zuc_hash_generate_test_case_7(void)
6650 {
6651         return test_zuc_authentication(&zuc_test_case_auth_2080b);
6652 }
6653
6654 static int
6655 test_zuc_hash_generate_test_case_8(void)
6656 {
6657         return test_zuc_authentication(&zuc_test_case_auth_584b);
6658 }
6659
6660 static int
6661 test_zuc_cipher_auth_test_case_1(void)
6662 {
6663         return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
6664 }
6665
6666 static int
6667 test_zuc_cipher_auth_test_case_2(void)
6668 {
6669         return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
6670 }
6671
6672 static int
6673 test_zuc_auth_cipher_test_case_1(void)
6674 {
6675         return test_zuc_auth_cipher(
6676                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6677 }
6678
6679 static int
6680 test_zuc_auth_cipher_test_case_1_oop(void)
6681 {
6682         return test_zuc_auth_cipher(
6683                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6684 }
6685
6686 static int
6687 test_zuc_auth_cipher_test_case_1_sgl(void)
6688 {
6689         return test_zuc_auth_cipher_sgl(
6690                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6691 }
6692
6693 static int
6694 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
6695 {
6696         return test_zuc_auth_cipher_sgl(
6697                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6698 }
6699
6700 static int
6701 test_zuc_auth_cipher_verify_test_case_1(void)
6702 {
6703         return test_zuc_auth_cipher(
6704                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6705 }
6706
6707 static int
6708 test_zuc_auth_cipher_verify_test_case_1_oop(void)
6709 {
6710         return test_zuc_auth_cipher(
6711                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6712 }
6713
6714 static int
6715 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
6716 {
6717         return test_zuc_auth_cipher_sgl(
6718                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6719 }
6720
6721 static int
6722 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
6723 {
6724         return test_zuc_auth_cipher_sgl(
6725                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6726 }
6727
6728 static int
6729 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
6730 {
6731         uint8_t dev_id = testsuite_params.valid_devs[0];
6732
6733         struct rte_cryptodev_sym_capability_idx cap_idx;
6734
6735         /* Check if device supports particular cipher algorithm */
6736         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6737         cap_idx.algo.cipher = tdata->cipher_algo;
6738         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6739                 return -ENOTSUP;
6740
6741         /* Check if device supports particular hash algorithm */
6742         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6743         cap_idx.algo.auth = tdata->auth_algo;
6744         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6745                 return -ENOTSUP;
6746
6747         return 0;
6748 }
6749
6750 static int
6751 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
6752         uint8_t op_mode, uint8_t verify)
6753 {
6754         struct crypto_testsuite_params *ts_params = &testsuite_params;
6755         struct crypto_unittest_params *ut_params = &unittest_params;
6756
6757         int retval;
6758
6759         uint8_t *plaintext = NULL, *ciphertext = NULL;
6760         unsigned int plaintext_pad_len;
6761         unsigned int plaintext_len;
6762         unsigned int ciphertext_pad_len;
6763         unsigned int ciphertext_len;
6764
6765         struct rte_cryptodev_info dev_info;
6766         struct rte_crypto_op *op;
6767
6768         /* Check if device supports particular algorithms separately */
6769         if (test_mixed_check_if_unsupported(tdata))
6770                 return -ENOTSUP;
6771         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6772                 return -ENOTSUP;
6773
6774         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6775
6776         uint64_t feat_flags = dev_info.feature_flags;
6777
6778         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6779                 printf("Device doesn't support digest encrypted.\n");
6780                 return -ENOTSUP;
6781         }
6782
6783         /* Create the session */
6784         if (verify)
6785                 retval = create_wireless_algo_cipher_auth_session(
6786                                 ts_params->valid_devs[0],
6787                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
6788                                 RTE_CRYPTO_AUTH_OP_VERIFY,
6789                                 tdata->auth_algo,
6790                                 tdata->cipher_algo,
6791                                 tdata->auth_key.data, tdata->auth_key.len,
6792                                 tdata->auth_iv.len, tdata->digest_enc.len,
6793                                 tdata->cipher_iv.len);
6794         else
6795                 retval = create_wireless_algo_auth_cipher_session(
6796                                 ts_params->valid_devs[0],
6797                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6798                                 RTE_CRYPTO_AUTH_OP_GENERATE,
6799                                 tdata->auth_algo,
6800                                 tdata->cipher_algo,
6801                                 tdata->auth_key.data, tdata->auth_key.len,
6802                                 tdata->auth_iv.len, tdata->digest_enc.len,
6803                                 tdata->cipher_iv.len);
6804         if (retval < 0)
6805                 return retval;
6806
6807         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6808         if (op_mode == OUT_OF_PLACE)
6809                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6810
6811         /* clear mbuf payload */
6812         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6813                 rte_pktmbuf_tailroom(ut_params->ibuf));
6814         if (op_mode == OUT_OF_PLACE) {
6815
6816                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6817                                 rte_pktmbuf_tailroom(ut_params->obuf));
6818         }
6819
6820         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
6821         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
6822         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6823         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6824
6825         if (verify) {
6826                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6827                                 ciphertext_pad_len);
6828                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6829                 if (op_mode == OUT_OF_PLACE)
6830                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6831                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6832                                 ciphertext_len);
6833         } else {
6834                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6835                                 plaintext_pad_len);
6836                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6837                 if (op_mode == OUT_OF_PLACE)
6838                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6839                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6840         }
6841
6842         /* Create the operation */
6843         retval = create_wireless_algo_auth_cipher_operation(
6844                         tdata->digest_enc.data, tdata->digest_enc.len,
6845                         tdata->cipher_iv.data, tdata->cipher_iv.len,
6846                         tdata->auth_iv.data, tdata->auth_iv.len,
6847                         (tdata->digest_enc.offset == 0 ?
6848                                 plaintext_pad_len
6849                                 : tdata->digest_enc.offset),
6850                         tdata->validCipherLen.len_bits,
6851                         tdata->cipher.offset_bits,
6852                         tdata->validAuthLen.len_bits,
6853                         tdata->auth.offset_bits,
6854                         op_mode, 0, verify);
6855
6856         if (retval < 0)
6857                 return retval;
6858
6859         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
6860
6861         /* Check if the op failed because the device doesn't */
6862         /* support this particular combination of algorithms */
6863         if (op == NULL && ut_params->op->status ==
6864                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
6865                 printf("Device doesn't support this mixed combination. "
6866                                 "Test Skipped.\n");
6867                 return -ENOTSUP;
6868         }
6869         ut_params->op = op;
6870
6871         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6872
6873         ut_params->obuf = (op_mode == IN_PLACE ?
6874                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6875
6876         if (verify) {
6877                 if (ut_params->obuf)
6878                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6879                                                         uint8_t *);
6880                 else
6881                         plaintext = ciphertext +
6882                                         (tdata->cipher.offset_bits >> 3);
6883
6884                 debug_hexdump(stdout, "plaintext:", plaintext,
6885                                 tdata->plaintext.len_bits >> 3);
6886                 debug_hexdump(stdout, "plaintext expected:",
6887                                 tdata->plaintext.data,
6888                                 tdata->plaintext.len_bits >> 3);
6889         } else {
6890                 if (ut_params->obuf)
6891                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6892                                         uint8_t *);
6893                 else
6894                         ciphertext = plaintext;
6895
6896                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6897                                 ciphertext_len);
6898                 debug_hexdump(stdout, "ciphertext expected:",
6899                                 tdata->ciphertext.data,
6900                                 tdata->ciphertext.len_bits >> 3);
6901
6902                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6903                                 + (tdata->digest_enc.offset == 0 ?
6904                 plaintext_pad_len : tdata->digest_enc.offset);
6905
6906                 debug_hexdump(stdout, "digest:", ut_params->digest,
6907                                 tdata->digest_enc.len);
6908                 debug_hexdump(stdout, "digest expected:",
6909                                 tdata->digest_enc.data,
6910                                 tdata->digest_enc.len);
6911         }
6912
6913         /* Validate obuf */
6914         if (verify) {
6915                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6916                                 plaintext,
6917                                 tdata->plaintext.data,
6918                                 tdata->plaintext.len_bits >> 3,
6919                                 "Plaintext data not as expected");
6920         } else {
6921                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6922                                 ciphertext,
6923                                 tdata->ciphertext.data,
6924                                 tdata->validDataLen.len_bits,
6925                                 "Ciphertext data not as expected");
6926
6927                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6928                                 ut_params->digest,
6929                                 tdata->digest_enc.data,
6930                                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
6931                                 "Generated auth tag not as expected");
6932         }
6933
6934         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6935                         "crypto op processing failed");
6936
6937         return 0;
6938 }
6939
6940 static int
6941 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
6942         uint8_t op_mode, uint8_t verify)
6943 {
6944         struct crypto_testsuite_params *ts_params = &testsuite_params;
6945         struct crypto_unittest_params *ut_params = &unittest_params;
6946
6947         int retval;
6948
6949         const uint8_t *plaintext = NULL;
6950         const uint8_t *ciphertext = NULL;
6951         const uint8_t *digest = NULL;
6952         unsigned int plaintext_pad_len;
6953         unsigned int plaintext_len;
6954         unsigned int ciphertext_pad_len;
6955         unsigned int ciphertext_len;
6956         uint8_t buffer[10000];
6957         uint8_t digest_buffer[10000];
6958
6959         struct rte_cryptodev_info dev_info;
6960         struct rte_crypto_op *op;
6961
6962         /* Check if device supports particular algorithms */
6963         if (test_mixed_check_if_unsupported(tdata))
6964                 return -ENOTSUP;
6965         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6966                 return -ENOTSUP;
6967
6968         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6969
6970         uint64_t feat_flags = dev_info.feature_flags;
6971
6972         if (op_mode == IN_PLACE) {
6973                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6974                         printf("Device doesn't support in-place scatter-gather "
6975                                         "in both input and output mbufs.\n");
6976                         return -ENOTSUP;
6977                 }
6978         } else {
6979                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6980                         printf("Device doesn't support out-of-place scatter-gather "
6981                                         "in both input and output mbufs.\n");
6982                         return -ENOTSUP;
6983                 }
6984                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6985                         printf("Device doesn't support digest encrypted.\n");
6986                         return -ENOTSUP;
6987                 }
6988         }
6989
6990         /* Create the session */
6991         if (verify)
6992                 retval = create_wireless_algo_cipher_auth_session(
6993                                 ts_params->valid_devs[0],
6994                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
6995                                 RTE_CRYPTO_AUTH_OP_VERIFY,
6996                                 tdata->auth_algo,
6997                                 tdata->cipher_algo,
6998                                 tdata->auth_key.data, tdata->auth_key.len,
6999                                 tdata->auth_iv.len, tdata->digest_enc.len,
7000                                 tdata->cipher_iv.len);
7001         else
7002                 retval = create_wireless_algo_auth_cipher_session(
7003                                 ts_params->valid_devs[0],
7004                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7005                                 RTE_CRYPTO_AUTH_OP_GENERATE,
7006                                 tdata->auth_algo,
7007                                 tdata->cipher_algo,
7008                                 tdata->auth_key.data, tdata->auth_key.len,
7009                                 tdata->auth_iv.len, tdata->digest_enc.len,
7010                                 tdata->cipher_iv.len);
7011         if (retval < 0)
7012                 return retval;
7013
7014         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7015         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7016         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7017         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7018
7019         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7020                         ciphertext_pad_len, 15, 0);
7021         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7022                         "Failed to allocate input buffer in mempool");
7023
7024         if (op_mode == OUT_OF_PLACE) {
7025                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7026                                 plaintext_pad_len, 15, 0);
7027                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
7028                                 "Failed to allocate output buffer in mempool");
7029         }
7030
7031         if (verify) {
7032                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7033                         tdata->ciphertext.data);
7034                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7035                                         ciphertext_len, buffer);
7036                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7037                         ciphertext_len);
7038         } else {
7039                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7040                         tdata->plaintext.data);
7041                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7042                                         plaintext_len, buffer);
7043                 debug_hexdump(stdout, "plaintext:", plaintext,
7044                         plaintext_len);
7045         }
7046         memset(buffer, 0, sizeof(buffer));
7047
7048         /* Create the operation */
7049         retval = create_wireless_algo_auth_cipher_operation(
7050                         tdata->digest_enc.data, tdata->digest_enc.len,
7051                         tdata->cipher_iv.data, tdata->cipher_iv.len,
7052                         tdata->auth_iv.data, tdata->auth_iv.len,
7053                         (tdata->digest_enc.offset == 0 ?
7054                                 plaintext_pad_len
7055                                 : tdata->digest_enc.offset),
7056                         tdata->validCipherLen.len_bits,
7057                         tdata->cipher.offset_bits,
7058                         tdata->validAuthLen.len_bits,
7059                         tdata->auth.offset_bits,
7060                         op_mode, 1, verify);
7061
7062         if (retval < 0)
7063                 return retval;
7064
7065         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7066
7067         /* Check if the op failed because the device doesn't */
7068         /* support this particular combination of algorithms */
7069         if (op == NULL && ut_params->op->status ==
7070                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7071                 printf("Device doesn't support this mixed combination. "
7072                                 "Test Skipped.\n");
7073                 return -ENOTSUP;
7074         }
7075         ut_params->op = op;
7076
7077         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7078
7079         ut_params->obuf = (op_mode == IN_PLACE ?
7080                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7081
7082         if (verify) {
7083                 if (ut_params->obuf)
7084                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7085                                         plaintext_len, buffer);
7086                 else
7087                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7088                                         plaintext_len, buffer);
7089
7090                 debug_hexdump(stdout, "plaintext:", plaintext,
7091                                 (tdata->plaintext.len_bits >> 3) -
7092                                 tdata->digest_enc.len);
7093                 debug_hexdump(stdout, "plaintext expected:",
7094                                 tdata->plaintext.data,
7095                                 (tdata->plaintext.len_bits >> 3) -
7096                                 tdata->digest_enc.len);
7097         } else {
7098                 if (ut_params->obuf)
7099                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7100                                         ciphertext_len, buffer);
7101                 else
7102                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7103                                         ciphertext_len, buffer);
7104
7105                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7106                         ciphertext_len);
7107                 debug_hexdump(stdout, "ciphertext expected:",
7108                         tdata->ciphertext.data,
7109                         tdata->ciphertext.len_bits >> 3);
7110
7111                 if (ut_params->obuf)
7112                         digest = rte_pktmbuf_read(ut_params->obuf,
7113                                         (tdata->digest_enc.offset == 0 ?
7114                                                 plaintext_pad_len :
7115                                                 tdata->digest_enc.offset),
7116                                         tdata->digest_enc.len, digest_buffer);
7117                 else
7118                         digest = rte_pktmbuf_read(ut_params->ibuf,
7119                                         (tdata->digest_enc.offset == 0 ?
7120                                                 plaintext_pad_len :
7121                                                 tdata->digest_enc.offset),
7122                                         tdata->digest_enc.len, digest_buffer);
7123
7124                 debug_hexdump(stdout, "digest:", digest,
7125                                 tdata->digest_enc.len);
7126                 debug_hexdump(stdout, "digest expected:",
7127                                 tdata->digest_enc.data, tdata->digest_enc.len);
7128         }
7129
7130         /* Validate obuf */
7131         if (verify) {
7132                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7133                                 plaintext,
7134                                 tdata->plaintext.data,
7135                                 tdata->plaintext.len_bits >> 3,
7136                                 "Plaintext data not as expected");
7137         } else {
7138                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7139                                 ciphertext,
7140                                 tdata->ciphertext.data,
7141                                 tdata->validDataLen.len_bits,
7142                                 "Ciphertext data not as expected");
7143                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7144                                 digest,
7145                                 tdata->digest_enc.data,
7146                                 tdata->digest_enc.len,
7147                                 "Generated auth tag not as expected");
7148         }
7149
7150         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7151                         "crypto op processing failed");
7152
7153         return 0;
7154 }
7155
7156 /** AUTH AES CMAC + CIPHER AES CTR */
7157
7158 static int
7159 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7160 {
7161         return test_mixed_auth_cipher(
7162                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7163 }
7164
7165 static int
7166 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7167 {
7168         return test_mixed_auth_cipher(
7169                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7170 }
7171
7172 static int
7173 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7174 {
7175         return test_mixed_auth_cipher_sgl(
7176                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7177 }
7178
7179 static int
7180 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7181 {
7182         return test_mixed_auth_cipher_sgl(
7183                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7184 }
7185
7186 static int
7187 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7188 {
7189         return test_mixed_auth_cipher(
7190                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7191 }
7192
7193 static int
7194 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7195 {
7196         return test_mixed_auth_cipher(
7197                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7198 }
7199
7200 static int
7201 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7202 {
7203         return test_mixed_auth_cipher_sgl(
7204                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7205 }
7206
7207 static int
7208 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7209 {
7210         return test_mixed_auth_cipher_sgl(
7211                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7212 }
7213
7214 /** MIXED AUTH + CIPHER */
7215
7216 static int
7217 test_auth_zuc_cipher_snow_test_case_1(void)
7218 {
7219         return test_mixed_auth_cipher(
7220                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7221 }
7222
7223 static int
7224 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7225 {
7226         return test_mixed_auth_cipher(
7227                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7228 }
7229
7230 static int
7231 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7232 {
7233         return test_mixed_auth_cipher(
7234                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7235 }
7236
7237 static int
7238 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7239 {
7240         return test_mixed_auth_cipher(
7241                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7242 }
7243
7244 static int
7245 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7246 {
7247         return test_mixed_auth_cipher(
7248                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7249 }
7250
7251 static int
7252 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7253 {
7254         return test_mixed_auth_cipher(
7255                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7256 }
7257
7258 static int
7259 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7260 {
7261         return test_mixed_auth_cipher(
7262                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7263 }
7264
7265 static int
7266 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7267 {
7268         return test_mixed_auth_cipher(
7269                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7270 }
7271
7272 static int
7273 test_auth_snow_cipher_zuc_test_case_1(void)
7274 {
7275         return test_mixed_auth_cipher(
7276                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7277 }
7278
7279 static int
7280 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7281 {
7282         return test_mixed_auth_cipher(
7283                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7284 }
7285
7286 static int
7287 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7288 {
7289         return test_mixed_auth_cipher(
7290                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7291 }
7292
7293 static int
7294 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7295 {
7296         return test_mixed_auth_cipher(
7297                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7298 }
7299
7300 static int
7301 test_auth_null_cipher_snow_test_case_1(void)
7302 {
7303         return test_mixed_auth_cipher(
7304                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7305 }
7306
7307 static int
7308 test_verify_auth_null_cipher_snow_test_case_1(void)
7309 {
7310         return test_mixed_auth_cipher(
7311                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7312 }
7313
7314 static int
7315 test_auth_null_cipher_zuc_test_case_1(void)
7316 {
7317         return test_mixed_auth_cipher(
7318                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7319 }
7320
7321 static int
7322 test_verify_auth_null_cipher_zuc_test_case_1(void)
7323 {
7324         return test_mixed_auth_cipher(
7325                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7326 }
7327
7328 static int
7329 test_auth_snow_cipher_null_test_case_1(void)
7330 {
7331         return test_mixed_auth_cipher(
7332                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7333 }
7334
7335 static int
7336 test_verify_auth_snow_cipher_null_test_case_1(void)
7337 {
7338         return test_mixed_auth_cipher(
7339                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7340 }
7341
7342 static int
7343 test_auth_zuc_cipher_null_test_case_1(void)
7344 {
7345         return test_mixed_auth_cipher(
7346                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7347 }
7348
7349 static int
7350 test_verify_auth_zuc_cipher_null_test_case_1(void)
7351 {
7352         return test_mixed_auth_cipher(
7353                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7354 }
7355
7356 static int
7357 test_auth_null_cipher_aes_ctr_test_case_1(void)
7358 {
7359         return test_mixed_auth_cipher(
7360                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7361 }
7362
7363 static int
7364 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7365 {
7366         return test_mixed_auth_cipher(
7367                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7368 }
7369
7370 static int
7371 test_auth_aes_cmac_cipher_null_test_case_1(void)
7372 {
7373         return test_mixed_auth_cipher(
7374                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7375 }
7376
7377 static int
7378 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7379 {
7380         return test_mixed_auth_cipher(
7381                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7382 }
7383
7384 /* ***** AEAD algorithm Tests ***** */
7385
7386 static int
7387 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7388                 enum rte_crypto_aead_operation op,
7389                 const uint8_t *key, const uint8_t key_len,
7390                 const uint16_t aad_len, const uint8_t auth_len,
7391                 uint8_t iv_len)
7392 {
7393         uint8_t aead_key[key_len];
7394
7395         struct crypto_testsuite_params *ts_params = &testsuite_params;
7396         struct crypto_unittest_params *ut_params = &unittest_params;
7397
7398         memcpy(aead_key, key, key_len);
7399
7400         /* Setup AEAD Parameters */
7401         ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7402         ut_params->aead_xform.next = NULL;
7403         ut_params->aead_xform.aead.algo = algo;
7404         ut_params->aead_xform.aead.op = op;
7405         ut_params->aead_xform.aead.key.data = aead_key;
7406         ut_params->aead_xform.aead.key.length = key_len;
7407         ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7408         ut_params->aead_xform.aead.iv.length = iv_len;
7409         ut_params->aead_xform.aead.digest_length = auth_len;
7410         ut_params->aead_xform.aead.aad_length = aad_len;
7411
7412         debug_hexdump(stdout, "key:", key, key_len);
7413
7414         /* Create Crypto session*/
7415         ut_params->sess = rte_cryptodev_sym_session_create(
7416                         ts_params->session_mpool);
7417
7418         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7419                         &ut_params->aead_xform,
7420                         ts_params->session_priv_mpool);
7421
7422         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7423
7424         return 0;
7425 }
7426
7427 static int
7428 create_aead_xform(struct rte_crypto_op *op,
7429                 enum rte_crypto_aead_algorithm algo,
7430                 enum rte_crypto_aead_operation aead_op,
7431                 uint8_t *key, const uint8_t key_len,
7432                 const uint8_t aad_len, const uint8_t auth_len,
7433                 uint8_t iv_len)
7434 {
7435         TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7436                         "failed to allocate space for crypto transform");
7437
7438         struct rte_crypto_sym_op *sym_op = op->sym;
7439
7440         /* Setup AEAD Parameters */
7441         sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7442         sym_op->xform->next = NULL;
7443         sym_op->xform->aead.algo = algo;
7444         sym_op->xform->aead.op = aead_op;
7445         sym_op->xform->aead.key.data = key;
7446         sym_op->xform->aead.key.length = key_len;
7447         sym_op->xform->aead.iv.offset = IV_OFFSET;
7448         sym_op->xform->aead.iv.length = iv_len;
7449         sym_op->xform->aead.digest_length = auth_len;
7450         sym_op->xform->aead.aad_length = aad_len;
7451
7452         debug_hexdump(stdout, "key:", key, key_len);
7453
7454         return 0;
7455 }
7456
7457 static int
7458 create_aead_operation(enum rte_crypto_aead_operation op,
7459                 const struct aead_test_data *tdata)
7460 {
7461         struct crypto_testsuite_params *ts_params = &testsuite_params;
7462         struct crypto_unittest_params *ut_params = &unittest_params;
7463
7464         uint8_t *plaintext, *ciphertext;
7465         unsigned int aad_pad_len, plaintext_pad_len;
7466
7467         /* Generate Crypto op data structure */
7468         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7469                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7470         TEST_ASSERT_NOT_NULL(ut_params->op,
7471                         "Failed to allocate symmetric crypto operation struct");
7472
7473         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7474
7475         /* Append aad data */
7476         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7477                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7478                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7479                                 aad_pad_len);
7480                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7481                                 "no room to append aad");
7482
7483                 sym_op->aead.aad.phys_addr =
7484                                 rte_pktmbuf_iova(ut_params->ibuf);
7485                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
7486                 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7487                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7488                         tdata->aad.len);
7489
7490                 /* Append IV at the end of the crypto operation*/
7491                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7492                                 uint8_t *, IV_OFFSET);
7493
7494                 /* Copy IV 1 byte after the IV pointer, according to the API */
7495                 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7496                 debug_hexdump(stdout, "iv:", iv_ptr,
7497                         tdata->iv.len);
7498         } else {
7499                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7500                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7501                                 aad_pad_len);
7502                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7503                                 "no room to append aad");
7504
7505                 sym_op->aead.aad.phys_addr =
7506                                 rte_pktmbuf_iova(ut_params->ibuf);
7507                 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7508                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7509                         tdata->aad.len);
7510
7511                 /* Append IV at the end of the crypto operation*/
7512                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7513                                 uint8_t *, IV_OFFSET);
7514
7515                 if (tdata->iv.len == 0) {
7516                         rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
7517                         debug_hexdump(stdout, "iv:", iv_ptr,
7518                                 AES_GCM_J0_LENGTH);
7519                 } else {
7520                         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
7521                         debug_hexdump(stdout, "iv:", iv_ptr,
7522                                 tdata->iv.len);
7523                 }
7524         }
7525
7526         /* Append plaintext/ciphertext */
7527         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7528                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7529                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7530                                 plaintext_pad_len);
7531                 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7532
7533                 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
7534                 debug_hexdump(stdout, "plaintext:", plaintext,
7535                                 tdata->plaintext.len);
7536
7537                 if (ut_params->obuf) {
7538                         ciphertext = (uint8_t *)rte_pktmbuf_append(
7539                                         ut_params->obuf,
7540                                         plaintext_pad_len + aad_pad_len);
7541                         TEST_ASSERT_NOT_NULL(ciphertext,
7542                                         "no room to append ciphertext");
7543
7544                         memset(ciphertext + aad_pad_len, 0,
7545                                         tdata->ciphertext.len);
7546                 }
7547         } else {
7548                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
7549                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7550                                 plaintext_pad_len);
7551                 TEST_ASSERT_NOT_NULL(ciphertext,
7552                                 "no room to append ciphertext");
7553
7554                 memcpy(ciphertext, tdata->ciphertext.data,
7555                                 tdata->ciphertext.len);
7556                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7557                                 tdata->ciphertext.len);
7558
7559                 if (ut_params->obuf) {
7560                         plaintext = (uint8_t *)rte_pktmbuf_append(
7561                                         ut_params->obuf,
7562                                         plaintext_pad_len + aad_pad_len);
7563                         TEST_ASSERT_NOT_NULL(plaintext,
7564                                         "no room to append plaintext");
7565
7566                         memset(plaintext + aad_pad_len, 0,
7567                                         tdata->plaintext.len);
7568                 }
7569         }
7570
7571         /* Append digest data */
7572         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7573                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7574                                 ut_params->obuf ? ut_params->obuf :
7575                                                 ut_params->ibuf,
7576                                                 tdata->auth_tag.len);
7577                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7578                                 "no room to append digest");
7579                 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
7580                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7581                                 ut_params->obuf ? ut_params->obuf :
7582                                                 ut_params->ibuf,
7583                                                 plaintext_pad_len +
7584                                                 aad_pad_len);
7585         } else {
7586                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7587                                 ut_params->ibuf, tdata->auth_tag.len);
7588                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7589                                 "no room to append digest");
7590                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7591                                 ut_params->ibuf,
7592                                 plaintext_pad_len + aad_pad_len);
7593
7594                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7595                         tdata->auth_tag.len);
7596                 debug_hexdump(stdout, "digest:",
7597                         sym_op->aead.digest.data,
7598                         tdata->auth_tag.len);
7599         }
7600
7601         sym_op->aead.data.length = tdata->plaintext.len;
7602         sym_op->aead.data.offset = aad_pad_len;
7603
7604         return 0;
7605 }
7606
7607 static int
7608 test_authenticated_encryption(const struct aead_test_data *tdata)
7609 {
7610         struct crypto_testsuite_params *ts_params = &testsuite_params;
7611         struct crypto_unittest_params *ut_params = &unittest_params;
7612
7613         int retval;
7614         uint8_t *ciphertext, *auth_tag;
7615         uint16_t plaintext_pad_len;
7616         uint32_t i;
7617         struct rte_cryptodev_info dev_info;
7618
7619         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7620         uint64_t feat_flags = dev_info.feature_flags;
7621
7622         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
7623                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
7624                 printf("Device doesn't support RAW data-path APIs.\n");
7625                 return -ENOTSUP;
7626         }
7627
7628         /* Verify the capabilities */
7629         struct rte_cryptodev_sym_capability_idx cap_idx;
7630         const struct rte_cryptodev_symmetric_capability *capability;
7631         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7632         cap_idx.algo.aead = tdata->algo;
7633         capability = rte_cryptodev_sym_capability_get(
7634                         ts_params->valid_devs[0], &cap_idx);
7635         if (capability == NULL)
7636                 return -ENOTSUP;
7637         if (rte_cryptodev_sym_capability_check_aead(
7638                         capability, tdata->key.len, tdata->auth_tag.len,
7639                         tdata->aad.len, tdata->iv.len))
7640                 return -ENOTSUP;
7641
7642         /* Create AEAD session */
7643         retval = create_aead_session(ts_params->valid_devs[0],
7644                         tdata->algo,
7645                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
7646                         tdata->key.data, tdata->key.len,
7647                         tdata->aad.len, tdata->auth_tag.len,
7648                         tdata->iv.len);
7649         if (retval < 0)
7650                 return retval;
7651
7652         if (tdata->aad.len > MBUF_SIZE) {
7653                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
7654                 /* Populate full size of add data */
7655                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
7656                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
7657         } else
7658                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7659
7660         /* clear mbuf payload */
7661         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7662                         rte_pktmbuf_tailroom(ut_params->ibuf));
7663
7664         /* Create AEAD operation */
7665         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
7666         if (retval < 0)
7667                 return retval;
7668
7669         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7670
7671         ut_params->op->sym->m_src = ut_params->ibuf;
7672
7673         /* Process crypto operation */
7674         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
7675                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
7676         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7677                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
7678                                 ut_params->op, 0, 0, 0, 0);
7679         else
7680                 TEST_ASSERT_NOT_NULL(
7681                         process_crypto_request(ts_params->valid_devs[0],
7682                         ut_params->op), "failed to process sym crypto op");
7683
7684         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7685                         "crypto op processing failed");
7686
7687         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7688
7689         if (ut_params->op->sym->m_dst) {
7690                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7691                                 uint8_t *);
7692                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
7693                                 uint8_t *, plaintext_pad_len);
7694         } else {
7695                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
7696                                 uint8_t *,
7697                                 ut_params->op->sym->cipher.data.offset);
7698                 auth_tag = ciphertext + plaintext_pad_len;
7699         }
7700
7701         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
7702         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
7703
7704         /* Validate obuf */
7705         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7706                         ciphertext,
7707                         tdata->ciphertext.data,
7708                         tdata->ciphertext.len,
7709                         "Ciphertext data not as expected");
7710
7711         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7712                         auth_tag,
7713                         tdata->auth_tag.data,
7714                         tdata->auth_tag.len,
7715                         "Generated auth tag not as expected");
7716
7717         return 0;
7718
7719 }
7720
7721 #ifdef RTE_LIB_SECURITY
7722 static int
7723 security_proto_supported(enum rte_security_session_action_type action,
7724         enum rte_security_session_protocol proto)
7725 {
7726         struct crypto_testsuite_params *ts_params = &testsuite_params;
7727
7728         const struct rte_security_capability *capabilities;
7729         const struct rte_security_capability *capability;
7730         uint16_t i = 0;
7731
7732         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7733                                 rte_cryptodev_get_sec_ctx(
7734                                 ts_params->valid_devs[0]);
7735
7736
7737         capabilities = rte_security_capabilities_get(ctx);
7738
7739         if (capabilities == NULL)
7740                 return -ENOTSUP;
7741
7742         while ((capability = &capabilities[i++])->action !=
7743                         RTE_SECURITY_ACTION_TYPE_NONE) {
7744                 if (capability->action == action &&
7745                                 capability->protocol == proto)
7746                         return 0;
7747         }
7748
7749         return -ENOTSUP;
7750 }
7751
7752 /* Basic algorithm run function for async inplace mode.
7753  * Creates a session from input parameters and runs one operation
7754  * on input_vec. Checks the output of the crypto operation against
7755  * output_vec.
7756  */
7757 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
7758                            enum rte_crypto_auth_operation opa,
7759                            const uint8_t *input_vec, unsigned int input_vec_len,
7760                            const uint8_t *output_vec,
7761                            unsigned int output_vec_len,
7762                            enum rte_crypto_cipher_algorithm cipher_alg,
7763                            const uint8_t *cipher_key, uint32_t cipher_key_len,
7764                            enum rte_crypto_auth_algorithm auth_alg,
7765                            const uint8_t *auth_key, uint32_t auth_key_len,
7766                            uint8_t bearer, enum rte_security_pdcp_domain domain,
7767                            uint8_t packet_direction, uint8_t sn_size,
7768                            uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
7769 {
7770         struct crypto_testsuite_params *ts_params = &testsuite_params;
7771         struct crypto_unittest_params *ut_params = &unittest_params;
7772         uint8_t *plaintext;
7773         int ret = TEST_SUCCESS;
7774         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7775                                 rte_cryptodev_get_sec_ctx(
7776                                 ts_params->valid_devs[0]);
7777
7778         /* Verify the capabilities */
7779         struct rte_security_capability_idx sec_cap_idx;
7780
7781         sec_cap_idx.action = ut_params->type;
7782         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7783         sec_cap_idx.pdcp.domain = domain;
7784         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7785                 return -ENOTSUP;
7786
7787         /* Generate test mbuf data */
7788         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7789
7790         /* clear mbuf payload */
7791         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7792                         rte_pktmbuf_tailroom(ut_params->ibuf));
7793
7794         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7795                                                   input_vec_len);
7796         memcpy(plaintext, input_vec, input_vec_len);
7797
7798         /* Out of place support */
7799         if (oop) {
7800                 /*
7801                  * For out-op-place we need to alloc another mbuf
7802                  */
7803                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7804                 rte_pktmbuf_append(ut_params->obuf, output_vec_len);
7805         }
7806
7807         /* Setup Cipher Parameters */
7808         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7809         ut_params->cipher_xform.cipher.algo = cipher_alg;
7810         ut_params->cipher_xform.cipher.op = opc;
7811         ut_params->cipher_xform.cipher.key.data = cipher_key;
7812         ut_params->cipher_xform.cipher.key.length = cipher_key_len;
7813         ut_params->cipher_xform.cipher.iv.length =
7814                                 packet_direction ? 4 : 0;
7815         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
7816
7817         /* Setup HMAC Parameters if ICV header is required */
7818         if (auth_alg != 0) {
7819                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7820                 ut_params->auth_xform.next = NULL;
7821                 ut_params->auth_xform.auth.algo = auth_alg;
7822                 ut_params->auth_xform.auth.op = opa;
7823                 ut_params->auth_xform.auth.key.data = auth_key;
7824                 ut_params->auth_xform.auth.key.length = auth_key_len;
7825
7826                 ut_params->cipher_xform.next = &ut_params->auth_xform;
7827         } else {
7828                 ut_params->cipher_xform.next = NULL;
7829         }
7830
7831         struct rte_security_session_conf sess_conf = {
7832                 .action_type = ut_params->type,
7833                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
7834                 {.pdcp = {
7835                         .bearer = bearer,
7836                         .domain = domain,
7837                         .pkt_dir = packet_direction,
7838                         .sn_size = sn_size,
7839                         .hfn = packet_direction ? 0 : hfn,
7840                         /**
7841                          * hfn can be set as pdcp_test_hfn[i]
7842                          * if hfn_ovrd is not set. Here, PDCP
7843                          * packet direction is just used to
7844                          * run half of the cases with session
7845                          * HFN and other half with per packet
7846                          * HFN.
7847                          */
7848                         .hfn_threshold = hfn_threshold,
7849                         .hfn_ovrd = packet_direction ? 1 : 0,
7850                         .sdap_enabled = sdap,
7851                 } },
7852                 .crypto_xform = &ut_params->cipher_xform
7853         };
7854
7855         /* Create security session */
7856         ut_params->sec_session = rte_security_session_create(ctx,
7857                                 &sess_conf, ts_params->session_mpool,
7858                                 ts_params->session_priv_mpool);
7859
7860         if (!ut_params->sec_session) {
7861                 printf("TestCase %s()-%d line %d failed %s: ",
7862                         __func__, i, __LINE__, "Failed to allocate session");
7863                 ret = TEST_FAILED;
7864                 goto on_err;
7865         }
7866
7867         /* Generate crypto op data structure */
7868         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7869                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7870         if (!ut_params->op) {
7871                 printf("TestCase %s()-%d line %d failed %s: ",
7872                         __func__, i, __LINE__,
7873                         "Failed to allocate symmetric crypto operation struct");
7874                 ret = TEST_FAILED;
7875                 goto on_err;
7876         }
7877
7878         uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
7879                                         uint32_t *, IV_OFFSET);
7880         *per_pkt_hfn = packet_direction ? hfn : 0;
7881
7882         rte_security_attach_session(ut_params->op, ut_params->sec_session);
7883
7884         /* set crypto operation source mbuf */
7885         ut_params->op->sym->m_src = ut_params->ibuf;
7886         if (oop)
7887                 ut_params->op->sym->m_dst = ut_params->obuf;
7888
7889         /* Process crypto operation */
7890         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
7891                 == NULL) {
7892                 printf("TestCase %s()-%d line %d failed %s: ",
7893                         __func__, i, __LINE__,
7894                         "failed to process sym crypto op");
7895                 ret = TEST_FAILED;
7896                 goto on_err;
7897         }
7898
7899         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
7900                 printf("TestCase %s()-%d line %d failed %s: ",
7901                         __func__, i, __LINE__, "crypto op processing failed");
7902                 ret = TEST_FAILED;
7903                 goto on_err;
7904         }
7905
7906         /* Validate obuf */
7907         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
7908                         uint8_t *);
7909         if (oop) {
7910                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7911                                 uint8_t *);
7912         }
7913
7914         if (memcmp(ciphertext, output_vec, output_vec_len)) {
7915                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
7916                 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
7917                 rte_hexdump(stdout, "reference", output_vec, output_vec_len);
7918                 ret = TEST_FAILED;
7919                 goto on_err;
7920         }
7921
7922 on_err:
7923         rte_crypto_op_free(ut_params->op);
7924         ut_params->op = NULL;
7925
7926         if (ut_params->sec_session)
7927                 rte_security_session_destroy(ctx, ut_params->sec_session);
7928         ut_params->sec_session = NULL;
7929
7930         rte_pktmbuf_free(ut_params->ibuf);
7931         ut_params->ibuf = NULL;
7932         if (oop) {
7933                 rte_pktmbuf_free(ut_params->obuf);
7934                 ut_params->obuf = NULL;
7935         }
7936
7937         return ret;
7938 }
7939
7940 static int
7941 test_pdcp_proto_SGL(int i, int oop,
7942         enum rte_crypto_cipher_operation opc,
7943         enum rte_crypto_auth_operation opa,
7944         uint8_t *input_vec,
7945         unsigned int input_vec_len,
7946         uint8_t *output_vec,
7947         unsigned int output_vec_len,
7948         uint32_t fragsz,
7949         uint32_t fragsz_oop)
7950 {
7951         struct crypto_testsuite_params *ts_params = &testsuite_params;
7952         struct crypto_unittest_params *ut_params = &unittest_params;
7953         uint8_t *plaintext;
7954         struct rte_mbuf *buf, *buf_oop = NULL;
7955         int ret = TEST_SUCCESS;
7956         int to_trn = 0;
7957         int to_trn_tbl[16];
7958         int segs = 1;
7959         unsigned int trn_data = 0;
7960         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7961                                 rte_cryptodev_get_sec_ctx(
7962                                 ts_params->valid_devs[0]);
7963
7964         /* Verify the capabilities */
7965         struct rte_security_capability_idx sec_cap_idx;
7966
7967         sec_cap_idx.action = ut_params->type;
7968         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7969         sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
7970         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7971                 return -ENOTSUP;
7972
7973         if (fragsz > input_vec_len)
7974                 fragsz = input_vec_len;
7975
7976         uint16_t plaintext_len = fragsz;
7977         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
7978
7979         if (fragsz_oop > output_vec_len)
7980                 frag_size_oop = output_vec_len;
7981
7982         int ecx = 0;
7983         if (input_vec_len % fragsz != 0) {
7984                 if (input_vec_len / fragsz + 1 > 16)
7985                         return 1;
7986         } else if (input_vec_len / fragsz > 16)
7987                 return 1;
7988
7989         /* Out of place support */
7990         if (oop) {
7991                 /*
7992                  * For out-op-place we need to alloc another mbuf
7993                  */
7994                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7995                 rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
7996                 buf_oop = ut_params->obuf;
7997         }
7998
7999         /* Generate test mbuf data */
8000         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8001
8002         /* clear mbuf payload */
8003         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8004                         rte_pktmbuf_tailroom(ut_params->ibuf));
8005
8006         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8007                                                   plaintext_len);
8008         memcpy(plaintext, input_vec, plaintext_len);
8009         trn_data += plaintext_len;
8010
8011         buf = ut_params->ibuf;
8012
8013         /*
8014          * Loop until no more fragments
8015          */
8016
8017         while (trn_data < input_vec_len) {
8018                 ++segs;
8019                 to_trn = (input_vec_len - trn_data < fragsz) ?
8020                                 (input_vec_len - trn_data) : fragsz;
8021
8022                 to_trn_tbl[ecx++] = to_trn;
8023
8024                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8025                 buf = buf->next;
8026
8027                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8028                                 rte_pktmbuf_tailroom(buf));
8029
8030                 /* OOP */
8031                 if (oop && !fragsz_oop) {
8032                         buf_oop->next =
8033                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
8034                         buf_oop = buf_oop->next;
8035                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8036                                         0, rte_pktmbuf_tailroom(buf_oop));
8037                         rte_pktmbuf_append(buf_oop, to_trn);
8038                 }
8039
8040                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8041                                 to_trn);
8042
8043                 memcpy(plaintext, input_vec + trn_data, to_trn);
8044                 trn_data += to_trn;
8045         }
8046
8047         ut_params->ibuf->nb_segs = segs;
8048
8049         segs = 1;
8050         if (fragsz_oop && oop) {
8051                 to_trn = 0;
8052                 ecx = 0;
8053
8054                 trn_data = frag_size_oop;
8055                 while (trn_data < output_vec_len) {
8056                         ++segs;
8057                         to_trn =
8058                                 (output_vec_len - trn_data <
8059                                                 frag_size_oop) ?
8060                                 (output_vec_len - trn_data) :
8061                                                 frag_size_oop;
8062
8063                         to_trn_tbl[ecx++] = to_trn;
8064
8065                         buf_oop->next =
8066                                 rte_pktmbuf_alloc(ts_params->mbuf_pool);
8067                         buf_oop = buf_oop->next;
8068                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8069                                         0, rte_pktmbuf_tailroom(buf_oop));
8070                         rte_pktmbuf_append(buf_oop, to_trn);
8071
8072                         trn_data += to_trn;
8073                 }
8074                 ut_params->obuf->nb_segs = segs;
8075         }
8076
8077         /* Setup Cipher Parameters */
8078         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8079         ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8080         ut_params->cipher_xform.cipher.op = opc;
8081         ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8082         ut_params->cipher_xform.cipher.key.length =
8083                                         pdcp_test_params[i].cipher_key_len;
8084         ut_params->cipher_xform.cipher.iv.length = 0;
8085
8086         /* Setup HMAC Parameters if ICV header is required */
8087         if (pdcp_test_params[i].auth_alg != 0) {
8088                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8089                 ut_params->auth_xform.next = NULL;
8090                 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8091                 ut_params->auth_xform.auth.op = opa;
8092                 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8093                 ut_params->auth_xform.auth.key.length =
8094                                         pdcp_test_params[i].auth_key_len;
8095
8096                 ut_params->cipher_xform.next = &ut_params->auth_xform;
8097         } else {
8098                 ut_params->cipher_xform.next = NULL;
8099         }
8100
8101         struct rte_security_session_conf sess_conf = {
8102                 .action_type = ut_params->type,
8103                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8104                 {.pdcp = {
8105                         .bearer = pdcp_test_bearer[i],
8106                         .domain = pdcp_test_params[i].domain,
8107                         .pkt_dir = pdcp_test_packet_direction[i],
8108                         .sn_size = pdcp_test_data_sn_size[i],
8109                         .hfn = pdcp_test_hfn[i],
8110                         .hfn_threshold = pdcp_test_hfn_threshold[i],
8111                         .hfn_ovrd = 0,
8112                 } },
8113                 .crypto_xform = &ut_params->cipher_xform
8114         };
8115
8116         /* Create security session */
8117         ut_params->sec_session = rte_security_session_create(ctx,
8118                                 &sess_conf, ts_params->session_mpool,
8119                                 ts_params->session_priv_mpool);
8120
8121         if (!ut_params->sec_session) {
8122                 printf("TestCase %s()-%d line %d failed %s: ",
8123                         __func__, i, __LINE__, "Failed to allocate session");
8124                 ret = TEST_FAILED;
8125                 goto on_err;
8126         }
8127
8128         /* Generate crypto op data structure */
8129         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8130                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8131         if (!ut_params->op) {
8132                 printf("TestCase %s()-%d line %d failed %s: ",
8133                         __func__, i, __LINE__,
8134                         "Failed to allocate symmetric crypto operation struct");
8135                 ret = TEST_FAILED;
8136                 goto on_err;
8137         }
8138
8139         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8140
8141         /* set crypto operation source mbuf */
8142         ut_params->op->sym->m_src = ut_params->ibuf;
8143         if (oop)
8144                 ut_params->op->sym->m_dst = ut_params->obuf;
8145
8146         /* Process crypto operation */
8147         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8148                 == NULL) {
8149                 printf("TestCase %s()-%d line %d failed %s: ",
8150                         __func__, i, __LINE__,
8151                         "failed to process sym crypto op");
8152                 ret = TEST_FAILED;
8153                 goto on_err;
8154         }
8155
8156         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8157                 printf("TestCase %s()-%d line %d failed %s: ",
8158                         __func__, i, __LINE__, "crypto op processing failed");
8159                 ret = TEST_FAILED;
8160                 goto on_err;
8161         }
8162
8163         /* Validate obuf */
8164         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8165                         uint8_t *);
8166         if (oop) {
8167                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8168                                 uint8_t *);
8169         }
8170         if (fragsz_oop)
8171                 fragsz = frag_size_oop;
8172         if (memcmp(ciphertext, output_vec, fragsz)) {
8173                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8174                 rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8175                 rte_hexdump(stdout, "reference", output_vec, fragsz);
8176                 ret = TEST_FAILED;
8177                 goto on_err;
8178         }
8179
8180         buf = ut_params->op->sym->m_src->next;
8181         if (oop)
8182                 buf = ut_params->op->sym->m_dst->next;
8183
8184         unsigned int off = fragsz;
8185
8186         ecx = 0;
8187         while (buf) {
8188                 ciphertext = rte_pktmbuf_mtod(buf,
8189                                 uint8_t *);
8190                 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8191                         printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8192                         rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8193                         rte_hexdump(stdout, "reference", output_vec + off,
8194                                         to_trn_tbl[ecx]);
8195                         ret = TEST_FAILED;
8196                         goto on_err;
8197                 }
8198                 off += to_trn_tbl[ecx++];
8199                 buf = buf->next;
8200         }
8201 on_err:
8202         rte_crypto_op_free(ut_params->op);
8203         ut_params->op = NULL;
8204
8205         if (ut_params->sec_session)
8206                 rte_security_session_destroy(ctx, ut_params->sec_session);
8207         ut_params->sec_session = NULL;
8208
8209         rte_pktmbuf_free(ut_params->ibuf);
8210         ut_params->ibuf = NULL;
8211         if (oop) {
8212                 rte_pktmbuf_free(ut_params->obuf);
8213                 ut_params->obuf = NULL;
8214         }
8215
8216         return ret;
8217 }
8218
8219 int
8220 test_pdcp_proto_cplane_encap(int i)
8221 {
8222         return test_pdcp_proto(
8223                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8224                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8225                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8226                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8227                 pdcp_test_params[i].cipher_key_len,
8228                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8229                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8230                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8231                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8232                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8233 }
8234
8235 int
8236 test_pdcp_proto_uplane_encap(int i)
8237 {
8238         return test_pdcp_proto(
8239                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8240                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8241                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8242                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8243                 pdcp_test_params[i].cipher_key_len,
8244                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8245                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8246                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8247                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8248                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8249 }
8250
8251 int
8252 test_pdcp_proto_uplane_encap_with_int(int i)
8253 {
8254         return test_pdcp_proto(
8255                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8256                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8257                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8258                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8259                 pdcp_test_params[i].cipher_key_len,
8260                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8261                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8262                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8263                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8264                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8265 }
8266
8267 int
8268 test_pdcp_proto_cplane_decap(int i)
8269 {
8270         return test_pdcp_proto(
8271                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8272                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8273                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8274                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8275                 pdcp_test_params[i].cipher_key_len,
8276                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8277                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8278                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8279                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8280                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8281 }
8282
8283 int
8284 test_pdcp_proto_uplane_decap(int i)
8285 {
8286         return test_pdcp_proto(
8287                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8288                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8289                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8290                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8291                 pdcp_test_params[i].cipher_key_len,
8292                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8293                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8294                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8295                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8296                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8297 }
8298
8299 int
8300 test_pdcp_proto_uplane_decap_with_int(int i)
8301 {
8302         return test_pdcp_proto(
8303                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8304                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8305                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8306                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8307                 pdcp_test_params[i].cipher_key_len,
8308                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8309                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8310                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8311                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8312                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8313 }
8314
8315 static int
8316 test_PDCP_PROTO_SGL_in_place_32B(void)
8317 {
8318         /* i can be used for running any PDCP case
8319          * In this case it is uplane 12-bit AES-SNOW DL encap
8320          */
8321         int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8322         return test_pdcp_proto_SGL(i, IN_PLACE,
8323                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8324                         RTE_CRYPTO_AUTH_OP_GENERATE,
8325                         pdcp_test_data_in[i],
8326                         pdcp_test_data_in_len[i],
8327                         pdcp_test_data_out[i],
8328                         pdcp_test_data_in_len[i]+4,
8329                         32, 0);
8330 }
8331 static int
8332 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8333 {
8334         /* i can be used for running any PDCP case
8335          * In this case it is uplane 18-bit NULL-NULL DL encap
8336          */
8337         int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8338         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8339                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8340                         RTE_CRYPTO_AUTH_OP_GENERATE,
8341                         pdcp_test_data_in[i],
8342                         pdcp_test_data_in_len[i],
8343                         pdcp_test_data_out[i],
8344                         pdcp_test_data_in_len[i]+4,
8345                         32, 128);
8346 }
8347 static int
8348 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8349 {
8350         /* i can be used for running any PDCP case
8351          * In this case it is uplane 18-bit AES DL encap
8352          */
8353         int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8354                         + DOWNLINK;
8355         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8356                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8357                         RTE_CRYPTO_AUTH_OP_GENERATE,
8358                         pdcp_test_data_in[i],
8359                         pdcp_test_data_in_len[i],
8360                         pdcp_test_data_out[i],
8361                         pdcp_test_data_in_len[i],
8362                         32, 40);
8363 }
8364 static int
8365 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8366 {
8367         /* i can be used for running any PDCP case
8368          * In this case it is cplane 12-bit AES-ZUC DL encap
8369          */
8370         int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8371         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8372                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8373                         RTE_CRYPTO_AUTH_OP_GENERATE,
8374                         pdcp_test_data_in[i],
8375                         pdcp_test_data_in_len[i],
8376                         pdcp_test_data_out[i],
8377                         pdcp_test_data_in_len[i]+4,
8378                         128, 32);
8379 }
8380
8381 static int
8382 test_PDCP_SDAP_PROTO_encap_all(void)
8383 {
8384         int i = 0, size = 0;
8385         int err, all_err = TEST_SUCCESS;
8386         const struct pdcp_sdap_test *cur_test;
8387
8388         size = ARRAY_SIZE(list_pdcp_sdap_tests);
8389
8390         for (i = 0; i < size; i++) {
8391                 cur_test = &list_pdcp_sdap_tests[i];
8392                 err = test_pdcp_proto(
8393                         i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8394                         RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8395                         cur_test->in_len, cur_test->data_out,
8396                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8397                         cur_test->param.cipher_alg, cur_test->cipher_key,
8398                         cur_test->param.cipher_key_len,
8399                         cur_test->param.auth_alg,
8400                         cur_test->auth_key, cur_test->param.auth_key_len,
8401                         cur_test->bearer, cur_test->param.domain,
8402                         cur_test->packet_direction, cur_test->sn_size,
8403                         cur_test->hfn,
8404                         cur_test->hfn_threshold, SDAP_ENABLED);
8405                 if (err) {
8406                         printf("\t%d) %s: Encapsulation failed\n",
8407                                         cur_test->test_idx,
8408                                         cur_test->param.name);
8409                         err = TEST_FAILED;
8410                 } else {
8411                         printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8412                                         cur_test->param.name);
8413                         err = TEST_SUCCESS;
8414                 }
8415                 all_err += err;
8416         }
8417
8418         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8419
8420         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8421 }
8422
8423 static int
8424 test_PDCP_SDAP_PROTO_decap_all(void)
8425 {
8426         int i = 0, size = 0;
8427         int err, all_err = TEST_SUCCESS;
8428         const struct pdcp_sdap_test *cur_test;
8429
8430         size = ARRAY_SIZE(list_pdcp_sdap_tests);
8431
8432         for (i = 0; i < size; i++) {
8433                 cur_test = &list_pdcp_sdap_tests[i];
8434                 err = test_pdcp_proto(
8435                         i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
8436                         RTE_CRYPTO_AUTH_OP_VERIFY,
8437                         cur_test->data_out,
8438                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8439                         cur_test->data_in, cur_test->in_len,
8440                         cur_test->param.cipher_alg,
8441                         cur_test->cipher_key, cur_test->param.cipher_key_len,
8442                         cur_test->param.auth_alg, cur_test->auth_key,
8443                         cur_test->param.auth_key_len, cur_test->bearer,
8444                         cur_test->param.domain, cur_test->packet_direction,
8445                         cur_test->sn_size, cur_test->hfn,
8446                         cur_test->hfn_threshold, SDAP_ENABLED);
8447                 if (err) {
8448                         printf("\t%d) %s: Decapsulation failed\n",
8449                                         cur_test->test_idx,
8450                                         cur_test->param.name);
8451                         err = TEST_FAILED;
8452                 } else {
8453                         printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
8454                                         cur_test->param.name);
8455                         err = TEST_SUCCESS;
8456                 }
8457                 all_err += err;
8458         }
8459
8460         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8461
8462         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8463 }
8464
8465 static int
8466 test_PDCP_PROTO_all(void)
8467 {
8468         struct crypto_testsuite_params *ts_params = &testsuite_params;
8469         struct crypto_unittest_params *ut_params = &unittest_params;
8470         struct rte_cryptodev_info dev_info;
8471         int status;
8472
8473         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8474         uint64_t feat_flags = dev_info.feature_flags;
8475
8476         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8477                 return -ENOTSUP;
8478
8479         /* Set action type */
8480         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8481                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8482                 gbl_action_type;
8483
8484         if (security_proto_supported(ut_params->type,
8485                         RTE_SECURITY_PROTOCOL_PDCP) < 0)
8486                 return -ENOTSUP;
8487
8488         status = test_PDCP_PROTO_cplane_encap_all();
8489         status += test_PDCP_PROTO_cplane_decap_all();
8490         status += test_PDCP_PROTO_uplane_encap_all();
8491         status += test_PDCP_PROTO_uplane_decap_all();
8492         status += test_PDCP_PROTO_SGL_in_place_32B();
8493         status += test_PDCP_PROTO_SGL_oop_32B_128B();
8494         status += test_PDCP_PROTO_SGL_oop_32B_40B();
8495         status += test_PDCP_PROTO_SGL_oop_128B_32B();
8496         status += test_PDCP_SDAP_PROTO_encap_all();
8497         status += test_PDCP_SDAP_PROTO_decap_all();
8498
8499         if (status)
8500                 return TEST_FAILED;
8501         else
8502                 return TEST_SUCCESS;
8503 }
8504
8505 static int
8506 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
8507 {
8508         struct crypto_testsuite_params *ts_params = &testsuite_params;
8509         struct crypto_unittest_params *ut_params = &unittest_params;
8510         uint8_t *plaintext, *ciphertext;
8511         uint8_t *iv_ptr;
8512         int32_t cipher_len, crc_len;
8513         uint32_t crc_data_len;
8514         int ret = TEST_SUCCESS;
8515
8516         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8517                                         rte_cryptodev_get_sec_ctx(
8518                                                 ts_params->valid_devs[0]);
8519
8520         /* Verify the capabilities */
8521         struct rte_security_capability_idx sec_cap_idx;
8522         const struct rte_security_capability *sec_cap;
8523         const struct rte_cryptodev_capabilities *crypto_cap;
8524         const struct rte_cryptodev_symmetric_capability *sym_cap;
8525         int j = 0;
8526
8527         sec_cap_idx.action = ut_params->type;
8528         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8529         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
8530
8531         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8532         if (sec_cap == NULL)
8533                 return -ENOTSUP;
8534
8535         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8536                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8537                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8538                                 crypto_cap->sym.xform_type ==
8539                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
8540                                 crypto_cap->sym.cipher.algo ==
8541                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8542                         sym_cap = &crypto_cap->sym;
8543                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8544                                                 d_td->key.len,
8545                                                 d_td->iv.len) == 0)
8546                                 break;
8547                 }
8548         }
8549
8550         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8551                 return -ENOTSUP;
8552
8553         /* Setup source mbuf payload */
8554         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8555         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8556                         rte_pktmbuf_tailroom(ut_params->ibuf));
8557
8558         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8559                         d_td->ciphertext.len);
8560
8561         memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
8562
8563         /* Setup cipher session parameters */
8564         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8565         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8566         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
8567         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8568         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8569         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8570         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8571         ut_params->cipher_xform.next = NULL;
8572
8573         /* Setup DOCSIS session parameters */
8574         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
8575
8576         struct rte_security_session_conf sess_conf = {
8577                 .action_type = ut_params->type,
8578                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8579                 .docsis = ut_params->docsis_xform,
8580                 .crypto_xform = &ut_params->cipher_xform,
8581         };
8582
8583         /* Create security session */
8584         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8585                                         ts_params->session_mpool,
8586                                         ts_params->session_priv_mpool);
8587
8588         if (!ut_params->sec_session) {
8589                 printf("TestCase %s(%d) line %d: %s\n",
8590                         __func__, i, __LINE__, "failed to allocate session");
8591                 ret = TEST_FAILED;
8592                 goto on_err;
8593         }
8594
8595         /* Generate crypto op data structure */
8596         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8597                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8598         if (!ut_params->op) {
8599                 printf("TestCase %s(%d) line %d: %s\n",
8600                         __func__, i, __LINE__,
8601                         "failed to allocate symmetric crypto operation");
8602                 ret = TEST_FAILED;
8603                 goto on_err;
8604         }
8605
8606         /* Setup CRC operation parameters */
8607         crc_len = d_td->ciphertext.no_crc == false ?
8608                         (d_td->ciphertext.len -
8609                                 d_td->ciphertext.crc_offset -
8610                                 RTE_ETHER_CRC_LEN) :
8611                         0;
8612         crc_len = crc_len > 0 ? crc_len : 0;
8613         crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
8614         ut_params->op->sym->auth.data.length = crc_len;
8615         ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
8616
8617         /* Setup cipher operation parameters */
8618         cipher_len = d_td->ciphertext.no_cipher == false ?
8619                         (d_td->ciphertext.len -
8620                                 d_td->ciphertext.cipher_offset) :
8621                         0;
8622         cipher_len = cipher_len > 0 ? cipher_len : 0;
8623         ut_params->op->sym->cipher.data.length = cipher_len;
8624         ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
8625
8626         /* Setup cipher IV */
8627         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8628         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8629
8630         /* Attach session to operation */
8631         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8632
8633         /* Set crypto operation mbufs */
8634         ut_params->op->sym->m_src = ut_params->ibuf;
8635         ut_params->op->sym->m_dst = NULL;
8636
8637         /* Process crypto operation */
8638         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8639                         NULL) {
8640                 printf("TestCase %s(%d) line %d: %s\n",
8641                         __func__, i, __LINE__,
8642                         "failed to process security crypto op");
8643                 ret = TEST_FAILED;
8644                 goto on_err;
8645         }
8646
8647         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8648                 printf("TestCase %s(%d) line %d: %s\n",
8649                         __func__, i, __LINE__, "crypto op processing failed");
8650                 ret = TEST_FAILED;
8651                 goto on_err;
8652         }
8653
8654         /* Validate plaintext */
8655         plaintext = ciphertext;
8656
8657         if (memcmp(plaintext, d_td->plaintext.data,
8658                         d_td->plaintext.len - crc_data_len)) {
8659                 printf("TestCase %s(%d) line %d: %s\n",
8660                         __func__, i, __LINE__, "plaintext not as expected\n");
8661                 rte_hexdump(stdout, "expected", d_td->plaintext.data,
8662                                 d_td->plaintext.len);
8663                 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
8664                 ret = TEST_FAILED;
8665                 goto on_err;
8666         }
8667
8668 on_err:
8669         rte_crypto_op_free(ut_params->op);
8670         ut_params->op = NULL;
8671
8672         if (ut_params->sec_session)
8673                 rte_security_session_destroy(ctx, ut_params->sec_session);
8674         ut_params->sec_session = NULL;
8675
8676         rte_pktmbuf_free(ut_params->ibuf);
8677         ut_params->ibuf = NULL;
8678
8679         return ret;
8680 }
8681
8682 static int
8683 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
8684 {
8685         struct crypto_testsuite_params *ts_params = &testsuite_params;
8686         struct crypto_unittest_params *ut_params = &unittest_params;
8687         uint8_t *plaintext, *ciphertext;
8688         uint8_t *iv_ptr;
8689         int32_t cipher_len, crc_len;
8690         int ret = TEST_SUCCESS;
8691
8692         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8693                                         rte_cryptodev_get_sec_ctx(
8694                                                 ts_params->valid_devs[0]);
8695
8696         /* Verify the capabilities */
8697         struct rte_security_capability_idx sec_cap_idx;
8698         const struct rte_security_capability *sec_cap;
8699         const struct rte_cryptodev_capabilities *crypto_cap;
8700         const struct rte_cryptodev_symmetric_capability *sym_cap;
8701         int j = 0;
8702
8703         sec_cap_idx.action = ut_params->type;
8704         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8705         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8706
8707         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8708         if (sec_cap == NULL)
8709                 return -ENOTSUP;
8710
8711         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8712                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8713                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8714                                 crypto_cap->sym.xform_type ==
8715                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
8716                                 crypto_cap->sym.cipher.algo ==
8717                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8718                         sym_cap = &crypto_cap->sym;
8719                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8720                                                 d_td->key.len,
8721                                                 d_td->iv.len) == 0)
8722                                 break;
8723                 }
8724         }
8725
8726         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8727                 return -ENOTSUP;
8728
8729         /* Setup source mbuf payload */
8730         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8731         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8732                         rte_pktmbuf_tailroom(ut_params->ibuf));
8733
8734         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8735                         d_td->plaintext.len);
8736
8737         memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
8738
8739         /* Setup cipher session parameters */
8740         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8741         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8742         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
8743         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8744         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8745         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8746         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8747         ut_params->cipher_xform.next = NULL;
8748
8749         /* Setup DOCSIS session parameters */
8750         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8751
8752         struct rte_security_session_conf sess_conf = {
8753                 .action_type = ut_params->type,
8754                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8755                 .docsis = ut_params->docsis_xform,
8756                 .crypto_xform = &ut_params->cipher_xform,
8757         };
8758
8759         /* Create security session */
8760         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8761                                         ts_params->session_mpool,
8762                                         ts_params->session_priv_mpool);
8763
8764         if (!ut_params->sec_session) {
8765                 printf("TestCase %s(%d) line %d: %s\n",
8766                         __func__, i, __LINE__, "failed to allocate session");
8767                 ret = TEST_FAILED;
8768                 goto on_err;
8769         }
8770
8771         /* Generate crypto op data structure */
8772         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8773                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8774         if (!ut_params->op) {
8775                 printf("TestCase %s(%d) line %d: %s\n",
8776                         __func__, i, __LINE__,
8777                         "failed to allocate security crypto operation");
8778                 ret = TEST_FAILED;
8779                 goto on_err;
8780         }
8781
8782         /* Setup CRC operation parameters */
8783         crc_len = d_td->plaintext.no_crc == false ?
8784                         (d_td->plaintext.len -
8785                                 d_td->plaintext.crc_offset -
8786                                 RTE_ETHER_CRC_LEN) :
8787                         0;
8788         crc_len = crc_len > 0 ? crc_len : 0;
8789         ut_params->op->sym->auth.data.length = crc_len;
8790         ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
8791
8792         /* Setup cipher operation parameters */
8793         cipher_len = d_td->plaintext.no_cipher == false ?
8794                         (d_td->plaintext.len -
8795                                 d_td->plaintext.cipher_offset) :
8796                         0;
8797         cipher_len = cipher_len > 0 ? cipher_len : 0;
8798         ut_params->op->sym->cipher.data.length = cipher_len;
8799         ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
8800
8801         /* Setup cipher IV */
8802         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8803         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8804
8805         /* Attach session to operation */
8806         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8807
8808         /* Set crypto operation mbufs */
8809         ut_params->op->sym->m_src = ut_params->ibuf;
8810         ut_params->op->sym->m_dst = NULL;
8811
8812         /* Process crypto operation */
8813         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8814                         NULL) {
8815                 printf("TestCase %s(%d) line %d: %s\n",
8816                         __func__, i, __LINE__,
8817                         "failed to process security crypto op");
8818                 ret = TEST_FAILED;
8819                 goto on_err;
8820         }
8821
8822         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8823                 printf("TestCase %s(%d) line %d: %s\n",
8824                         __func__, i, __LINE__, "crypto op processing failed");
8825                 ret = TEST_FAILED;
8826                 goto on_err;
8827         }
8828
8829         /* Validate ciphertext */
8830         ciphertext = plaintext;
8831
8832         if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
8833                 printf("TestCase %s(%d) line %d: %s\n",
8834                         __func__, i, __LINE__, "ciphertext not as expected\n");
8835                 rte_hexdump(stdout, "expected", d_td->ciphertext.data,
8836                                 d_td->ciphertext.len);
8837                 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
8838                 ret = TEST_FAILED;
8839                 goto on_err;
8840         }
8841
8842 on_err:
8843         rte_crypto_op_free(ut_params->op);
8844         ut_params->op = NULL;
8845
8846         if (ut_params->sec_session)
8847                 rte_security_session_destroy(ctx, ut_params->sec_session);
8848         ut_params->sec_session = NULL;
8849
8850         rte_pktmbuf_free(ut_params->ibuf);
8851         ut_params->ibuf = NULL;
8852
8853         return ret;
8854 }
8855
8856 #define TEST_DOCSIS_COUNT(func) do {                    \
8857         int ret = func;                                 \
8858         if (ret == TEST_SUCCESS)  {                     \
8859                 printf("\t%2d)", n++);                  \
8860                 printf("+++++ PASSED:" #func"\n");      \
8861                 p++;                                    \
8862         } else if (ret == -ENOTSUP) {                   \
8863                 printf("\t%2d)", n++);                  \
8864                 printf("~~~~~ UNSUPP:" #func"\n");      \
8865                 u++;                                    \
8866         } else {                                        \
8867                 printf("\t%2d)", n++);                  \
8868                 printf("----- FAILED:" #func"\n");      \
8869                 f++;                                    \
8870         }                                               \
8871 } while (0)
8872
8873 static int
8874 test_DOCSIS_PROTO_uplink_all(void)
8875 {
8876         int p = 0, u = 0, f = 0, n = 0;
8877
8878         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
8879         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
8880         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
8881         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
8882         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
8883         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
8884         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
8885         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
8886         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
8887         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
8888         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
8889         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
8890         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
8891         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
8892         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
8893         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
8894         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
8895         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
8896         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
8897         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
8898         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
8899         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
8900         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
8901         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
8902         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
8903         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
8904
8905         if (f)
8906                 printf("## %s: %d passed out of %d (%d unsupported)\n",
8907                         __func__, p, n, u);
8908
8909         return f;
8910 };
8911
8912 static int
8913 test_DOCSIS_PROTO_downlink_all(void)
8914 {
8915         int p = 0, u = 0, f = 0, n = 0;
8916
8917         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
8918         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
8919         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
8920         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
8921         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
8922         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
8923         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
8924         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
8925         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
8926         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
8927         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
8928         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
8929         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
8930         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
8931         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
8932         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
8933         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
8934         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
8935         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
8936         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
8937         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
8938         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
8939         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
8940         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
8941         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
8942         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
8943
8944         if (f)
8945                 printf("## %s: %d passed out of %d (%d unsupported)\n",
8946                         __func__, p, n, u);
8947
8948         return f;
8949 };
8950
8951 static int
8952 test_DOCSIS_PROTO_all(void)
8953 {
8954         struct crypto_testsuite_params *ts_params = &testsuite_params;
8955         struct crypto_unittest_params *ut_params = &unittest_params;
8956         struct rte_cryptodev_info dev_info;
8957         int status;
8958
8959         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8960         uint64_t feat_flags = dev_info.feature_flags;
8961
8962         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8963                 return -ENOTSUP;
8964
8965         /* Set action type */
8966         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8967                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8968                 gbl_action_type;
8969
8970         if (security_proto_supported(ut_params->type,
8971                         RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
8972                 return -ENOTSUP;
8973
8974         status = test_DOCSIS_PROTO_uplink_all();
8975         status += test_DOCSIS_PROTO_downlink_all();
8976
8977         if (status)
8978                 return TEST_FAILED;
8979         else
8980                 return TEST_SUCCESS;
8981 }
8982 #endif
8983
8984 static int
8985 test_AES_GCM_authenticated_encryption_test_case_1(void)
8986 {
8987         return test_authenticated_encryption(&gcm_test_case_1);
8988 }
8989
8990 static int
8991 test_AES_GCM_authenticated_encryption_test_case_2(void)
8992 {
8993         return test_authenticated_encryption(&gcm_test_case_2);
8994 }
8995
8996 static int
8997 test_AES_GCM_authenticated_encryption_test_case_3(void)
8998 {
8999         return test_authenticated_encryption(&gcm_test_case_3);
9000 }
9001
9002 static int
9003 test_AES_GCM_authenticated_encryption_test_case_4(void)
9004 {
9005         return test_authenticated_encryption(&gcm_test_case_4);
9006 }
9007
9008 static int
9009 test_AES_GCM_authenticated_encryption_test_case_5(void)
9010 {
9011         return test_authenticated_encryption(&gcm_test_case_5);
9012 }
9013
9014 static int
9015 test_AES_GCM_authenticated_encryption_test_case_6(void)
9016 {
9017         return test_authenticated_encryption(&gcm_test_case_6);
9018 }
9019
9020 static int
9021 test_AES_GCM_authenticated_encryption_test_case_7(void)
9022 {
9023         return test_authenticated_encryption(&gcm_test_case_7);
9024 }
9025
9026 static int
9027 test_AES_GCM_authenticated_encryption_test_case_8(void)
9028 {
9029         return test_authenticated_encryption(&gcm_test_case_8);
9030 }
9031
9032 static int
9033 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9034 {
9035         return test_authenticated_encryption(&gcm_J0_test_case_1);
9036 }
9037
9038 static int
9039 test_AES_GCM_auth_encryption_test_case_192_1(void)
9040 {
9041         return test_authenticated_encryption(&gcm_test_case_192_1);
9042 }
9043
9044 static int
9045 test_AES_GCM_auth_encryption_test_case_192_2(void)
9046 {
9047         return test_authenticated_encryption(&gcm_test_case_192_2);
9048 }
9049
9050 static int
9051 test_AES_GCM_auth_encryption_test_case_192_3(void)
9052 {
9053         return test_authenticated_encryption(&gcm_test_case_192_3);
9054 }
9055
9056 static int
9057 test_AES_GCM_auth_encryption_test_case_192_4(void)
9058 {
9059         return test_authenticated_encryption(&gcm_test_case_192_4);
9060 }
9061
9062 static int
9063 test_AES_GCM_auth_encryption_test_case_192_5(void)
9064 {
9065         return test_authenticated_encryption(&gcm_test_case_192_5);
9066 }
9067
9068 static int
9069 test_AES_GCM_auth_encryption_test_case_192_6(void)
9070 {
9071         return test_authenticated_encryption(&gcm_test_case_192_6);
9072 }
9073
9074 static int
9075 test_AES_GCM_auth_encryption_test_case_192_7(void)
9076 {
9077         return test_authenticated_encryption(&gcm_test_case_192_7);
9078 }
9079
9080 static int
9081 test_AES_GCM_auth_encryption_test_case_256_1(void)
9082 {
9083         return test_authenticated_encryption(&gcm_test_case_256_1);
9084 }
9085
9086 static int
9087 test_AES_GCM_auth_encryption_test_case_256_2(void)
9088 {
9089         return test_authenticated_encryption(&gcm_test_case_256_2);
9090 }
9091
9092 static int
9093 test_AES_GCM_auth_encryption_test_case_256_3(void)
9094 {
9095         return test_authenticated_encryption(&gcm_test_case_256_3);
9096 }
9097
9098 static int
9099 test_AES_GCM_auth_encryption_test_case_256_4(void)
9100 {
9101         return test_authenticated_encryption(&gcm_test_case_256_4);
9102 }
9103
9104 static int
9105 test_AES_GCM_auth_encryption_test_case_256_5(void)
9106 {
9107         return test_authenticated_encryption(&gcm_test_case_256_5);
9108 }
9109
9110 static int
9111 test_AES_GCM_auth_encryption_test_case_256_6(void)
9112 {
9113         return test_authenticated_encryption(&gcm_test_case_256_6);
9114 }
9115
9116 static int
9117 test_AES_GCM_auth_encryption_test_case_256_7(void)
9118 {
9119         return test_authenticated_encryption(&gcm_test_case_256_7);
9120 }
9121
9122 static int
9123 test_AES_GCM_auth_encryption_test_case_aad_1(void)
9124 {
9125         return test_authenticated_encryption(&gcm_test_case_aad_1);
9126 }
9127
9128 static int
9129 test_AES_GCM_auth_encryption_test_case_aad_2(void)
9130 {
9131         return test_authenticated_encryption(&gcm_test_case_aad_2);
9132 }
9133
9134 static int
9135 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
9136 {
9137         struct aead_test_data tdata;
9138         int res;
9139
9140         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9141         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9142         tdata.iv.data[0] += 1;
9143         res = test_authenticated_encryption(&tdata);
9144         if (res == -ENOTSUP)
9145                 return res;
9146         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9147         return TEST_SUCCESS;
9148 }
9149
9150 static int
9151 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
9152 {
9153         struct aead_test_data tdata;
9154         int res;
9155
9156         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9157         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9158         tdata.plaintext.data[0] += 1;
9159         res = test_authenticated_encryption(&tdata);
9160         if (res == -ENOTSUP)
9161                 return res;
9162         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9163         return TEST_SUCCESS;
9164 }
9165
9166 static int
9167 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
9168 {
9169         struct aead_test_data tdata;
9170         int res;
9171
9172         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9173         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9174         tdata.ciphertext.data[0] += 1;
9175         res = test_authenticated_encryption(&tdata);
9176         if (res == -ENOTSUP)
9177                 return res;
9178         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9179         return TEST_SUCCESS;
9180 }
9181
9182 static int
9183 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
9184 {
9185         struct aead_test_data tdata;
9186         int res;
9187
9188         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9189         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9190         tdata.aad.len += 1;
9191         res = test_authenticated_encryption(&tdata);
9192         if (res == -ENOTSUP)
9193                 return res;
9194         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9195         return TEST_SUCCESS;
9196 }
9197
9198 static int
9199 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
9200 {
9201         struct aead_test_data tdata;
9202         uint8_t aad[gcm_test_case_7.aad.len];
9203         int res;
9204
9205         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9206         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9207         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9208         aad[0] += 1;
9209         tdata.aad.data = aad;
9210         res = test_authenticated_encryption(&tdata);
9211         if (res == -ENOTSUP)
9212                 return res;
9213         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9214         return TEST_SUCCESS;
9215 }
9216
9217 static int
9218 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
9219 {
9220         struct aead_test_data tdata;
9221         int res;
9222
9223         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9224         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9225         tdata.auth_tag.data[0] += 1;
9226         res = test_authenticated_encryption(&tdata);
9227         if (res == -ENOTSUP)
9228                 return res;
9229         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9230         return TEST_SUCCESS;
9231 }
9232
9233 static int
9234 test_authenticated_decryption(const struct aead_test_data *tdata)
9235 {
9236         struct crypto_testsuite_params *ts_params = &testsuite_params;
9237         struct crypto_unittest_params *ut_params = &unittest_params;
9238
9239         int retval;
9240         uint8_t *plaintext;
9241         uint32_t i;
9242         struct rte_cryptodev_info dev_info;
9243
9244         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9245         uint64_t feat_flags = dev_info.feature_flags;
9246
9247         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9248                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9249                 printf("Device doesn't support RAW data-path APIs.\n");
9250                 return -ENOTSUP;
9251         }
9252
9253         /* Verify the capabilities */
9254         struct rte_cryptodev_sym_capability_idx cap_idx;
9255         const struct rte_cryptodev_symmetric_capability *capability;
9256         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9257         cap_idx.algo.aead = tdata->algo;
9258         capability = rte_cryptodev_sym_capability_get(
9259                         ts_params->valid_devs[0], &cap_idx);
9260         if (capability == NULL)
9261                 return -ENOTSUP;
9262         if (rte_cryptodev_sym_capability_check_aead(
9263                         capability, tdata->key.len, tdata->auth_tag.len,
9264                         tdata->aad.len, tdata->iv.len))
9265                 return -ENOTSUP;
9266
9267         /* Create AEAD session */
9268         retval = create_aead_session(ts_params->valid_devs[0],
9269                         tdata->algo,
9270                         RTE_CRYPTO_AEAD_OP_DECRYPT,
9271                         tdata->key.data, tdata->key.len,
9272                         tdata->aad.len, tdata->auth_tag.len,
9273                         tdata->iv.len);
9274         if (retval < 0)
9275                 return retval;
9276
9277         /* alloc mbuf and set payload */
9278         if (tdata->aad.len > MBUF_SIZE) {
9279                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
9280                 /* Populate full size of add data */
9281                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
9282                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
9283         } else
9284                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9285
9286         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9287                         rte_pktmbuf_tailroom(ut_params->ibuf));
9288
9289         /* Create AEAD operation */
9290         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9291         if (retval < 0)
9292                 return retval;
9293
9294         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9295
9296         ut_params->op->sym->m_src = ut_params->ibuf;
9297
9298         /* Process crypto operation */
9299         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9300                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
9301         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9302                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9303                                 ut_params->op, 0, 0, 0, 0);
9304         else
9305                 TEST_ASSERT_NOT_NULL(
9306                         process_crypto_request(ts_params->valid_devs[0],
9307                         ut_params->op), "failed to process sym crypto op");
9308
9309         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9310                         "crypto op processing failed");
9311
9312         if (ut_params->op->sym->m_dst)
9313                 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
9314                                 uint8_t *);
9315         else
9316                 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
9317                                 uint8_t *,
9318                                 ut_params->op->sym->cipher.data.offset);
9319
9320         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9321
9322         /* Validate obuf */
9323         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9324                         plaintext,
9325                         tdata->plaintext.data,
9326                         tdata->plaintext.len,
9327                         "Plaintext data not as expected");
9328
9329         TEST_ASSERT_EQUAL(ut_params->op->status,
9330                         RTE_CRYPTO_OP_STATUS_SUCCESS,
9331                         "Authentication failed");
9332
9333         return 0;
9334 }
9335
9336 static int
9337 test_AES_GCM_authenticated_decryption_test_case_1(void)
9338 {
9339         return test_authenticated_decryption(&gcm_test_case_1);
9340 }
9341
9342 static int
9343 test_AES_GCM_authenticated_decryption_test_case_2(void)
9344 {
9345         return test_authenticated_decryption(&gcm_test_case_2);
9346 }
9347
9348 static int
9349 test_AES_GCM_authenticated_decryption_test_case_3(void)
9350 {
9351         return test_authenticated_decryption(&gcm_test_case_3);
9352 }
9353
9354 static int
9355 test_AES_GCM_authenticated_decryption_test_case_4(void)
9356 {
9357         return test_authenticated_decryption(&gcm_test_case_4);
9358 }
9359
9360 static int
9361 test_AES_GCM_authenticated_decryption_test_case_5(void)
9362 {
9363         return test_authenticated_decryption(&gcm_test_case_5);
9364 }
9365
9366 static int
9367 test_AES_GCM_authenticated_decryption_test_case_6(void)
9368 {
9369         return test_authenticated_decryption(&gcm_test_case_6);
9370 }
9371
9372 static int
9373 test_AES_GCM_authenticated_decryption_test_case_7(void)
9374 {
9375         return test_authenticated_decryption(&gcm_test_case_7);
9376 }
9377
9378 static int
9379 test_AES_GCM_authenticated_decryption_test_case_8(void)
9380 {
9381         return test_authenticated_decryption(&gcm_test_case_8);
9382 }
9383
9384 static int
9385 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
9386 {
9387         return test_authenticated_decryption(&gcm_J0_test_case_1);
9388 }
9389
9390 static int
9391 test_AES_GCM_auth_decryption_test_case_192_1(void)
9392 {
9393         return test_authenticated_decryption(&gcm_test_case_192_1);
9394 }
9395
9396 static int
9397 test_AES_GCM_auth_decryption_test_case_192_2(void)
9398 {
9399         return test_authenticated_decryption(&gcm_test_case_192_2);
9400 }
9401
9402 static int
9403 test_AES_GCM_auth_decryption_test_case_192_3(void)
9404 {
9405         return test_authenticated_decryption(&gcm_test_case_192_3);
9406 }
9407
9408 static int
9409 test_AES_GCM_auth_decryption_test_case_192_4(void)
9410 {
9411         return test_authenticated_decryption(&gcm_test_case_192_4);
9412 }
9413
9414 static int
9415 test_AES_GCM_auth_decryption_test_case_192_5(void)
9416 {
9417         return test_authenticated_decryption(&gcm_test_case_192_5);
9418 }
9419
9420 static int
9421 test_AES_GCM_auth_decryption_test_case_192_6(void)
9422 {
9423         return test_authenticated_decryption(&gcm_test_case_192_6);
9424 }
9425
9426 static int
9427 test_AES_GCM_auth_decryption_test_case_192_7(void)
9428 {
9429         return test_authenticated_decryption(&gcm_test_case_192_7);
9430 }
9431
9432 static int
9433 test_AES_GCM_auth_decryption_test_case_256_1(void)
9434 {
9435         return test_authenticated_decryption(&gcm_test_case_256_1);
9436 }
9437
9438 static int
9439 test_AES_GCM_auth_decryption_test_case_256_2(void)
9440 {
9441         return test_authenticated_decryption(&gcm_test_case_256_2);
9442 }
9443
9444 static int
9445 test_AES_GCM_auth_decryption_test_case_256_3(void)
9446 {
9447         return test_authenticated_decryption(&gcm_test_case_256_3);
9448 }
9449
9450 static int
9451 test_AES_GCM_auth_decryption_test_case_256_4(void)
9452 {
9453         return test_authenticated_decryption(&gcm_test_case_256_4);
9454 }
9455
9456 static int
9457 test_AES_GCM_auth_decryption_test_case_256_5(void)
9458 {
9459         return test_authenticated_decryption(&gcm_test_case_256_5);
9460 }
9461
9462 static int
9463 test_AES_GCM_auth_decryption_test_case_256_6(void)
9464 {
9465         return test_authenticated_decryption(&gcm_test_case_256_6);
9466 }
9467
9468 static int
9469 test_AES_GCM_auth_decryption_test_case_256_7(void)
9470 {
9471         return test_authenticated_decryption(&gcm_test_case_256_7);
9472 }
9473
9474 static int
9475 test_AES_GCM_auth_decryption_test_case_aad_1(void)
9476 {
9477         return test_authenticated_decryption(&gcm_test_case_aad_1);
9478 }
9479
9480 static int
9481 test_AES_GCM_auth_decryption_test_case_aad_2(void)
9482 {
9483         return test_authenticated_decryption(&gcm_test_case_aad_2);
9484 }
9485
9486 static int
9487 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
9488 {
9489         struct aead_test_data tdata;
9490         int res;
9491
9492         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9493         tdata.iv.data[0] += 1;
9494         res = test_authenticated_decryption(&tdata);
9495         if (res == -ENOTSUP)
9496                 return res;
9497         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9498         return TEST_SUCCESS;
9499 }
9500
9501 static int
9502 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
9503 {
9504         struct aead_test_data tdata;
9505         int res;
9506
9507         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9508         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9509         tdata.plaintext.data[0] += 1;
9510         res = test_authenticated_decryption(&tdata);
9511         if (res == -ENOTSUP)
9512                 return res;
9513         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9514         return TEST_SUCCESS;
9515 }
9516
9517 static int
9518 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
9519 {
9520         struct aead_test_data tdata;
9521         int res;
9522
9523         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9524         tdata.ciphertext.data[0] += 1;
9525         res = test_authenticated_decryption(&tdata);
9526         if (res == -ENOTSUP)
9527                 return res;
9528         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9529         return TEST_SUCCESS;
9530 }
9531
9532 static int
9533 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
9534 {
9535         struct aead_test_data tdata;
9536         int res;
9537
9538         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9539         tdata.aad.len += 1;
9540         res = test_authenticated_decryption(&tdata);
9541         if (res == -ENOTSUP)
9542                 return res;
9543         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9544         return TEST_SUCCESS;
9545 }
9546
9547 static int
9548 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
9549 {
9550         struct aead_test_data tdata;
9551         uint8_t aad[gcm_test_case_7.aad.len];
9552         int res;
9553
9554         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9555         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9556         aad[0] += 1;
9557         tdata.aad.data = aad;
9558         res = test_authenticated_decryption(&tdata);
9559         if (res == -ENOTSUP)
9560                 return res;
9561         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9562         return TEST_SUCCESS;
9563 }
9564
9565 static int
9566 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
9567 {
9568         struct aead_test_data tdata;
9569         int res;
9570
9571         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9572         tdata.auth_tag.data[0] += 1;
9573         res = test_authenticated_decryption(&tdata);
9574         if (res == -ENOTSUP)
9575                 return res;
9576         TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
9577         return TEST_SUCCESS;
9578 }
9579
9580 static int
9581 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
9582 {
9583         struct crypto_testsuite_params *ts_params = &testsuite_params;
9584         struct crypto_unittest_params *ut_params = &unittest_params;
9585
9586         int retval;
9587         uint8_t *ciphertext, *auth_tag;
9588         uint16_t plaintext_pad_len;
9589
9590         /* Verify the capabilities */
9591         struct rte_cryptodev_sym_capability_idx cap_idx;
9592         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9593         cap_idx.algo.aead = tdata->algo;
9594         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9595                         &cap_idx) == NULL)
9596                 return -ENOTSUP;
9597
9598         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9599                 return -ENOTSUP;
9600
9601         /* not supported with CPU crypto */
9602         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9603                 return -ENOTSUP;
9604
9605         /* Create AEAD session */
9606         retval = create_aead_session(ts_params->valid_devs[0],
9607                         tdata->algo,
9608                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
9609                         tdata->key.data, tdata->key.len,
9610                         tdata->aad.len, tdata->auth_tag.len,
9611                         tdata->iv.len);
9612         if (retval < 0)
9613                 return retval;
9614
9615         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9616         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9617
9618         /* clear mbuf payload */
9619         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9620                         rte_pktmbuf_tailroom(ut_params->ibuf));
9621         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9622                         rte_pktmbuf_tailroom(ut_params->obuf));
9623
9624         /* Create AEAD operation */
9625         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9626         if (retval < 0)
9627                 return retval;
9628
9629         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9630
9631         ut_params->op->sym->m_src = ut_params->ibuf;
9632         ut_params->op->sym->m_dst = ut_params->obuf;
9633
9634         /* Process crypto operation */
9635         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9636                         ut_params->op), "failed to process sym crypto op");
9637
9638         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9639                         "crypto op processing failed");
9640
9641         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9642
9643         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9644                         ut_params->op->sym->cipher.data.offset);
9645         auth_tag = ciphertext + plaintext_pad_len;
9646
9647         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9648         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9649
9650         /* Validate obuf */
9651         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9652                         ciphertext,
9653                         tdata->ciphertext.data,
9654                         tdata->ciphertext.len,
9655                         "Ciphertext data not as expected");
9656
9657         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9658                         auth_tag,
9659                         tdata->auth_tag.data,
9660                         tdata->auth_tag.len,
9661                         "Generated auth tag not as expected");
9662
9663         return 0;
9664
9665 }
9666
9667 static int
9668 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
9669 {
9670         return test_authenticated_encryption_oop(&gcm_test_case_5);
9671 }
9672
9673 static int
9674 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
9675 {
9676         struct crypto_testsuite_params *ts_params = &testsuite_params;
9677         struct crypto_unittest_params *ut_params = &unittest_params;
9678
9679         int retval;
9680         uint8_t *plaintext;
9681
9682         /* Verify the capabilities */
9683         struct rte_cryptodev_sym_capability_idx cap_idx;
9684         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9685         cap_idx.algo.aead = tdata->algo;
9686         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9687                         &cap_idx) == NULL)
9688                 return -ENOTSUP;
9689
9690         /* not supported with CPU crypto and raw data-path APIs*/
9691         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
9692                         global_api_test_type == CRYPTODEV_RAW_API_TEST)
9693                 return -ENOTSUP;
9694
9695         /* Create AEAD session */
9696         retval = create_aead_session(ts_params->valid_devs[0],
9697                         tdata->algo,
9698                         RTE_CRYPTO_AEAD_OP_DECRYPT,
9699                         tdata->key.data, tdata->key.len,
9700                         tdata->aad.len, tdata->auth_tag.len,
9701                         tdata->iv.len);
9702         if (retval < 0)
9703                 return retval;
9704
9705         /* alloc mbuf and set payload */
9706         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9707         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9708
9709         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9710                         rte_pktmbuf_tailroom(ut_params->ibuf));
9711         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9712                         rte_pktmbuf_tailroom(ut_params->obuf));
9713
9714         /* Create AEAD operation */
9715         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9716         if (retval < 0)
9717                 return retval;
9718
9719         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9720
9721         ut_params->op->sym->m_src = ut_params->ibuf;
9722         ut_params->op->sym->m_dst = ut_params->obuf;
9723
9724         /* Process crypto operation */
9725         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9726                         ut_params->op), "failed to process sym crypto op");
9727
9728         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9729                         "crypto op processing failed");
9730
9731         plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9732                         ut_params->op->sym->cipher.data.offset);
9733
9734         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9735
9736         /* Validate obuf */
9737         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9738                         plaintext,
9739                         tdata->plaintext.data,
9740                         tdata->plaintext.len,
9741                         "Plaintext data not as expected");
9742
9743         TEST_ASSERT_EQUAL(ut_params->op->status,
9744                         RTE_CRYPTO_OP_STATUS_SUCCESS,
9745                         "Authentication failed");
9746         return 0;
9747 }
9748
9749 static int
9750 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
9751 {
9752         return test_authenticated_decryption_oop(&gcm_test_case_5);
9753 }
9754
9755 static int
9756 test_authenticated_encryption_sessionless(
9757                 const struct aead_test_data *tdata)
9758 {
9759         struct crypto_testsuite_params *ts_params = &testsuite_params;
9760         struct crypto_unittest_params *ut_params = &unittest_params;
9761
9762         int retval;
9763         uint8_t *ciphertext, *auth_tag;
9764         uint16_t plaintext_pad_len;
9765         uint8_t key[tdata->key.len + 1];
9766         struct rte_cryptodev_info dev_info;
9767
9768         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9769         uint64_t feat_flags = dev_info.feature_flags;
9770
9771         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9772                 printf("Device doesn't support Sessionless ops.\n");
9773                 return -ENOTSUP;
9774         }
9775
9776         /* not supported with CPU crypto */
9777         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9778                 return -ENOTSUP;
9779
9780         /* Verify the capabilities */
9781         struct rte_cryptodev_sym_capability_idx cap_idx;
9782         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9783         cap_idx.algo.aead = tdata->algo;
9784         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9785                         &cap_idx) == NULL)
9786                 return -ENOTSUP;
9787
9788         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9789
9790         /* clear mbuf payload */
9791         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9792                         rte_pktmbuf_tailroom(ut_params->ibuf));
9793
9794         /* Create AEAD operation */
9795         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9796         if (retval < 0)
9797                 return retval;
9798
9799         /* Create GCM xform */
9800         memcpy(key, tdata->key.data, tdata->key.len);
9801         retval = create_aead_xform(ut_params->op,
9802                         tdata->algo,
9803                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
9804                         key, tdata->key.len,
9805                         tdata->aad.len, tdata->auth_tag.len,
9806                         tdata->iv.len);
9807         if (retval < 0)
9808                 return retval;
9809
9810         ut_params->op->sym->m_src = ut_params->ibuf;
9811
9812         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9813                         RTE_CRYPTO_OP_SESSIONLESS,
9814                         "crypto op session type not sessionless");
9815
9816         /* Process crypto operation */
9817         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9818                         ut_params->op), "failed to process sym crypto op");
9819
9820         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9821
9822         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9823                         "crypto op status not success");
9824
9825         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9826
9827         ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9828                         ut_params->op->sym->cipher.data.offset);
9829         auth_tag = ciphertext + plaintext_pad_len;
9830
9831         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9832         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9833
9834         /* Validate obuf */
9835         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9836                         ciphertext,
9837                         tdata->ciphertext.data,
9838                         tdata->ciphertext.len,
9839                         "Ciphertext data not as expected");
9840
9841         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9842                         auth_tag,
9843                         tdata->auth_tag.data,
9844                         tdata->auth_tag.len,
9845                         "Generated auth tag not as expected");
9846
9847         return 0;
9848
9849 }
9850
9851 static int
9852 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
9853 {
9854         return test_authenticated_encryption_sessionless(
9855                         &gcm_test_case_5);
9856 }
9857
9858 static int
9859 test_authenticated_decryption_sessionless(
9860                 const struct aead_test_data *tdata)
9861 {
9862         struct crypto_testsuite_params *ts_params = &testsuite_params;
9863         struct crypto_unittest_params *ut_params = &unittest_params;
9864
9865         int retval;
9866         uint8_t *plaintext;
9867         uint8_t key[tdata->key.len + 1];
9868         struct rte_cryptodev_info dev_info;
9869
9870         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9871         uint64_t feat_flags = dev_info.feature_flags;
9872
9873         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9874                 printf("Device doesn't support Sessionless ops.\n");
9875                 return -ENOTSUP;
9876         }
9877
9878         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9879                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9880                 printf("Device doesn't support RAW data-path APIs.\n");
9881                 return -ENOTSUP;
9882         }
9883
9884         /* not supported with CPU crypto */
9885         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9886                 return -ENOTSUP;
9887
9888         /* Verify the capabilities */
9889         struct rte_cryptodev_sym_capability_idx cap_idx;
9890         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9891         cap_idx.algo.aead = tdata->algo;
9892         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9893                         &cap_idx) == NULL)
9894                 return -ENOTSUP;
9895
9896         /* alloc mbuf and set payload */
9897         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9898
9899         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9900                         rte_pktmbuf_tailroom(ut_params->ibuf));
9901
9902         /* Create AEAD operation */
9903         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9904         if (retval < 0)
9905                 return retval;
9906
9907         /* Create AEAD xform */
9908         memcpy(key, tdata->key.data, tdata->key.len);
9909         retval = create_aead_xform(ut_params->op,
9910                         tdata->algo,
9911                         RTE_CRYPTO_AEAD_OP_DECRYPT,
9912                         key, tdata->key.len,
9913                         tdata->aad.len, tdata->auth_tag.len,
9914                         tdata->iv.len);
9915         if (retval < 0)
9916                 return retval;
9917
9918         ut_params->op->sym->m_src = ut_params->ibuf;
9919
9920         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9921                         RTE_CRYPTO_OP_SESSIONLESS,
9922                         "crypto op session type not sessionless");
9923
9924         /* Process crypto operation */
9925         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9926                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9927                                 ut_params->op, 0, 0, 0, 0);
9928         else
9929                 TEST_ASSERT_NOT_NULL(process_crypto_request(
9930                         ts_params->valid_devs[0], ut_params->op),
9931                                 "failed to process sym crypto op");
9932
9933         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9934
9935         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9936                         "crypto op status not success");
9937
9938         plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9939                         ut_params->op->sym->cipher.data.offset);
9940
9941         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9942
9943         /* Validate obuf */
9944         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9945                         plaintext,
9946                         tdata->plaintext.data,
9947                         tdata->plaintext.len,
9948                         "Plaintext data not as expected");
9949
9950         TEST_ASSERT_EQUAL(ut_params->op->status,
9951                         RTE_CRYPTO_OP_STATUS_SUCCESS,
9952                         "Authentication failed");
9953         return 0;
9954 }
9955
9956 static int
9957 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
9958 {
9959         return test_authenticated_decryption_sessionless(
9960                         &gcm_test_case_5);
9961 }
9962
9963 static int
9964 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
9965 {
9966         return test_authenticated_encryption(&ccm_test_case_128_1);
9967 }
9968
9969 static int
9970 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
9971 {
9972         return test_authenticated_encryption(&ccm_test_case_128_2);
9973 }
9974
9975 static int
9976 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
9977 {
9978         return test_authenticated_encryption(&ccm_test_case_128_3);
9979 }
9980
9981 static int
9982 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
9983 {
9984         return test_authenticated_decryption(&ccm_test_case_128_1);
9985 }
9986
9987 static int
9988 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
9989 {
9990         return test_authenticated_decryption(&ccm_test_case_128_2);
9991 }
9992
9993 static int
9994 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
9995 {
9996         return test_authenticated_decryption(&ccm_test_case_128_3);
9997 }
9998
9999 static int
10000 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
10001 {
10002         return test_authenticated_encryption(&ccm_test_case_192_1);
10003 }
10004
10005 static int
10006 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
10007 {
10008         return test_authenticated_encryption(&ccm_test_case_192_2);
10009 }
10010
10011 static int
10012 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10013 {
10014         return test_authenticated_encryption(&ccm_test_case_192_3);
10015 }
10016
10017 static int
10018 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10019 {
10020         return test_authenticated_decryption(&ccm_test_case_192_1);
10021 }
10022
10023 static int
10024 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10025 {
10026         return test_authenticated_decryption(&ccm_test_case_192_2);
10027 }
10028
10029 static int
10030 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10031 {
10032         return test_authenticated_decryption(&ccm_test_case_192_3);
10033 }
10034
10035 static int
10036 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
10037 {
10038         return test_authenticated_encryption(&ccm_test_case_256_1);
10039 }
10040
10041 static int
10042 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
10043 {
10044         return test_authenticated_encryption(&ccm_test_case_256_2);
10045 }
10046
10047 static int
10048 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
10049 {
10050         return test_authenticated_encryption(&ccm_test_case_256_3);
10051 }
10052
10053 static int
10054 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
10055 {
10056         return test_authenticated_decryption(&ccm_test_case_256_1);
10057 }
10058
10059 static int
10060 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
10061 {
10062         return test_authenticated_decryption(&ccm_test_case_256_2);
10063 }
10064
10065 static int
10066 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
10067 {
10068         return test_authenticated_decryption(&ccm_test_case_256_3);
10069 }
10070
10071 static int
10072 test_stats(void)
10073 {
10074         struct crypto_testsuite_params *ts_params = &testsuite_params;
10075         struct rte_cryptodev_stats stats;
10076
10077         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10078                 return -ENOTSUP;
10079
10080         /* Verify the capabilities */
10081         struct rte_cryptodev_sym_capability_idx cap_idx;
10082         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10083         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
10084         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10085                         &cap_idx) == NULL)
10086                 return -ENOTSUP;
10087         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10088         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10089         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10090                         &cap_idx) == NULL)
10091                 return -ENOTSUP;
10092
10093         if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
10094                         == -ENOTSUP)
10095                 return -ENOTSUP;
10096
10097         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10098         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
10099                         &stats) == -ENODEV),
10100                 "rte_cryptodev_stats_get invalid dev failed");
10101         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
10102                 "rte_cryptodev_stats_get invalid Param failed");
10103
10104         /* Test expected values */
10105         test_AES_CBC_HMAC_SHA1_encrypt_digest();
10106         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10107                         &stats),
10108                 "rte_cryptodev_stats_get failed");
10109         TEST_ASSERT((stats.enqueued_count == 1),
10110                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10111         TEST_ASSERT((stats.dequeued_count == 1),
10112                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10113         TEST_ASSERT((stats.enqueue_err_count == 0),
10114                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10115         TEST_ASSERT((stats.dequeue_err_count == 0),
10116                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10117
10118         /* invalid device but should ignore and not reset device stats*/
10119         rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
10120         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10121                         &stats),
10122                 "rte_cryptodev_stats_get failed");
10123         TEST_ASSERT((stats.enqueued_count == 1),
10124                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10125
10126         /* check that a valid reset clears stats */
10127         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10128         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10129                         &stats),
10130                                           "rte_cryptodev_stats_get failed");
10131         TEST_ASSERT((stats.enqueued_count == 0),
10132                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10133         TEST_ASSERT((stats.dequeued_count == 0),
10134                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10135
10136         return TEST_SUCCESS;
10137 }
10138
10139 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
10140                                    struct crypto_unittest_params *ut_params,
10141                                    enum rte_crypto_auth_operation op,
10142                                    const struct HMAC_MD5_vector *test_case)
10143 {
10144         uint8_t key[64];
10145
10146         memcpy(key, test_case->key.data, test_case->key.len);
10147
10148         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10149         ut_params->auth_xform.next = NULL;
10150         ut_params->auth_xform.auth.op = op;
10151
10152         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
10153
10154         ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
10155         ut_params->auth_xform.auth.key.length = test_case->key.len;
10156         ut_params->auth_xform.auth.key.data = key;
10157
10158         ut_params->sess = rte_cryptodev_sym_session_create(
10159                         ts_params->session_mpool);
10160
10161         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10162                         ut_params->sess, &ut_params->auth_xform,
10163                         ts_params->session_priv_mpool);
10164
10165         if (ut_params->sess == NULL)
10166                 return TEST_FAILED;
10167
10168         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10169
10170         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10171                         rte_pktmbuf_tailroom(ut_params->ibuf));
10172
10173         return 0;
10174 }
10175
10176 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
10177                               const struct HMAC_MD5_vector *test_case,
10178                               uint8_t **plaintext)
10179 {
10180         uint16_t plaintext_pad_len;
10181
10182         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10183
10184         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10185                                 16);
10186
10187         *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10188                         plaintext_pad_len);
10189         memcpy(*plaintext, test_case->plaintext.data,
10190                         test_case->plaintext.len);
10191
10192         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10193                         ut_params->ibuf, MD5_DIGEST_LEN);
10194         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10195                         "no room to append digest");
10196         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10197                         ut_params->ibuf, plaintext_pad_len);
10198
10199         if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10200                 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
10201                            test_case->auth_tag.len);
10202         }
10203
10204         sym_op->auth.data.offset = 0;
10205         sym_op->auth.data.length = test_case->plaintext.len;
10206
10207         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10208         ut_params->op->sym->m_src = ut_params->ibuf;
10209
10210         return 0;
10211 }
10212
10213 static int
10214 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
10215 {
10216         uint16_t plaintext_pad_len;
10217         uint8_t *plaintext, *auth_tag;
10218
10219         struct crypto_testsuite_params *ts_params = &testsuite_params;
10220         struct crypto_unittest_params *ut_params = &unittest_params;
10221         struct rte_cryptodev_info dev_info;
10222
10223         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10224         uint64_t feat_flags = dev_info.feature_flags;
10225
10226         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10227                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10228                 printf("Device doesn't support RAW data-path APIs.\n");
10229                 return -ENOTSUP;
10230         }
10231
10232         /* Verify the capabilities */
10233         struct rte_cryptodev_sym_capability_idx cap_idx;
10234         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10235         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10236         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10237                         &cap_idx) == NULL)
10238                 return -ENOTSUP;
10239
10240         if (MD5_HMAC_create_session(ts_params, ut_params,
10241                         RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
10242                 return TEST_FAILED;
10243
10244         /* Generate Crypto op data structure */
10245         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10246                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10247         TEST_ASSERT_NOT_NULL(ut_params->op,
10248                         "Failed to allocate symmetric crypto operation struct");
10249
10250         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10251                                 16);
10252
10253         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10254                 return TEST_FAILED;
10255
10256         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10257                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10258                         ut_params->op);
10259         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10260                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10261                                 ut_params->op, 0, 1, 0, 0);
10262         else
10263                 TEST_ASSERT_NOT_NULL(
10264                         process_crypto_request(ts_params->valid_devs[0],
10265                                 ut_params->op),
10266                                 "failed to process sym crypto op");
10267
10268         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10269                         "crypto op processing failed");
10270
10271         if (ut_params->op->sym->m_dst) {
10272                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
10273                                 uint8_t *, plaintext_pad_len);
10274         } else {
10275                 auth_tag = plaintext + plaintext_pad_len;
10276         }
10277
10278         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10279                         auth_tag,
10280                         test_case->auth_tag.data,
10281                         test_case->auth_tag.len,
10282                         "HMAC_MD5 generated tag not as expected");
10283
10284         return TEST_SUCCESS;
10285 }
10286
10287 static int
10288 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
10289 {
10290         uint8_t *plaintext;
10291
10292         struct crypto_testsuite_params *ts_params = &testsuite_params;
10293         struct crypto_unittest_params *ut_params = &unittest_params;
10294         struct rte_cryptodev_info dev_info;
10295
10296         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10297         uint64_t feat_flags = dev_info.feature_flags;
10298
10299         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10300                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10301                 printf("Device doesn't support RAW data-path APIs.\n");
10302                 return -ENOTSUP;
10303         }
10304
10305         /* Verify the capabilities */
10306         struct rte_cryptodev_sym_capability_idx cap_idx;
10307         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10308         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10309         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10310                         &cap_idx) == NULL)
10311                 return -ENOTSUP;
10312
10313         if (MD5_HMAC_create_session(ts_params, ut_params,
10314                         RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
10315                 return TEST_FAILED;
10316         }
10317
10318         /* Generate Crypto op data structure */
10319         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10320                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10321         TEST_ASSERT_NOT_NULL(ut_params->op,
10322                         "Failed to allocate symmetric crypto operation struct");
10323
10324         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10325                 return TEST_FAILED;
10326
10327         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10328                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10329                         ut_params->op);
10330         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10331                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10332                                 ut_params->op, 0, 1, 0, 0);
10333         else
10334                 TEST_ASSERT_NOT_NULL(
10335                         process_crypto_request(ts_params->valid_devs[0],
10336                                 ut_params->op),
10337                                 "failed to process sym crypto op");
10338
10339         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10340                         "HMAC_MD5 crypto op processing failed");
10341
10342         return TEST_SUCCESS;
10343 }
10344
10345 static int
10346 test_MD5_HMAC_generate_case_1(void)
10347 {
10348         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
10349 }
10350
10351 static int
10352 test_MD5_HMAC_verify_case_1(void)
10353 {
10354         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
10355 }
10356
10357 static int
10358 test_MD5_HMAC_generate_case_2(void)
10359 {
10360         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
10361 }
10362
10363 static int
10364 test_MD5_HMAC_verify_case_2(void)
10365 {
10366         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
10367 }
10368
10369 static int
10370 test_multi_session(void)
10371 {
10372         struct crypto_testsuite_params *ts_params = &testsuite_params;
10373         struct crypto_unittest_params *ut_params = &unittest_params;
10374
10375         struct rte_cryptodev_info dev_info;
10376         struct rte_cryptodev_sym_session **sessions;
10377
10378         uint16_t i;
10379
10380         /* Verify the capabilities */
10381         struct rte_cryptodev_sym_capability_idx cap_idx;
10382         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10383         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10384         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10385                         &cap_idx) == NULL)
10386                 return -ENOTSUP;
10387         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10388         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10389         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10390                         &cap_idx) == NULL)
10391                 return -ENOTSUP;
10392
10393         test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
10394                         aes_cbc_key, hmac_sha512_key);
10395
10396
10397         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10398
10399         sessions = rte_malloc(NULL,
10400                         (sizeof(struct rte_cryptodev_sym_session *) *
10401                         MAX_NB_SESSIONS) + 1, 0);
10402
10403         /* Create multiple crypto sessions*/
10404         for (i = 0; i < MAX_NB_SESSIONS; i++) {
10405
10406                 sessions[i] = rte_cryptodev_sym_session_create(
10407                                 ts_params->session_mpool);
10408
10409                 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10410                                 sessions[i], &ut_params->auth_xform,
10411                                 ts_params->session_priv_mpool);
10412                 TEST_ASSERT_NOT_NULL(sessions[i],
10413                                 "Session creation failed at session number %u",
10414                                 i);
10415
10416                 /* Attempt to send a request on each session */
10417                 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
10418                         sessions[i],
10419                         ut_params,
10420                         ts_params,
10421                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
10422                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
10423                         aes_cbc_iv),
10424                         "Failed to perform decrypt on request number %u.", i);
10425                 /* free crypto operation structure */
10426                 if (ut_params->op)
10427                         rte_crypto_op_free(ut_params->op);
10428
10429                 /*
10430                  * free mbuf - both obuf and ibuf are usually the same,
10431                  * so check if they point at the same address is necessary,
10432                  * to avoid freeing the mbuf twice.
10433                  */
10434                 if (ut_params->obuf) {
10435                         rte_pktmbuf_free(ut_params->obuf);
10436                         if (ut_params->ibuf == ut_params->obuf)
10437                                 ut_params->ibuf = 0;
10438                         ut_params->obuf = 0;
10439                 }
10440                 if (ut_params->ibuf) {
10441                         rte_pktmbuf_free(ut_params->ibuf);
10442                         ut_params->ibuf = 0;
10443                 }
10444         }
10445
10446         /* Next session create should fail */
10447         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10448                         sessions[i], &ut_params->auth_xform,
10449                         ts_params->session_priv_mpool);
10450         TEST_ASSERT_NULL(sessions[i],
10451                         "Session creation succeeded unexpectedly!");
10452
10453         for (i = 0; i < MAX_NB_SESSIONS; i++) {
10454                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10455                                 sessions[i]);
10456                 rte_cryptodev_sym_session_free(sessions[i]);
10457         }
10458
10459         rte_free(sessions);
10460
10461         return TEST_SUCCESS;
10462 }
10463
10464 struct multi_session_params {
10465         struct crypto_unittest_params ut_params;
10466         uint8_t *cipher_key;
10467         uint8_t *hmac_key;
10468         const uint8_t *cipher;
10469         const uint8_t *digest;
10470         uint8_t *iv;
10471 };
10472
10473 #define MB_SESSION_NUMBER 3
10474
10475 static int
10476 test_multi_session_random_usage(void)
10477 {
10478         struct crypto_testsuite_params *ts_params = &testsuite_params;
10479         struct rte_cryptodev_info dev_info;
10480         struct rte_cryptodev_sym_session **sessions;
10481         uint32_t i, j;
10482         struct multi_session_params ut_paramz[] = {
10483
10484                 {
10485                         .cipher_key = ms_aes_cbc_key0,
10486                         .hmac_key = ms_hmac_key0,
10487                         .cipher = ms_aes_cbc_cipher0,
10488                         .digest = ms_hmac_digest0,
10489                         .iv = ms_aes_cbc_iv0
10490                 },
10491                 {
10492                         .cipher_key = ms_aes_cbc_key1,
10493                         .hmac_key = ms_hmac_key1,
10494                         .cipher = ms_aes_cbc_cipher1,
10495                         .digest = ms_hmac_digest1,
10496                         .iv = ms_aes_cbc_iv1
10497                 },
10498                 {
10499                         .cipher_key = ms_aes_cbc_key2,
10500                         .hmac_key = ms_hmac_key2,
10501                         .cipher = ms_aes_cbc_cipher2,
10502                         .digest = ms_hmac_digest2,
10503                         .iv = ms_aes_cbc_iv2
10504                 },
10505
10506         };
10507
10508         /* Verify the capabilities */
10509         struct rte_cryptodev_sym_capability_idx cap_idx;
10510         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10511         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10512         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10513                         &cap_idx) == NULL)
10514                 return -ENOTSUP;
10515         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10516         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10517         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10518                         &cap_idx) == NULL)
10519                 return -ENOTSUP;
10520
10521         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10522
10523         sessions = rte_malloc(NULL,
10524                         (sizeof(struct rte_cryptodev_sym_session *)
10525                                         * MAX_NB_SESSIONS) + 1, 0);
10526
10527         for (i = 0; i < MB_SESSION_NUMBER; i++) {
10528                 sessions[i] = rte_cryptodev_sym_session_create(
10529                                 ts_params->session_mpool);
10530
10531                 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
10532                                 sizeof(struct crypto_unittest_params));
10533
10534                 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
10535                                 &ut_paramz[i].ut_params,
10536                                 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
10537
10538                 /* Create multiple crypto sessions*/
10539                 rte_cryptodev_sym_session_init(
10540                                 ts_params->valid_devs[0],
10541                                 sessions[i],
10542                                 &ut_paramz[i].ut_params.auth_xform,
10543                                 ts_params->session_priv_mpool);
10544
10545                 TEST_ASSERT_NOT_NULL(sessions[i],
10546                                 "Session creation failed at session number %u",
10547                                 i);
10548
10549         }
10550
10551         srand(time(NULL));
10552         for (i = 0; i < 40000; i++) {
10553
10554                 j = rand() % MB_SESSION_NUMBER;
10555
10556                 TEST_ASSERT_SUCCESS(
10557                         test_AES_CBC_HMAC_SHA512_decrypt_perform(
10558                                         sessions[j],
10559                                         &ut_paramz[j].ut_params,
10560                                         ts_params, ut_paramz[j].cipher,
10561                                         ut_paramz[j].digest,
10562                                         ut_paramz[j].iv),
10563                         "Failed to perform decrypt on request number %u.", i);
10564
10565                 if (ut_paramz[j].ut_params.op)
10566                         rte_crypto_op_free(ut_paramz[j].ut_params.op);
10567
10568                 /*
10569                  * free mbuf - both obuf and ibuf are usually the same,
10570                  * so check if they point at the same address is necessary,
10571                  * to avoid freeing the mbuf twice.
10572                  */
10573                 if (ut_paramz[j].ut_params.obuf) {
10574                         rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
10575                         if (ut_paramz[j].ut_params.ibuf
10576                                         == ut_paramz[j].ut_params.obuf)
10577                                 ut_paramz[j].ut_params.ibuf = 0;
10578                         ut_paramz[j].ut_params.obuf = 0;
10579                 }
10580                 if (ut_paramz[j].ut_params.ibuf) {
10581                         rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
10582                         ut_paramz[j].ut_params.ibuf = 0;
10583                 }
10584         }
10585
10586         for (i = 0; i < MB_SESSION_NUMBER; i++) {
10587                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10588                                 sessions[i]);
10589                 rte_cryptodev_sym_session_free(sessions[i]);
10590         }
10591
10592         rte_free(sessions);
10593
10594         return TEST_SUCCESS;
10595 }
10596
10597 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
10598                         0xab, 0xab, 0xab, 0xab,
10599                         0xab, 0xab, 0xab, 0xab,
10600                         0xab, 0xab, 0xab, 0xab};
10601
10602 static int
10603 test_null_invalid_operation(void)
10604 {
10605         struct crypto_testsuite_params *ts_params = &testsuite_params;
10606         struct crypto_unittest_params *ut_params = &unittest_params;
10607         int ret;
10608
10609         /* This test is for NULL PMD only */
10610         if (gbl_driver_id != rte_cryptodev_driver_id_get(
10611                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10612                 return -ENOTSUP;
10613
10614         /* Setup Cipher Parameters */
10615         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10616         ut_params->cipher_xform.next = NULL;
10617
10618         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
10619         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10620
10621         ut_params->sess = rte_cryptodev_sym_session_create(
10622                         ts_params->session_mpool);
10623
10624         /* Create Crypto session*/
10625         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10626                         ut_params->sess, &ut_params->cipher_xform,
10627                         ts_params->session_priv_mpool);
10628         TEST_ASSERT(ret < 0,
10629                         "Session creation succeeded unexpectedly");
10630
10631
10632         /* Setup HMAC Parameters */
10633         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10634         ut_params->auth_xform.next = NULL;
10635
10636         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
10637         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10638
10639         ut_params->sess = rte_cryptodev_sym_session_create(
10640                         ts_params->session_mpool);
10641
10642         /* Create Crypto session*/
10643         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10644                         ut_params->sess, &ut_params->auth_xform,
10645                         ts_params->session_priv_mpool);
10646         TEST_ASSERT(ret < 0,
10647                         "Session creation succeeded unexpectedly");
10648
10649         return TEST_SUCCESS;
10650 }
10651
10652
10653 #define NULL_BURST_LENGTH (32)
10654
10655 static int
10656 test_null_burst_operation(void)
10657 {
10658         struct crypto_testsuite_params *ts_params = &testsuite_params;
10659         struct crypto_unittest_params *ut_params = &unittest_params;
10660
10661         unsigned i, burst_len = NULL_BURST_LENGTH;
10662
10663         struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
10664         struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
10665
10666         /* This test is for NULL PMD only */
10667         if (gbl_driver_id != rte_cryptodev_driver_id_get(
10668                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10669                 return -ENOTSUP;
10670
10671         /* Setup Cipher Parameters */
10672         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10673         ut_params->cipher_xform.next = &ut_params->auth_xform;
10674
10675         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
10676         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10677
10678         /* Setup HMAC Parameters */
10679         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10680         ut_params->auth_xform.next = NULL;
10681
10682         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
10683         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10684
10685         ut_params->sess = rte_cryptodev_sym_session_create(
10686                         ts_params->session_mpool);
10687
10688         /* Create Crypto session*/
10689         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10690                         ut_params->sess, &ut_params->cipher_xform,
10691                         ts_params->session_priv_mpool);
10692         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10693
10694         TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
10695                         RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
10696                         burst_len, "failed to generate burst of crypto ops");
10697
10698         /* Generate an operation for each mbuf in burst */
10699         for (i = 0; i < burst_len; i++) {
10700                 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10701
10702                 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
10703
10704                 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
10705                                 sizeof(unsigned));
10706                 *data = i;
10707
10708                 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
10709
10710                 burst[i]->sym->m_src = m;
10711         }
10712
10713         /* Process crypto operation */
10714         TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
10715                         0, burst, burst_len),
10716                         burst_len,
10717                         "Error enqueuing burst");
10718
10719         TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
10720                         0, burst_dequeued, burst_len),
10721                         burst_len,
10722                         "Error dequeuing burst");
10723
10724
10725         for (i = 0; i < burst_len; i++) {
10726                 TEST_ASSERT_EQUAL(
10727                         *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
10728                         *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
10729                                         uint32_t *),
10730                         "data not as expected");
10731
10732                 rte_pktmbuf_free(burst[i]->sym->m_src);
10733                 rte_crypto_op_free(burst[i]);
10734         }
10735
10736         return TEST_SUCCESS;
10737 }
10738
10739 static uint16_t
10740 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
10741                   uint16_t nb_ops, void *user_param)
10742 {
10743         RTE_SET_USED(dev_id);
10744         RTE_SET_USED(qp_id);
10745         RTE_SET_USED(ops);
10746         RTE_SET_USED(user_param);
10747
10748         printf("crypto enqueue callback called\n");
10749         return nb_ops;
10750 }
10751
10752 static uint16_t
10753 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
10754                   uint16_t nb_ops, void *user_param)
10755 {
10756         RTE_SET_USED(dev_id);
10757         RTE_SET_USED(qp_id);
10758         RTE_SET_USED(ops);
10759         RTE_SET_USED(user_param);
10760
10761         printf("crypto dequeue callback called\n");
10762         return nb_ops;
10763 }
10764
10765 /*
10766  * Thread using enqueue/dequeue callback with RCU.
10767  */
10768 static int
10769 test_enqdeq_callback_thread(void *arg)
10770 {
10771         RTE_SET_USED(arg);
10772         /* DP thread calls rte_cryptodev_enqueue_burst()/
10773          * rte_cryptodev_dequeue_burst() and invokes callback.
10774          */
10775         test_null_burst_operation();
10776         return 0;
10777 }
10778
10779 static int
10780 test_enq_callback_setup(void)
10781 {
10782         struct crypto_testsuite_params *ts_params = &testsuite_params;
10783         struct rte_cryptodev_info dev_info;
10784         struct rte_cryptodev_qp_conf qp_conf = {
10785                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
10786         };
10787
10788         struct rte_cryptodev_cb *cb;
10789         uint16_t qp_id = 0;
10790
10791         /* Stop the device in case it's started so it can be configured */
10792         rte_cryptodev_stop(ts_params->valid_devs[0]);
10793
10794         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10795
10796         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
10797                         &ts_params->conf),
10798                         "Failed to configure cryptodev %u",
10799                         ts_params->valid_devs[0]);
10800
10801         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
10802         qp_conf.mp_session = ts_params->session_mpool;
10803         qp_conf.mp_session_private = ts_params->session_priv_mpool;
10804
10805         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
10806                         ts_params->valid_devs[0], qp_id, &qp_conf,
10807                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
10808                         "Failed test for "
10809                         "rte_cryptodev_queue_pair_setup: num_inflights "
10810                         "%u on qp %u on cryptodev %u",
10811                         qp_conf.nb_descriptors, qp_id,
10812                         ts_params->valid_devs[0]);
10813
10814         /* Test with invalid crypto device */
10815         cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
10816                         qp_id, test_enq_callback, NULL);
10817         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10818                         "cryptodev %u did not fail",
10819                         qp_id, RTE_CRYPTO_MAX_DEVS);
10820
10821         /* Test with invalid queue pair */
10822         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10823                         dev_info.max_nb_queue_pairs + 1,
10824                         test_enq_callback, NULL);
10825         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10826                         "cryptodev %u did not fail",
10827                         dev_info.max_nb_queue_pairs + 1,
10828                         ts_params->valid_devs[0]);
10829
10830         /* Test with NULL callback */
10831         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10832                         qp_id, NULL, NULL);
10833         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10834                         "cryptodev %u did not fail",
10835                         qp_id, ts_params->valid_devs[0]);
10836
10837         /* Test with valid configuration */
10838         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10839                         qp_id, test_enq_callback, NULL);
10840         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
10841                         "qp %u on cryptodev %u",
10842                         qp_id, ts_params->valid_devs[0]);
10843
10844         rte_cryptodev_start(ts_params->valid_devs[0]);
10845
10846         /* Launch a thread */
10847         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
10848                                 rte_get_next_lcore(-1, 1, 0));
10849
10850         /* Wait until reader exited. */
10851         rte_eal_mp_wait_lcore();
10852
10853         /* Test with invalid crypto device */
10854         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10855                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
10856                         "Expected call to fail as crypto device is invalid");
10857
10858         /* Test with invalid queue pair */
10859         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10860                         ts_params->valid_devs[0],
10861                         dev_info.max_nb_queue_pairs + 1, cb),
10862                         "Expected call to fail as queue pair is invalid");
10863
10864         /* Test with NULL callback */
10865         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10866                         ts_params->valid_devs[0], qp_id, NULL),
10867                         "Expected call to fail as callback is NULL");
10868
10869         /* Test with valid configuration */
10870         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
10871                         ts_params->valid_devs[0], qp_id, cb),
10872                         "Failed test to remove callback on "
10873                         "qp %u on cryptodev %u",
10874                         qp_id, ts_params->valid_devs[0]);
10875
10876         return TEST_SUCCESS;
10877 }
10878
10879 static int
10880 test_deq_callback_setup(void)
10881 {
10882         struct crypto_testsuite_params *ts_params = &testsuite_params;
10883         struct rte_cryptodev_info dev_info;
10884         struct rte_cryptodev_qp_conf qp_conf = {
10885                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
10886         };
10887
10888         struct rte_cryptodev_cb *cb;
10889         uint16_t qp_id = 0;
10890
10891         /* Stop the device in case it's started so it can be configured */
10892         rte_cryptodev_stop(ts_params->valid_devs[0]);
10893
10894         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10895
10896         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
10897                         &ts_params->conf),
10898                         "Failed to configure cryptodev %u",
10899                         ts_params->valid_devs[0]);
10900
10901         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
10902         qp_conf.mp_session = ts_params->session_mpool;
10903         qp_conf.mp_session_private = ts_params->session_priv_mpool;
10904
10905         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
10906                         ts_params->valid_devs[0], qp_id, &qp_conf,
10907                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
10908                         "Failed test for "
10909                         "rte_cryptodev_queue_pair_setup: num_inflights "
10910                         "%u on qp %u on cryptodev %u",
10911                         qp_conf.nb_descriptors, qp_id,
10912                         ts_params->valid_devs[0]);
10913
10914         /* Test with invalid crypto device */
10915         cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
10916                         qp_id, test_deq_callback, NULL);
10917         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10918                         "cryptodev %u did not fail",
10919                         qp_id, RTE_CRYPTO_MAX_DEVS);
10920
10921         /* Test with invalid queue pair */
10922         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10923                         dev_info.max_nb_queue_pairs + 1,
10924                         test_deq_callback, NULL);
10925         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10926                         "cryptodev %u did not fail",
10927                         dev_info.max_nb_queue_pairs + 1,
10928                         ts_params->valid_devs[0]);
10929
10930         /* Test with NULL callback */
10931         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10932                         qp_id, NULL, NULL);
10933         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10934                         "cryptodev %u did not fail",
10935                         qp_id, ts_params->valid_devs[0]);
10936
10937         /* Test with valid configuration */
10938         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10939                         qp_id, test_deq_callback, NULL);
10940         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
10941                         "qp %u on cryptodev %u",
10942                         qp_id, ts_params->valid_devs[0]);
10943
10944         rte_cryptodev_start(ts_params->valid_devs[0]);
10945
10946         /* Launch a thread */
10947         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
10948                                 rte_get_next_lcore(-1, 1, 0));
10949
10950         /* Wait until reader exited. */
10951         rte_eal_mp_wait_lcore();
10952
10953         /* Test with invalid crypto device */
10954         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10955                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
10956                         "Expected call to fail as crypto device is invalid");
10957
10958         /* Test with invalid queue pair */
10959         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10960                         ts_params->valid_devs[0],
10961                         dev_info.max_nb_queue_pairs + 1, cb),
10962                         "Expected call to fail as queue pair is invalid");
10963
10964         /* Test with NULL callback */
10965         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10966                         ts_params->valid_devs[0], qp_id, NULL),
10967                         "Expected call to fail as callback is NULL");
10968
10969         /* Test with valid configuration */
10970         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
10971                         ts_params->valid_devs[0], qp_id, cb),
10972                         "Failed test to remove callback on "
10973                         "qp %u on cryptodev %u",
10974                         qp_id, ts_params->valid_devs[0]);
10975
10976         return TEST_SUCCESS;
10977 }
10978
10979 static void
10980 generate_gmac_large_plaintext(uint8_t *data)
10981 {
10982         uint16_t i;
10983
10984         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
10985                 memcpy(&data[i], &data[0], 32);
10986 }
10987
10988 static int
10989 create_gmac_operation(enum rte_crypto_auth_operation op,
10990                 const struct gmac_test_data *tdata)
10991 {
10992         struct crypto_testsuite_params *ts_params = &testsuite_params;
10993         struct crypto_unittest_params *ut_params = &unittest_params;
10994         struct rte_crypto_sym_op *sym_op;
10995
10996         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10997
10998         /* Generate Crypto op data structure */
10999         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11000                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11001         TEST_ASSERT_NOT_NULL(ut_params->op,
11002                         "Failed to allocate symmetric crypto operation struct");
11003
11004         sym_op = ut_params->op->sym;
11005
11006         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11007                         ut_params->ibuf, tdata->gmac_tag.len);
11008         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11009                         "no room to append digest");
11010
11011         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11012                         ut_params->ibuf, plaintext_pad_len);
11013
11014         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11015                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11016                                 tdata->gmac_tag.len);
11017                 debug_hexdump(stdout, "digest:",
11018                                 sym_op->auth.digest.data,
11019                                 tdata->gmac_tag.len);
11020         }
11021
11022         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11023                         uint8_t *, IV_OFFSET);
11024
11025         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11026
11027         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11028
11029         sym_op->cipher.data.length = 0;
11030         sym_op->cipher.data.offset = 0;
11031
11032         sym_op->auth.data.offset = 0;
11033         sym_op->auth.data.length = tdata->plaintext.len;
11034
11035         return 0;
11036 }
11037
11038 static int
11039 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
11040                 const struct gmac_test_data *tdata,
11041                 void *digest_mem, uint64_t digest_phys)
11042 {
11043         struct crypto_testsuite_params *ts_params = &testsuite_params;
11044         struct crypto_unittest_params *ut_params = &unittest_params;
11045         struct rte_crypto_sym_op *sym_op;
11046
11047         /* Generate Crypto op data structure */
11048         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11049                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11050         TEST_ASSERT_NOT_NULL(ut_params->op,
11051                         "Failed to allocate symmetric crypto operation struct");
11052
11053         sym_op = ut_params->op->sym;
11054
11055         sym_op->auth.digest.data = digest_mem;
11056         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11057                         "no room to append digest");
11058
11059         sym_op->auth.digest.phys_addr = digest_phys;
11060
11061         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11062                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11063                                 tdata->gmac_tag.len);
11064                 debug_hexdump(stdout, "digest:",
11065                                 sym_op->auth.digest.data,
11066                                 tdata->gmac_tag.len);
11067         }
11068
11069         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11070                         uint8_t *, IV_OFFSET);
11071
11072         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11073
11074         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11075
11076         sym_op->cipher.data.length = 0;
11077         sym_op->cipher.data.offset = 0;
11078
11079         sym_op->auth.data.offset = 0;
11080         sym_op->auth.data.length = tdata->plaintext.len;
11081
11082         return 0;
11083 }
11084
11085 static int create_gmac_session(uint8_t dev_id,
11086                 const struct gmac_test_data *tdata,
11087                 enum rte_crypto_auth_operation auth_op)
11088 {
11089         uint8_t auth_key[tdata->key.len];
11090
11091         struct crypto_testsuite_params *ts_params = &testsuite_params;
11092         struct crypto_unittest_params *ut_params = &unittest_params;
11093
11094         memcpy(auth_key, tdata->key.data, tdata->key.len);
11095
11096         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11097         ut_params->auth_xform.next = NULL;
11098
11099         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
11100         ut_params->auth_xform.auth.op = auth_op;
11101         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
11102         ut_params->auth_xform.auth.key.length = tdata->key.len;
11103         ut_params->auth_xform.auth.key.data = auth_key;
11104         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11105         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
11106
11107
11108         ut_params->sess = rte_cryptodev_sym_session_create(
11109                         ts_params->session_mpool);
11110
11111         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11112                         &ut_params->auth_xform,
11113                         ts_params->session_priv_mpool);
11114
11115         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11116
11117         return 0;
11118 }
11119
11120 static int
11121 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
11122 {
11123         struct crypto_testsuite_params *ts_params = &testsuite_params;
11124         struct crypto_unittest_params *ut_params = &unittest_params;
11125         struct rte_cryptodev_info dev_info;
11126
11127         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11128         uint64_t feat_flags = dev_info.feature_flags;
11129
11130         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11131                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11132                 printf("Device doesn't support RAW data-path APIs.\n");
11133                 return -ENOTSUP;
11134         }
11135
11136         int retval;
11137
11138         uint8_t *auth_tag, *plaintext;
11139         uint16_t plaintext_pad_len;
11140
11141         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11142                               "No GMAC length in the source data");
11143
11144         /* Verify the capabilities */
11145         struct rte_cryptodev_sym_capability_idx cap_idx;
11146         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11147         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11148         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11149                         &cap_idx) == NULL)
11150                 return -ENOTSUP;
11151
11152         retval = create_gmac_session(ts_params->valid_devs[0],
11153                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11154
11155         if (retval < 0)
11156                 return retval;
11157
11158         if (tdata->plaintext.len > MBUF_SIZE)
11159                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11160         else
11161                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11162         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11163                         "Failed to allocate input buffer in mempool");
11164
11165         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11166                         rte_pktmbuf_tailroom(ut_params->ibuf));
11167
11168         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11169         /*
11170          * Runtime generate the large plain text instead of use hard code
11171          * plain text vector. It is done to avoid create huge source file
11172          * with the test vector.
11173          */
11174         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11175                 generate_gmac_large_plaintext(tdata->plaintext.data);
11176
11177         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11178                                 plaintext_pad_len);
11179         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11180
11181         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11182         debug_hexdump(stdout, "plaintext:", plaintext,
11183                         tdata->plaintext.len);
11184
11185         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
11186                         tdata);
11187
11188         if (retval < 0)
11189                 return retval;
11190
11191         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11192
11193         ut_params->op->sym->m_src = ut_params->ibuf;
11194
11195         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11196                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11197                         ut_params->op);
11198         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11199                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11200                                 ut_params->op, 0, 1, 0, 0);
11201         else
11202                 TEST_ASSERT_NOT_NULL(
11203                         process_crypto_request(ts_params->valid_devs[0],
11204                         ut_params->op), "failed to process sym crypto op");
11205
11206         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11207                         "crypto op processing failed");
11208
11209         if (ut_params->op->sym->m_dst) {
11210                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11211                                 uint8_t *, plaintext_pad_len);
11212         } else {
11213                 auth_tag = plaintext + plaintext_pad_len;
11214         }
11215
11216         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11217
11218         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11219                         auth_tag,
11220                         tdata->gmac_tag.data,
11221                         tdata->gmac_tag.len,
11222                         "GMAC Generated auth tag not as expected");
11223
11224         return 0;
11225 }
11226
11227 static int
11228 test_AES_GMAC_authentication_test_case_1(void)
11229 {
11230         return test_AES_GMAC_authentication(&gmac_test_case_1);
11231 }
11232
11233 static int
11234 test_AES_GMAC_authentication_test_case_2(void)
11235 {
11236         return test_AES_GMAC_authentication(&gmac_test_case_2);
11237 }
11238
11239 static int
11240 test_AES_GMAC_authentication_test_case_3(void)
11241 {
11242         return test_AES_GMAC_authentication(&gmac_test_case_3);
11243 }
11244
11245 static int
11246 test_AES_GMAC_authentication_test_case_4(void)
11247 {
11248         return test_AES_GMAC_authentication(&gmac_test_case_4);
11249 }
11250
11251 static int
11252 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
11253 {
11254         struct crypto_testsuite_params *ts_params = &testsuite_params;
11255         struct crypto_unittest_params *ut_params = &unittest_params;
11256         int retval;
11257         uint32_t plaintext_pad_len;
11258         uint8_t *plaintext;
11259         struct rte_cryptodev_info dev_info;
11260
11261         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11262         uint64_t feat_flags = dev_info.feature_flags;
11263
11264         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11265                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11266                 printf("Device doesn't support RAW data-path APIs.\n");
11267                 return -ENOTSUP;
11268         }
11269
11270         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11271                               "No GMAC length in the source data");
11272
11273         /* Verify the capabilities */
11274         struct rte_cryptodev_sym_capability_idx cap_idx;
11275         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11276         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11277         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11278                         &cap_idx) == NULL)
11279                 return -ENOTSUP;
11280
11281         retval = create_gmac_session(ts_params->valid_devs[0],
11282                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
11283
11284         if (retval < 0)
11285                 return retval;
11286
11287         if (tdata->plaintext.len > MBUF_SIZE)
11288                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11289         else
11290                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11291         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11292                         "Failed to allocate input buffer in mempool");
11293
11294         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11295                         rte_pktmbuf_tailroom(ut_params->ibuf));
11296
11297         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11298
11299         /*
11300          * Runtime generate the large plain text instead of use hard code
11301          * plain text vector. It is done to avoid create huge source file
11302          * with the test vector.
11303          */
11304         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11305                 generate_gmac_large_plaintext(tdata->plaintext.data);
11306
11307         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11308                                 plaintext_pad_len);
11309         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11310
11311         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11312         debug_hexdump(stdout, "plaintext:", plaintext,
11313                         tdata->plaintext.len);
11314
11315         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
11316                         tdata);
11317
11318         if (retval < 0)
11319                 return retval;
11320
11321         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11322
11323         ut_params->op->sym->m_src = ut_params->ibuf;
11324
11325         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11326                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11327                         ut_params->op);
11328         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11329                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11330                                 ut_params->op, 0, 1, 0, 0);
11331         else
11332                 TEST_ASSERT_NOT_NULL(
11333                         process_crypto_request(ts_params->valid_devs[0],
11334                         ut_params->op), "failed to process sym crypto op");
11335
11336         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11337                         "crypto op processing failed");
11338
11339         return 0;
11340
11341 }
11342
11343 static int
11344 test_AES_GMAC_authentication_verify_test_case_1(void)
11345 {
11346         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
11347 }
11348
11349 static int
11350 test_AES_GMAC_authentication_verify_test_case_2(void)
11351 {
11352         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
11353 }
11354
11355 static int
11356 test_AES_GMAC_authentication_verify_test_case_3(void)
11357 {
11358         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
11359 }
11360
11361 static int
11362 test_AES_GMAC_authentication_verify_test_case_4(void)
11363 {
11364         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
11365 }
11366
11367 static int
11368 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
11369                                 uint32_t fragsz)
11370 {
11371         struct crypto_testsuite_params *ts_params = &testsuite_params;
11372         struct crypto_unittest_params *ut_params = &unittest_params;
11373         struct rte_cryptodev_info dev_info;
11374         uint64_t feature_flags;
11375         unsigned int trn_data = 0;
11376         void *digest_mem = NULL;
11377         uint32_t segs = 1;
11378         unsigned int to_trn = 0;
11379         struct rte_mbuf *buf = NULL;
11380         uint8_t *auth_tag, *plaintext;
11381         int retval;
11382
11383         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11384                               "No GMAC length in the source data");
11385
11386         /* Verify the capabilities */
11387         struct rte_cryptodev_sym_capability_idx cap_idx;
11388         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11389         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11390         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11391                         &cap_idx) == NULL)
11392                 return -ENOTSUP;
11393
11394         /* Check for any input SGL support */
11395         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11396         feature_flags = dev_info.feature_flags;
11397
11398         if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
11399                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
11400                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
11401                 return -ENOTSUP;
11402
11403         if (fragsz > tdata->plaintext.len)
11404                 fragsz = tdata->plaintext.len;
11405
11406         uint16_t plaintext_len = fragsz;
11407
11408         retval = create_gmac_session(ts_params->valid_devs[0],
11409                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11410
11411         if (retval < 0)
11412                 return retval;
11413
11414         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11415         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11416                         "Failed to allocate input buffer in mempool");
11417
11418         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11419                         rte_pktmbuf_tailroom(ut_params->ibuf));
11420
11421         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11422                                 plaintext_len);
11423         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11424
11425         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
11426
11427         trn_data += plaintext_len;
11428
11429         buf = ut_params->ibuf;
11430
11431         /*
11432          * Loop until no more fragments
11433          */
11434
11435         while (trn_data < tdata->plaintext.len) {
11436                 ++segs;
11437                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
11438                                 (tdata->plaintext.len - trn_data) : fragsz;
11439
11440                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11441                 buf = buf->next;
11442
11443                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
11444                                 rte_pktmbuf_tailroom(buf));
11445
11446                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
11447                                 to_trn);
11448
11449                 memcpy(plaintext, tdata->plaintext.data + trn_data,
11450                                 to_trn);
11451                 trn_data += to_trn;
11452                 if (trn_data  == tdata->plaintext.len)
11453                         digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
11454                                         tdata->gmac_tag.len);
11455         }
11456         ut_params->ibuf->nb_segs = segs;
11457
11458         /*
11459          * Place digest at the end of the last buffer
11460          */
11461         uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
11462
11463         if (!digest_mem) {
11464                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11465                                 + tdata->gmac_tag.len);
11466                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
11467                                 tdata->plaintext.len);
11468         }
11469
11470         retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
11471                         tdata, digest_mem, digest_phys);
11472
11473         if (retval < 0)
11474                 return retval;
11475
11476         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11477
11478         ut_params->op->sym->m_src = ut_params->ibuf;
11479
11480         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11481                 return -ENOTSUP;
11482
11483         TEST_ASSERT_NOT_NULL(
11484                 process_crypto_request(ts_params->valid_devs[0],
11485                 ut_params->op), "failed to process sym crypto op");
11486
11487         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11488                         "crypto op processing failed");
11489
11490         auth_tag = digest_mem;
11491         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11492         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11493                         auth_tag,
11494                         tdata->gmac_tag.data,
11495                         tdata->gmac_tag.len,
11496                         "GMAC Generated auth tag not as expected");
11497
11498         return 0;
11499 }
11500
11501 /* Segment size not multiple of block size (16B) */
11502 static int
11503 test_AES_GMAC_authentication_SGL_40B(void)
11504 {
11505         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
11506 }
11507
11508 static int
11509 test_AES_GMAC_authentication_SGL_80B(void)
11510 {
11511         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
11512 }
11513
11514 static int
11515 test_AES_GMAC_authentication_SGL_2048B(void)
11516 {
11517         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
11518 }
11519
11520 /* Segment size not multiple of block size (16B) */
11521 static int
11522 test_AES_GMAC_authentication_SGL_2047B(void)
11523 {
11524         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
11525 }
11526
11527 struct test_crypto_vector {
11528         enum rte_crypto_cipher_algorithm crypto_algo;
11529         unsigned int cipher_offset;
11530         unsigned int cipher_len;
11531
11532         struct {
11533                 uint8_t data[64];
11534                 unsigned int len;
11535         } cipher_key;
11536
11537         struct {
11538                 uint8_t data[64];
11539                 unsigned int len;
11540         } iv;
11541
11542         struct {
11543                 const uint8_t *data;
11544                 unsigned int len;
11545         } plaintext;
11546
11547         struct {
11548                 const uint8_t *data;
11549                 unsigned int len;
11550         } ciphertext;
11551
11552         enum rte_crypto_auth_algorithm auth_algo;
11553         unsigned int auth_offset;
11554
11555         struct {
11556                 uint8_t data[128];
11557                 unsigned int len;
11558         } auth_key;
11559
11560         struct {
11561                 const uint8_t *data;
11562                 unsigned int len;
11563         } aad;
11564
11565         struct {
11566                 uint8_t data[128];
11567                 unsigned int len;
11568         } digest;
11569 };
11570
11571 static const struct test_crypto_vector
11572 hmac_sha1_test_crypto_vector = {
11573         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11574         .plaintext = {
11575                 .data = plaintext_hash,
11576                 .len = 512
11577         },
11578         .auth_key = {
11579                 .data = {
11580                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11581                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11582                         0xDE, 0xF4, 0xDE, 0xAD
11583                 },
11584                 .len = 20
11585         },
11586         .digest = {
11587                 .data = {
11588                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
11589                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
11590                         0x3F, 0x91, 0x64, 0x59
11591                 },
11592                 .len = 20
11593         }
11594 };
11595
11596 static const struct test_crypto_vector
11597 aes128_gmac_test_vector = {
11598         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
11599         .plaintext = {
11600                 .data = plaintext_hash,
11601                 .len = 512
11602         },
11603         .iv = {
11604                 .data = {
11605                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11606                         0x08, 0x09, 0x0A, 0x0B
11607                 },
11608                 .len = 12
11609         },
11610         .auth_key = {
11611                 .data = {
11612                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11613                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
11614                 },
11615                 .len = 16
11616         },
11617         .digest = {
11618                 .data = {
11619                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
11620                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
11621                 },
11622                 .len = 16
11623         }
11624 };
11625
11626 static const struct test_crypto_vector
11627 aes128cbc_hmac_sha1_test_vector = {
11628         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11629         .cipher_offset = 0,
11630         .cipher_len = 512,
11631         .cipher_key = {
11632                 .data = {
11633                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11634                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11635                 },
11636                 .len = 16
11637         },
11638         .iv = {
11639                 .data = {
11640                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11641                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11642                 },
11643                 .len = 16
11644         },
11645         .plaintext = {
11646                 .data = plaintext_hash,
11647                 .len = 512
11648         },
11649         .ciphertext = {
11650                 .data = ciphertext512_aes128cbc,
11651                 .len = 512
11652         },
11653         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11654         .auth_offset = 0,
11655         .auth_key = {
11656                 .data = {
11657                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11658                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11659                         0xDE, 0xF4, 0xDE, 0xAD
11660                 },
11661                 .len = 20
11662         },
11663         .digest = {
11664                 .data = {
11665                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
11666                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11667                         0x18, 0x8C, 0x1D, 0x32
11668                 },
11669                 .len = 20
11670         }
11671 };
11672
11673 static const struct test_crypto_vector
11674 aes128cbc_hmac_sha1_aad_test_vector = {
11675         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11676         .cipher_offset = 8,
11677         .cipher_len = 496,
11678         .cipher_key = {
11679                 .data = {
11680                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11681                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11682                 },
11683                 .len = 16
11684         },
11685         .iv = {
11686                 .data = {
11687                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11688                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11689                 },
11690                 .len = 16
11691         },
11692         .plaintext = {
11693                 .data = plaintext_hash,
11694                 .len = 512
11695         },
11696         .ciphertext = {
11697                 .data = ciphertext512_aes128cbc_aad,
11698                 .len = 512
11699         },
11700         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11701         .auth_offset = 0,
11702         .auth_key = {
11703                 .data = {
11704                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11705                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11706                         0xDE, 0xF4, 0xDE, 0xAD
11707                 },
11708                 .len = 20
11709         },
11710         .digest = {
11711                 .data = {
11712                         0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
11713                         0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
11714                         0x62, 0x0F, 0xFB, 0x10
11715                 },
11716                 .len = 20
11717         }
11718 };
11719
11720 static void
11721 data_corruption(uint8_t *data)
11722 {
11723         data[0] += 1;
11724 }
11725
11726 static void
11727 tag_corruption(uint8_t *data, unsigned int tag_offset)
11728 {
11729         data[tag_offset] += 1;
11730 }
11731
11732 static int
11733 create_auth_session(struct crypto_unittest_params *ut_params,
11734                 uint8_t dev_id,
11735                 const struct test_crypto_vector *reference,
11736                 enum rte_crypto_auth_operation auth_op)
11737 {
11738         struct crypto_testsuite_params *ts_params = &testsuite_params;
11739         uint8_t auth_key[reference->auth_key.len + 1];
11740
11741         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11742
11743         /* Setup Authentication Parameters */
11744         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11745         ut_params->auth_xform.auth.op = auth_op;
11746         ut_params->auth_xform.next = NULL;
11747         ut_params->auth_xform.auth.algo = reference->auth_algo;
11748         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11749         ut_params->auth_xform.auth.key.data = auth_key;
11750         ut_params->auth_xform.auth.digest_length = reference->digest.len;
11751
11752         /* Create Crypto session*/
11753         ut_params->sess = rte_cryptodev_sym_session_create(
11754                         ts_params->session_mpool);
11755
11756         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11757                                 &ut_params->auth_xform,
11758                                 ts_params->session_priv_mpool);
11759
11760         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11761
11762         return 0;
11763 }
11764
11765 static int
11766 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
11767                 uint8_t dev_id,
11768                 const struct test_crypto_vector *reference,
11769                 enum rte_crypto_auth_operation auth_op,
11770                 enum rte_crypto_cipher_operation cipher_op)
11771 {
11772         struct crypto_testsuite_params *ts_params = &testsuite_params;
11773         uint8_t cipher_key[reference->cipher_key.len + 1];
11774         uint8_t auth_key[reference->auth_key.len + 1];
11775
11776         memcpy(cipher_key, reference->cipher_key.data,
11777                         reference->cipher_key.len);
11778         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11779
11780         /* Setup Authentication Parameters */
11781         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11782         ut_params->auth_xform.auth.op = auth_op;
11783         ut_params->auth_xform.auth.algo = reference->auth_algo;
11784         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11785         ut_params->auth_xform.auth.key.data = auth_key;
11786         ut_params->auth_xform.auth.digest_length = reference->digest.len;
11787
11788         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
11789                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11790                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
11791         } else {
11792                 ut_params->auth_xform.next = &ut_params->cipher_xform;
11793
11794                 /* Setup Cipher Parameters */
11795                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11796                 ut_params->cipher_xform.next = NULL;
11797                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
11798                 ut_params->cipher_xform.cipher.op = cipher_op;
11799                 ut_params->cipher_xform.cipher.key.data = cipher_key;
11800                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
11801                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
11802                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
11803         }
11804
11805         /* Create Crypto session*/
11806         ut_params->sess = rte_cryptodev_sym_session_create(
11807                         ts_params->session_mpool);
11808
11809         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11810                                 &ut_params->auth_xform,
11811                                 ts_params->session_priv_mpool);
11812
11813         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11814
11815         return 0;
11816 }
11817
11818 static int
11819 create_auth_operation(struct crypto_testsuite_params *ts_params,
11820                 struct crypto_unittest_params *ut_params,
11821                 const struct test_crypto_vector *reference,
11822                 unsigned int auth_generate)
11823 {
11824         /* Generate Crypto op data structure */
11825         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11826                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11827         TEST_ASSERT_NOT_NULL(ut_params->op,
11828                         "Failed to allocate pktmbuf offload");
11829
11830         /* Set crypto operation data parameters */
11831         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11832
11833         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11834
11835         /* set crypto operation source mbuf */
11836         sym_op->m_src = ut_params->ibuf;
11837
11838         /* digest */
11839         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11840                         ut_params->ibuf, reference->digest.len);
11841
11842         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11843                         "no room to append auth tag");
11844
11845         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11846                         ut_params->ibuf, reference->plaintext.len);
11847
11848         if (auth_generate)
11849                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11850         else
11851                 memcpy(sym_op->auth.digest.data,
11852                                 reference->digest.data,
11853                                 reference->digest.len);
11854
11855         debug_hexdump(stdout, "digest:",
11856                         sym_op->auth.digest.data,
11857                         reference->digest.len);
11858
11859         sym_op->auth.data.length = reference->plaintext.len;
11860         sym_op->auth.data.offset = 0;
11861
11862         return 0;
11863 }
11864
11865 static int
11866 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
11867                 struct crypto_unittest_params *ut_params,
11868                 const struct test_crypto_vector *reference,
11869                 unsigned int auth_generate)
11870 {
11871         /* Generate Crypto op data structure */
11872         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11873                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11874         TEST_ASSERT_NOT_NULL(ut_params->op,
11875                         "Failed to allocate pktmbuf offload");
11876
11877         /* Set crypto operation data parameters */
11878         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11879
11880         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11881
11882         /* set crypto operation source mbuf */
11883         sym_op->m_src = ut_params->ibuf;
11884
11885         /* digest */
11886         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11887                         ut_params->ibuf, reference->digest.len);
11888
11889         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11890                         "no room to append auth tag");
11891
11892         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11893                         ut_params->ibuf, reference->ciphertext.len);
11894
11895         if (auth_generate)
11896                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11897         else
11898                 memcpy(sym_op->auth.digest.data,
11899                                 reference->digest.data,
11900                                 reference->digest.len);
11901
11902         debug_hexdump(stdout, "digest:",
11903                         sym_op->auth.digest.data,
11904                         reference->digest.len);
11905
11906         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11907                         reference->iv.data, reference->iv.len);
11908
11909         sym_op->cipher.data.length = 0;
11910         sym_op->cipher.data.offset = 0;
11911
11912         sym_op->auth.data.length = reference->plaintext.len;
11913         sym_op->auth.data.offset = 0;
11914
11915         return 0;
11916 }
11917
11918 static int
11919 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
11920                 struct crypto_unittest_params *ut_params,
11921                 const struct test_crypto_vector *reference,
11922                 unsigned int auth_generate)
11923 {
11924         /* Generate Crypto op data structure */
11925         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11926                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11927         TEST_ASSERT_NOT_NULL(ut_params->op,
11928                         "Failed to allocate pktmbuf offload");
11929
11930         /* Set crypto operation data parameters */
11931         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11932
11933         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11934
11935         /* set crypto operation source mbuf */
11936         sym_op->m_src = ut_params->ibuf;
11937
11938         /* digest */
11939         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11940                         ut_params->ibuf, reference->digest.len);
11941
11942         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11943                         "no room to append auth tag");
11944
11945         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11946                         ut_params->ibuf, reference->ciphertext.len);
11947
11948         if (auth_generate)
11949                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11950         else
11951                 memcpy(sym_op->auth.digest.data,
11952                                 reference->digest.data,
11953                                 reference->digest.len);
11954
11955         debug_hexdump(stdout, "digest:",
11956                         sym_op->auth.digest.data,
11957                         reference->digest.len);
11958
11959         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11960                         reference->iv.data, reference->iv.len);
11961
11962         sym_op->cipher.data.length = reference->cipher_len;
11963         sym_op->cipher.data.offset = reference->cipher_offset;
11964
11965         sym_op->auth.data.length = reference->plaintext.len;
11966         sym_op->auth.data.offset = reference->auth_offset;
11967
11968         return 0;
11969 }
11970
11971 static int
11972 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11973                 struct crypto_unittest_params *ut_params,
11974                 const struct test_crypto_vector *reference)
11975 {
11976         return create_auth_operation(ts_params, ut_params, reference, 0);
11977 }
11978
11979 static int
11980 create_auth_verify_GMAC_operation(
11981                 struct crypto_testsuite_params *ts_params,
11982                 struct crypto_unittest_params *ut_params,
11983                 const struct test_crypto_vector *reference)
11984 {
11985         return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
11986 }
11987
11988 static int
11989 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11990                 struct crypto_unittest_params *ut_params,
11991                 const struct test_crypto_vector *reference)
11992 {
11993         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
11994 }
11995
11996 static int
11997 test_authentication_verify_fail_when_data_corruption(
11998                 struct crypto_testsuite_params *ts_params,
11999                 struct crypto_unittest_params *ut_params,
12000                 const struct test_crypto_vector *reference,
12001                 unsigned int data_corrupted)
12002 {
12003         int retval;
12004
12005         uint8_t *plaintext;
12006         struct rte_cryptodev_info dev_info;
12007
12008         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12009         uint64_t feat_flags = dev_info.feature_flags;
12010
12011         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12012                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12013                 printf("Device doesn't support RAW data-path APIs.\n");
12014                 return -ENOTSUP;
12015         }
12016
12017         /* Verify the capabilities */
12018         struct rte_cryptodev_sym_capability_idx cap_idx;
12019         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12020         cap_idx.algo.auth = reference->auth_algo;
12021         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12022                         &cap_idx) == NULL)
12023                 return -ENOTSUP;
12024
12025
12026         /* Create session */
12027         retval = create_auth_session(ut_params,
12028                         ts_params->valid_devs[0],
12029                         reference,
12030                         RTE_CRYPTO_AUTH_OP_VERIFY);
12031         if (retval < 0)
12032                 return retval;
12033
12034         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12035         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12036                         "Failed to allocate input buffer in mempool");
12037
12038         /* clear mbuf payload */
12039         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12040                         rte_pktmbuf_tailroom(ut_params->ibuf));
12041
12042         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12043                         reference->plaintext.len);
12044         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12045         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12046
12047         debug_hexdump(stdout, "plaintext:", plaintext,
12048                 reference->plaintext.len);
12049
12050         /* Create operation */
12051         retval = create_auth_verify_operation(ts_params, ut_params, reference);
12052
12053         if (retval < 0)
12054                 return retval;
12055
12056         if (data_corrupted)
12057                 data_corruption(plaintext);
12058         else
12059                 tag_corruption(plaintext, reference->plaintext.len);
12060
12061         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12062                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12063                         ut_params->op);
12064                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12065                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12066                         "authentication not failed");
12067         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12068                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12069                                 ut_params->op, 0, 1, 0, 0);
12070         else {
12071                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12072                         ut_params->op);
12073                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12074         }
12075
12076         return 0;
12077 }
12078
12079 static int
12080 test_authentication_verify_GMAC_fail_when_corruption(
12081                 struct crypto_testsuite_params *ts_params,
12082                 struct crypto_unittest_params *ut_params,
12083                 const struct test_crypto_vector *reference,
12084                 unsigned int data_corrupted)
12085 {
12086         int retval;
12087         uint8_t *plaintext;
12088         struct rte_cryptodev_info dev_info;
12089
12090         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12091         uint64_t feat_flags = dev_info.feature_flags;
12092
12093         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12094                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12095                 printf("Device doesn't support RAW data-path APIs.\n");
12096                 return -ENOTSUP;
12097         }
12098
12099         /* Verify the capabilities */
12100         struct rte_cryptodev_sym_capability_idx cap_idx;
12101         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12102         cap_idx.algo.auth = reference->auth_algo;
12103         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12104                         &cap_idx) == NULL)
12105                 return -ENOTSUP;
12106
12107         /* Create session */
12108         retval = create_auth_cipher_session(ut_params,
12109                         ts_params->valid_devs[0],
12110                         reference,
12111                         RTE_CRYPTO_AUTH_OP_VERIFY,
12112                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
12113         if (retval < 0)
12114                 return retval;
12115
12116         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12117         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12118                         "Failed to allocate input buffer in mempool");
12119
12120         /* clear mbuf payload */
12121         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12122                         rte_pktmbuf_tailroom(ut_params->ibuf));
12123
12124         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12125                         reference->plaintext.len);
12126         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12127         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12128
12129         debug_hexdump(stdout, "plaintext:", plaintext,
12130                 reference->plaintext.len);
12131
12132         /* Create operation */
12133         retval = create_auth_verify_GMAC_operation(ts_params,
12134                         ut_params,
12135                         reference);
12136
12137         if (retval < 0)
12138                 return retval;
12139
12140         if (data_corrupted)
12141                 data_corruption(plaintext);
12142         else
12143                 tag_corruption(plaintext, reference->aad.len);
12144
12145         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12146                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12147                         ut_params->op);
12148                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12149                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12150                         "authentication not failed");
12151         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12152                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12153                                 ut_params->op, 0, 1, 0, 0);
12154         else {
12155                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12156                         ut_params->op);
12157                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12158         }
12159
12160         return 0;
12161 }
12162
12163 static int
12164 test_authenticated_decryption_fail_when_corruption(
12165                 struct crypto_testsuite_params *ts_params,
12166                 struct crypto_unittest_params *ut_params,
12167                 const struct test_crypto_vector *reference,
12168                 unsigned int data_corrupted)
12169 {
12170         int retval;
12171
12172         uint8_t *ciphertext;
12173         struct rte_cryptodev_info dev_info;
12174
12175         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12176         uint64_t feat_flags = dev_info.feature_flags;
12177
12178         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12179                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12180                 printf("Device doesn't support RAW data-path APIs.\n");
12181                 return -ENOTSUP;
12182         }
12183
12184         /* Verify the capabilities */
12185         struct rte_cryptodev_sym_capability_idx cap_idx;
12186         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12187         cap_idx.algo.auth = reference->auth_algo;
12188         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12189                         &cap_idx) == NULL)
12190                 return -ENOTSUP;
12191         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12192         cap_idx.algo.cipher = reference->crypto_algo;
12193         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12194                         &cap_idx) == NULL)
12195                 return -ENOTSUP;
12196
12197         /* Create session */
12198         retval = create_auth_cipher_session(ut_params,
12199                         ts_params->valid_devs[0],
12200                         reference,
12201                         RTE_CRYPTO_AUTH_OP_VERIFY,
12202                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
12203         if (retval < 0)
12204                 return retval;
12205
12206         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12207         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12208                         "Failed to allocate input buffer in mempool");
12209
12210         /* clear mbuf payload */
12211         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12212                         rte_pktmbuf_tailroom(ut_params->ibuf));
12213
12214         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12215                         reference->ciphertext.len);
12216         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12217         memcpy(ciphertext, reference->ciphertext.data,
12218                         reference->ciphertext.len);
12219
12220         /* Create operation */
12221         retval = create_cipher_auth_verify_operation(ts_params,
12222                         ut_params,
12223                         reference);
12224
12225         if (retval < 0)
12226                 return retval;
12227
12228         if (data_corrupted)
12229                 data_corruption(ciphertext);
12230         else
12231                 tag_corruption(ciphertext, reference->ciphertext.len);
12232
12233         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12234                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12235                         ut_params->op);
12236                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12237                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12238                         "authentication not failed");
12239         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12240                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12241                                 ut_params->op, 1, 1, 0, 0);
12242         else {
12243                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12244                         ut_params->op);
12245                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12246         }
12247
12248         return 0;
12249 }
12250
12251 static int
12252 test_authenticated_encryt_with_esn(
12253                 struct crypto_testsuite_params *ts_params,
12254                 struct crypto_unittest_params *ut_params,
12255                 const struct test_crypto_vector *reference)
12256 {
12257         int retval;
12258
12259         uint8_t *authciphertext, *plaintext, *auth_tag;
12260         uint16_t plaintext_pad_len;
12261         uint8_t cipher_key[reference->cipher_key.len + 1];
12262         uint8_t auth_key[reference->auth_key.len + 1];
12263         struct rte_cryptodev_info dev_info;
12264
12265         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12266         uint64_t feat_flags = dev_info.feature_flags;
12267
12268         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12269                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12270                 printf("Device doesn't support RAW data-path APIs.\n");
12271                 return -ENOTSUP;
12272         }
12273
12274         /* Verify the capabilities */
12275         struct rte_cryptodev_sym_capability_idx cap_idx;
12276         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12277         cap_idx.algo.auth = reference->auth_algo;
12278         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12279                         &cap_idx) == NULL)
12280                 return -ENOTSUP;
12281         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12282         cap_idx.algo.cipher = reference->crypto_algo;
12283         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12284                         &cap_idx) == NULL)
12285                 return -ENOTSUP;
12286
12287         /* Create session */
12288         memcpy(cipher_key, reference->cipher_key.data,
12289                         reference->cipher_key.len);
12290         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12291
12292         /* Setup Cipher Parameters */
12293         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12294         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12295         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12296         ut_params->cipher_xform.cipher.key.data = cipher_key;
12297         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12298         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12299         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12300
12301         ut_params->cipher_xform.next = &ut_params->auth_xform;
12302
12303         /* Setup Authentication Parameters */
12304         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12305         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12306         ut_params->auth_xform.auth.algo = reference->auth_algo;
12307         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12308         ut_params->auth_xform.auth.key.data = auth_key;
12309         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12310         ut_params->auth_xform.next = NULL;
12311
12312         /* Create Crypto session*/
12313         ut_params->sess = rte_cryptodev_sym_session_create(
12314                         ts_params->session_mpool);
12315
12316         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12317                                 ut_params->sess,
12318                                 &ut_params->cipher_xform,
12319                                 ts_params->session_priv_mpool);
12320
12321         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12322
12323         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12324         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12325                         "Failed to allocate input buffer in mempool");
12326
12327         /* clear mbuf payload */
12328         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12329                         rte_pktmbuf_tailroom(ut_params->ibuf));
12330
12331         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12332                         reference->plaintext.len);
12333         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12334         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12335
12336         /* Create operation */
12337         retval = create_cipher_auth_operation(ts_params,
12338                         ut_params,
12339                         reference, 0);
12340
12341         if (retval < 0)
12342                 return retval;
12343
12344         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12345                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12346                         ut_params->op);
12347         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12348                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12349                                 ut_params->op, 1, 1, 0, 0);
12350         else
12351                 ut_params->op = process_crypto_request(
12352                         ts_params->valid_devs[0], ut_params->op);
12353
12354         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
12355
12356         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12357                         "crypto op processing failed");
12358
12359         plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
12360
12361         authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
12362                         ut_params->op->sym->auth.data.offset);
12363         auth_tag = authciphertext + plaintext_pad_len;
12364         debug_hexdump(stdout, "ciphertext:", authciphertext,
12365                         reference->ciphertext.len);
12366         debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
12367
12368         /* Validate obuf */
12369         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12370                         authciphertext,
12371                         reference->ciphertext.data,
12372                         reference->ciphertext.len,
12373                         "Ciphertext data not as expected");
12374
12375         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12376                         auth_tag,
12377                         reference->digest.data,
12378                         reference->digest.len,
12379                         "Generated digest not as expected");
12380
12381         return TEST_SUCCESS;
12382
12383 }
12384
12385 static int
12386 test_authenticated_decrypt_with_esn(
12387                 struct crypto_testsuite_params *ts_params,
12388                 struct crypto_unittest_params *ut_params,
12389                 const struct test_crypto_vector *reference)
12390 {
12391         int retval;
12392
12393         uint8_t *ciphertext;
12394         uint8_t cipher_key[reference->cipher_key.len + 1];
12395         uint8_t auth_key[reference->auth_key.len + 1];
12396         struct rte_cryptodev_info dev_info;
12397
12398         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12399         uint64_t feat_flags = dev_info.feature_flags;
12400
12401         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12402                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12403                 printf("Device doesn't support RAW data-path APIs.\n");
12404                 return -ENOTSUP;
12405         }
12406
12407         /* Verify the capabilities */
12408         struct rte_cryptodev_sym_capability_idx cap_idx;
12409         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12410         cap_idx.algo.auth = reference->auth_algo;
12411         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12412                         &cap_idx) == NULL)
12413                 return -ENOTSUP;
12414         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12415         cap_idx.algo.cipher = reference->crypto_algo;
12416         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12417                         &cap_idx) == NULL)
12418                 return -ENOTSUP;
12419
12420         /* Create session */
12421         memcpy(cipher_key, reference->cipher_key.data,
12422                         reference->cipher_key.len);
12423         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12424
12425         /* Setup Authentication Parameters */
12426         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12427         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
12428         ut_params->auth_xform.auth.algo = reference->auth_algo;
12429         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12430         ut_params->auth_xform.auth.key.data = auth_key;
12431         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12432         ut_params->auth_xform.next = &ut_params->cipher_xform;
12433
12434         /* Setup Cipher Parameters */
12435         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12436         ut_params->cipher_xform.next = NULL;
12437         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12438         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
12439         ut_params->cipher_xform.cipher.key.data = cipher_key;
12440         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12441         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12442         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12443
12444         /* Create Crypto session*/
12445         ut_params->sess = rte_cryptodev_sym_session_create(
12446                         ts_params->session_mpool);
12447
12448         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12449                                 ut_params->sess,
12450                                 &ut_params->auth_xform,
12451                                 ts_params->session_priv_mpool);
12452
12453         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12454
12455         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12456         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12457                         "Failed to allocate input buffer in mempool");
12458
12459         /* clear mbuf payload */
12460         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12461                         rte_pktmbuf_tailroom(ut_params->ibuf));
12462
12463         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12464                         reference->ciphertext.len);
12465         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12466         memcpy(ciphertext, reference->ciphertext.data,
12467                         reference->ciphertext.len);
12468
12469         /* Create operation */
12470         retval = create_cipher_auth_verify_operation(ts_params,
12471                         ut_params,
12472                         reference);
12473
12474         if (retval < 0)
12475                 return retval;
12476
12477         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12478                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12479                         ut_params->op);
12480         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12481                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12482                                 ut_params->op, 1, 1, 0, 0);
12483         else
12484                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12485                         ut_params->op);
12486
12487         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
12488         TEST_ASSERT_EQUAL(ut_params->op->status,
12489                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12490                         "crypto op processing passed");
12491
12492         ut_params->obuf = ut_params->op->sym->m_src;
12493         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
12494
12495         return 0;
12496 }
12497
12498 static int
12499 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
12500                 const struct aead_test_data *tdata,
12501                 void *digest_mem, uint64_t digest_phys)
12502 {
12503         struct crypto_testsuite_params *ts_params = &testsuite_params;
12504         struct crypto_unittest_params *ut_params = &unittest_params;
12505
12506         const unsigned int auth_tag_len = tdata->auth_tag.len;
12507         const unsigned int iv_len = tdata->iv.len;
12508         unsigned int aad_len = tdata->aad.len;
12509         unsigned int aad_len_pad = 0;
12510
12511         /* Generate Crypto op data structure */
12512         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12513                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12514         TEST_ASSERT_NOT_NULL(ut_params->op,
12515                 "Failed to allocate symmetric crypto operation struct");
12516
12517         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12518
12519         sym_op->aead.digest.data = digest_mem;
12520
12521         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
12522                         "no room to append digest");
12523
12524         sym_op->aead.digest.phys_addr = digest_phys;
12525
12526         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
12527                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
12528                                 auth_tag_len);
12529                 debug_hexdump(stdout, "digest:",
12530                                 sym_op->aead.digest.data,
12531                                 auth_tag_len);
12532         }
12533
12534         /* Append aad data */
12535         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
12536                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12537                                 uint8_t *, IV_OFFSET);
12538
12539                 /* Copy IV 1 byte after the IV pointer, according to the API */
12540                 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
12541
12542                 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
12543
12544                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12545                                 ut_params->ibuf, aad_len);
12546                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12547                                 "no room to prepend aad");
12548                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12549                                 ut_params->ibuf);
12550
12551                 memset(sym_op->aead.aad.data, 0, aad_len);
12552                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
12553                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12554
12555                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12556                 debug_hexdump(stdout, "aad:",
12557                                 sym_op->aead.aad.data, aad_len);
12558         } else {
12559                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12560                                 uint8_t *, IV_OFFSET);
12561
12562                 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
12563
12564                 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
12565
12566                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12567                                 ut_params->ibuf, aad_len_pad);
12568                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12569                                 "no room to prepend aad");
12570                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12571                                 ut_params->ibuf);
12572
12573                 memset(sym_op->aead.aad.data, 0, aad_len);
12574                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12575
12576                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12577                 debug_hexdump(stdout, "aad:",
12578                                 sym_op->aead.aad.data, aad_len);
12579         }
12580
12581         sym_op->aead.data.length = tdata->plaintext.len;
12582         sym_op->aead.data.offset = aad_len_pad;
12583
12584         return 0;
12585 }
12586
12587 #define SGL_MAX_NO      16
12588
12589 static int
12590 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
12591                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
12592 {
12593         struct crypto_testsuite_params *ts_params = &testsuite_params;
12594         struct crypto_unittest_params *ut_params = &unittest_params;
12595         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
12596         int retval;
12597         int to_trn = 0;
12598         int to_trn_tbl[SGL_MAX_NO];
12599         int segs = 1;
12600         unsigned int trn_data = 0;
12601         uint8_t *plaintext, *ciphertext, *auth_tag;
12602         struct rte_cryptodev_info dev_info;
12603
12604         /* Verify the capabilities */
12605         struct rte_cryptodev_sym_capability_idx cap_idx;
12606         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12607         cap_idx.algo.aead = tdata->algo;
12608         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12609                         &cap_idx) == NULL)
12610                 return -ENOTSUP;
12611
12612         /* OOP not supported with CPU crypto */
12613         if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12614                 return -ENOTSUP;
12615
12616         /* Detailed check for the particular SGL support flag */
12617         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12618         if (!oop) {
12619                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
12620                 if (sgl_in && (!(dev_info.feature_flags &
12621                                 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
12622                         return -ENOTSUP;
12623
12624                 uint64_t feat_flags = dev_info.feature_flags;
12625
12626                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12627                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12628                         printf("Device doesn't support RAW data-path APIs.\n");
12629                         return -ENOTSUP;
12630                 }
12631         } else {
12632                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
12633                 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
12634                                 tdata->plaintext.len;
12635                 /* Raw data path API does not support OOP */
12636                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12637                         return -ENOTSUP;
12638                 if (sgl_in && !sgl_out) {
12639                         if (!(dev_info.feature_flags &
12640                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
12641                                 return -ENOTSUP;
12642                 } else if (!sgl_in && sgl_out) {
12643                         if (!(dev_info.feature_flags &
12644                                         RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
12645                                 return -ENOTSUP;
12646                 } else if (sgl_in && sgl_out) {
12647                         if (!(dev_info.feature_flags &
12648                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
12649                                 return -ENOTSUP;
12650                 }
12651         }
12652
12653         if (fragsz > tdata->plaintext.len)
12654                 fragsz = tdata->plaintext.len;
12655
12656         uint16_t plaintext_len = fragsz;
12657         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
12658
12659         if (fragsz_oop > tdata->plaintext.len)
12660                 frag_size_oop = tdata->plaintext.len;
12661
12662         int ecx = 0;
12663         void *digest_mem = NULL;
12664
12665         uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
12666
12667         if (tdata->plaintext.len % fragsz != 0) {
12668                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
12669                         return 1;
12670         }       else {
12671                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
12672                         return 1;
12673         }
12674
12675         /*
12676          * For out-op-place we need to alloc another mbuf
12677          */
12678         if (oop) {
12679                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12680                 rte_pktmbuf_append(ut_params->obuf,
12681                                 frag_size_oop + prepend_len);
12682                 buf_oop = ut_params->obuf;
12683         }
12684
12685         /* Create AEAD session */
12686         retval = create_aead_session(ts_params->valid_devs[0],
12687                         tdata->algo,
12688                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
12689                         tdata->key.data, tdata->key.len,
12690                         tdata->aad.len, tdata->auth_tag.len,
12691                         tdata->iv.len);
12692         if (retval < 0)
12693                 return retval;
12694
12695         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12696
12697         /* clear mbuf payload */
12698         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12699                         rte_pktmbuf_tailroom(ut_params->ibuf));
12700
12701         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12702                         plaintext_len);
12703
12704         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12705
12706         trn_data += plaintext_len;
12707
12708         buf = ut_params->ibuf;
12709
12710         /*
12711          * Loop until no more fragments
12712          */
12713
12714         while (trn_data < tdata->plaintext.len) {
12715                 ++segs;
12716                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12717                                 (tdata->plaintext.len - trn_data) : fragsz;
12718
12719                 to_trn_tbl[ecx++] = to_trn;
12720
12721                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12722                 buf = buf->next;
12723
12724                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12725                                 rte_pktmbuf_tailroom(buf));
12726
12727                 /* OOP */
12728                 if (oop && !fragsz_oop) {
12729                         buf_last_oop = buf_oop->next =
12730                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
12731                         buf_oop = buf_oop->next;
12732                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12733                                         0, rte_pktmbuf_tailroom(buf_oop));
12734                         rte_pktmbuf_append(buf_oop, to_trn);
12735                 }
12736
12737                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12738                                 to_trn);
12739
12740                 memcpy(plaintext, tdata->plaintext.data + trn_data,
12741                                 to_trn);
12742                 trn_data += to_trn;
12743                 if (trn_data  == tdata->plaintext.len) {
12744                         if (oop) {
12745                                 if (!fragsz_oop)
12746                                         digest_mem = rte_pktmbuf_append(buf_oop,
12747                                                 tdata->auth_tag.len);
12748                         } else
12749                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12750                                         tdata->auth_tag.len);
12751                 }
12752         }
12753
12754         uint64_t digest_phys = 0;
12755
12756         ut_params->ibuf->nb_segs = segs;
12757
12758         segs = 1;
12759         if (fragsz_oop && oop) {
12760                 to_trn = 0;
12761                 ecx = 0;
12762
12763                 if (frag_size_oop == tdata->plaintext.len) {
12764                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
12765                                 tdata->auth_tag.len);
12766
12767                         digest_phys = rte_pktmbuf_iova_offset(
12768                                         ut_params->obuf,
12769                                         tdata->plaintext.len + prepend_len);
12770                 }
12771
12772                 trn_data = frag_size_oop;
12773                 while (trn_data < tdata->plaintext.len) {
12774                         ++segs;
12775                         to_trn =
12776                                 (tdata->plaintext.len - trn_data <
12777                                                 frag_size_oop) ?
12778                                 (tdata->plaintext.len - trn_data) :
12779                                                 frag_size_oop;
12780
12781                         to_trn_tbl[ecx++] = to_trn;
12782
12783                         buf_last_oop = buf_oop->next =
12784                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
12785                         buf_oop = buf_oop->next;
12786                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12787                                         0, rte_pktmbuf_tailroom(buf_oop));
12788                         rte_pktmbuf_append(buf_oop, to_trn);
12789
12790                         trn_data += to_trn;
12791
12792                         if (trn_data  == tdata->plaintext.len) {
12793                                 digest_mem = rte_pktmbuf_append(buf_oop,
12794                                         tdata->auth_tag.len);
12795                         }
12796                 }
12797
12798                 ut_params->obuf->nb_segs = segs;
12799         }
12800
12801         /*
12802          * Place digest at the end of the last buffer
12803          */
12804         if (!digest_phys)
12805                 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12806         if (oop && buf_last_oop)
12807                 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
12808
12809         if (!digest_mem && !oop) {
12810                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12811                                 + tdata->auth_tag.len);
12812                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12813                                 tdata->plaintext.len);
12814         }
12815
12816         /* Create AEAD operation */
12817         retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
12818                         tdata, digest_mem, digest_phys);
12819
12820         if (retval < 0)
12821                 return retval;
12822
12823         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12824
12825         ut_params->op->sym->m_src = ut_params->ibuf;
12826         if (oop)
12827                 ut_params->op->sym->m_dst = ut_params->obuf;
12828
12829         /* Process crypto operation */
12830         if (oop == IN_PLACE &&
12831                         gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12832                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
12833         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12834                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12835                                 ut_params->op, 0, 0, 0, 0);
12836         else
12837                 TEST_ASSERT_NOT_NULL(
12838                         process_crypto_request(ts_params->valid_devs[0],
12839                         ut_params->op), "failed to process sym crypto op");
12840
12841         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12842                         "crypto op processing failed");
12843
12844
12845         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
12846                         uint8_t *, prepend_len);
12847         if (oop) {
12848                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12849                                 uint8_t *, prepend_len);
12850         }
12851
12852         if (fragsz_oop)
12853                 fragsz = fragsz_oop;
12854
12855         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12856                         ciphertext,
12857                         tdata->ciphertext.data,
12858                         fragsz,
12859                         "Ciphertext data not as expected");
12860
12861         buf = ut_params->op->sym->m_src->next;
12862         if (oop)
12863                 buf = ut_params->op->sym->m_dst->next;
12864
12865         unsigned int off = fragsz;
12866
12867         ecx = 0;
12868         while (buf) {
12869                 ciphertext = rte_pktmbuf_mtod(buf,
12870                                 uint8_t *);
12871
12872                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
12873                                 ciphertext,
12874                                 tdata->ciphertext.data + off,
12875                                 to_trn_tbl[ecx],
12876                                 "Ciphertext data not as expected");
12877
12878                 off += to_trn_tbl[ecx++];
12879                 buf = buf->next;
12880         }
12881
12882         auth_tag = digest_mem;
12883         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12884                         auth_tag,
12885                         tdata->auth_tag.data,
12886                         tdata->auth_tag.len,
12887                         "Generated auth tag not as expected");
12888
12889         return 0;
12890 }
12891
12892 static int
12893 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
12894 {
12895         return test_authenticated_encryption_SGL(
12896                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
12897 }
12898
12899 static int
12900 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
12901 {
12902         return test_authenticated_encryption_SGL(
12903                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
12904 }
12905
12906 static int
12907 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
12908 {
12909         return test_authenticated_encryption_SGL(
12910                         &gcm_test_case_8, OUT_OF_PLACE, 400,
12911                         gcm_test_case_8.plaintext.len);
12912 }
12913
12914 static int
12915 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
12916 {
12917         /* This test is not for OPENSSL PMD */
12918         if (gbl_driver_id == rte_cryptodev_driver_id_get(
12919                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
12920                 return -ENOTSUP;
12921
12922         return test_authenticated_encryption_SGL(
12923                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
12924 }
12925
12926 static int
12927 test_authentication_verify_fail_when_data_corrupted(
12928                 struct crypto_testsuite_params *ts_params,
12929                 struct crypto_unittest_params *ut_params,
12930                 const struct test_crypto_vector *reference)
12931 {
12932         return test_authentication_verify_fail_when_data_corruption(
12933                         ts_params, ut_params, reference, 1);
12934 }
12935
12936 static int
12937 test_authentication_verify_fail_when_tag_corrupted(
12938                 struct crypto_testsuite_params *ts_params,
12939                 struct crypto_unittest_params *ut_params,
12940                 const struct test_crypto_vector *reference)
12941 {
12942         return test_authentication_verify_fail_when_data_corruption(
12943                         ts_params, ut_params, reference, 0);
12944 }
12945
12946 static int
12947 test_authentication_verify_GMAC_fail_when_data_corrupted(
12948                 struct crypto_testsuite_params *ts_params,
12949                 struct crypto_unittest_params *ut_params,
12950                 const struct test_crypto_vector *reference)
12951 {
12952         return test_authentication_verify_GMAC_fail_when_corruption(
12953                         ts_params, ut_params, reference, 1);
12954 }
12955
12956 static int
12957 test_authentication_verify_GMAC_fail_when_tag_corrupted(
12958                 struct crypto_testsuite_params *ts_params,
12959                 struct crypto_unittest_params *ut_params,
12960                 const struct test_crypto_vector *reference)
12961 {
12962         return test_authentication_verify_GMAC_fail_when_corruption(
12963                         ts_params, ut_params, reference, 0);
12964 }
12965
12966 static int
12967 test_authenticated_decryption_fail_when_data_corrupted(
12968                 struct crypto_testsuite_params *ts_params,
12969                 struct crypto_unittest_params *ut_params,
12970                 const struct test_crypto_vector *reference)
12971 {
12972         return test_authenticated_decryption_fail_when_corruption(
12973                         ts_params, ut_params, reference, 1);
12974 }
12975
12976 static int
12977 test_authenticated_decryption_fail_when_tag_corrupted(
12978                 struct crypto_testsuite_params *ts_params,
12979                 struct crypto_unittest_params *ut_params,
12980                 const struct test_crypto_vector *reference)
12981 {
12982         return test_authenticated_decryption_fail_when_corruption(
12983                         ts_params, ut_params, reference, 0);
12984 }
12985
12986 static int
12987 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
12988 {
12989         return test_authentication_verify_fail_when_data_corrupted(
12990                         &testsuite_params, &unittest_params,
12991                         &hmac_sha1_test_crypto_vector);
12992 }
12993
12994 static int
12995 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
12996 {
12997         return test_authentication_verify_fail_when_tag_corrupted(
12998                         &testsuite_params, &unittest_params,
12999                         &hmac_sha1_test_crypto_vector);
13000 }
13001
13002 static int
13003 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
13004 {
13005         return test_authentication_verify_GMAC_fail_when_data_corrupted(
13006                         &testsuite_params, &unittest_params,
13007                         &aes128_gmac_test_vector);
13008 }
13009
13010 static int
13011 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13012 {
13013         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13014                         &testsuite_params, &unittest_params,
13015                         &aes128_gmac_test_vector);
13016 }
13017
13018 static int
13019 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13020 {
13021         return test_authenticated_decryption_fail_when_data_corrupted(
13022                         &testsuite_params,
13023                         &unittest_params,
13024                         &aes128cbc_hmac_sha1_test_vector);
13025 }
13026
13027 static int
13028 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
13029 {
13030         return test_authenticated_decryption_fail_when_tag_corrupted(
13031                         &testsuite_params,
13032                         &unittest_params,
13033                         &aes128cbc_hmac_sha1_test_vector);
13034 }
13035
13036 static int
13037 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13038 {
13039         return test_authenticated_encryt_with_esn(
13040                         &testsuite_params,
13041                         &unittest_params,
13042                         &aes128cbc_hmac_sha1_aad_test_vector);
13043 }
13044
13045 static int
13046 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13047 {
13048         return test_authenticated_decrypt_with_esn(
13049                         &testsuite_params,
13050                         &unittest_params,
13051                         &aes128cbc_hmac_sha1_aad_test_vector);
13052 }
13053
13054 static int
13055 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
13056 {
13057         return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
13058 }
13059
13060 static int
13061 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
13062 {
13063         return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
13064 }
13065
13066 #ifdef RTE_CRYPTO_SCHEDULER
13067
13068 /* global AESNI worker IDs for the scheduler test */
13069 uint8_t aesni_ids[2];
13070
13071 static int
13072 test_scheduler_attach_slave_op(void)
13073 {
13074         struct crypto_testsuite_params *ts_params = &testsuite_params;
13075         uint8_t sched_id = ts_params->valid_devs[0];
13076         uint32_t nb_devs, i, nb_devs_attached = 0;
13077         int ret;
13078         char vdev_name[32];
13079
13080         /* create 2 AESNI_MB if necessary */
13081         nb_devs = rte_cryptodev_device_count_by_driver(
13082                         rte_cryptodev_driver_id_get(
13083                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
13084         if (nb_devs < 2) {
13085                 for (i = nb_devs; i < 2; i++) {
13086                         snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
13087                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
13088                                         i);
13089                         ret = rte_vdev_init(vdev_name, NULL);
13090
13091                         TEST_ASSERT(ret == 0,
13092                                 "Failed to create instance %u of"
13093                                 " pmd : %s",
13094                                 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13095                 }
13096         }
13097
13098         /* attach 2 AESNI_MB cdevs */
13099         for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
13100                         i++) {
13101                 struct rte_cryptodev_info info;
13102                 unsigned int session_size;
13103
13104                 rte_cryptodev_info_get(i, &info);
13105                 if (info.driver_id != rte_cryptodev_driver_id_get(
13106                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
13107                         continue;
13108
13109                 session_size = rte_cryptodev_sym_get_private_session_size(i);
13110                 /*
13111                  * Create the session mempool again, since now there are new devices
13112                  * to use the mempool.
13113                  */
13114                 if (ts_params->session_mpool) {
13115                         rte_mempool_free(ts_params->session_mpool);
13116                         ts_params->session_mpool = NULL;
13117                 }
13118                 if (ts_params->session_priv_mpool) {
13119                         rte_mempool_free(ts_params->session_priv_mpool);
13120                         ts_params->session_priv_mpool = NULL;
13121                 }
13122
13123                 if (info.sym.max_nb_sessions != 0 &&
13124                                 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
13125                         RTE_LOG(ERR, USER1,
13126                                         "Device does not support "
13127                                         "at least %u sessions\n",
13128                                         MAX_NB_SESSIONS);
13129                         return TEST_FAILED;
13130                 }
13131                 /*
13132                  * Create mempool with maximum number of sessions,
13133                  * to include the session headers
13134                  */
13135                 if (ts_params->session_mpool == NULL) {
13136                         ts_params->session_mpool =
13137                                 rte_cryptodev_sym_session_pool_create(
13138                                                 "test_sess_mp",
13139                                                 MAX_NB_SESSIONS, 0, 0, 0,
13140                                                 SOCKET_ID_ANY);
13141                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
13142                                         "session mempool allocation failed");
13143                 }
13144
13145                 /*
13146                  * Create mempool with maximum number of sessions,
13147                  * to include device specific session private data
13148                  */
13149                 if (ts_params->session_priv_mpool == NULL) {
13150                         ts_params->session_priv_mpool = rte_mempool_create(
13151                                         "test_sess_mp_priv",
13152                                         MAX_NB_SESSIONS,
13153                                         session_size,
13154                                         0, 0, NULL, NULL, NULL,
13155                                         NULL, SOCKET_ID_ANY,
13156                                         0);
13157
13158                         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
13159                                         "session mempool allocation failed");
13160                 }
13161
13162                 ts_params->qp_conf.mp_session = ts_params->session_mpool;
13163                 ts_params->qp_conf.mp_session_private =
13164                                 ts_params->session_priv_mpool;
13165
13166                 ret = rte_cryptodev_scheduler_worker_attach(sched_id,
13167                                 (uint8_t)i);
13168
13169                 TEST_ASSERT(ret == 0,
13170                         "Failed to attach device %u of pmd : %s", i,
13171                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13172
13173                 aesni_ids[nb_devs_attached] = (uint8_t)i;
13174
13175                 nb_devs_attached++;
13176         }
13177
13178         return 0;
13179 }
13180
13181 static int
13182 test_scheduler_detach_slave_op(void)
13183 {
13184         struct crypto_testsuite_params *ts_params = &testsuite_params;
13185         uint8_t sched_id = ts_params->valid_devs[0];
13186         uint32_t i;
13187         int ret;
13188
13189         for (i = 0; i < 2; i++) {
13190                 ret = rte_cryptodev_scheduler_worker_detach(sched_id,
13191                                 aesni_ids[i]);
13192                 TEST_ASSERT(ret == 0,
13193                         "Failed to detach device %u", aesni_ids[i]);
13194         }
13195
13196         return 0;
13197 }
13198
13199 static int
13200 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
13201 {
13202         struct crypto_testsuite_params *ts_params = &testsuite_params;
13203         uint8_t sched_id = ts_params->valid_devs[0];
13204         /* set mode */
13205         return rte_cryptodev_scheduler_mode_set(sched_id,
13206                 scheduler_mode);
13207 }
13208
13209 static int
13210 test_scheduler_mode_roundrobin_op(void)
13211 {
13212         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
13213                         0, "Failed to set roundrobin mode");
13214         return 0;
13215
13216 }
13217
13218 static int
13219 test_scheduler_mode_multicore_op(void)
13220 {
13221         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
13222                         0, "Failed to set multicore mode");
13223
13224         return 0;
13225 }
13226
13227 static int
13228 test_scheduler_mode_failover_op(void)
13229 {
13230         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
13231                         0, "Failed to set failover mode");
13232
13233         return 0;
13234 }
13235
13236 static int
13237 test_scheduler_mode_pkt_size_distr_op(void)
13238 {
13239         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
13240                         0, "Failed to set pktsize mode");
13241
13242         return 0;
13243 }
13244
13245 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
13246         .suite_name = "Crypto Device Scheduler Unit Test Suite",
13247         .setup = testsuite_setup,
13248         .teardown = testsuite_teardown,
13249         .unit_test_cases = {
13250                 /* Multi Core */
13251                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13252                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),
13253                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13254                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13255                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13256                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13257
13258                 /* Round Robin */
13259                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13260                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),
13261                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13262                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13263                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13264                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13265
13266                 /* Fail over */
13267                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13268                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),
13269                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13270                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13271                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13272                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13273
13274                 /* PKT SIZE */
13275                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13276                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),
13277                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13278                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13279                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13280                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13281
13282                 TEST_CASES_END() /**< NULL terminate unit test array */
13283         }
13284 };
13285
13286 #endif /* RTE_CRYPTO_SCHEDULER */
13287
13288 static struct unit_test_suite cryptodev_testsuite  = {
13289         .suite_name = "Crypto Unit Test Suite",
13290         .setup = testsuite_setup,
13291         .teardown = testsuite_teardown,
13292         .unit_test_cases = {
13293                 TEST_CASE_ST(ut_setup, ut_teardown,
13294                                 test_device_configure_invalid_dev_id),
13295                 TEST_CASE_ST(ut_setup, ut_teardown,
13296                                 test_queue_pair_descriptor_setup),
13297                 TEST_CASE_ST(ut_setup, ut_teardown,
13298                                 test_device_configure_invalid_queue_pair_ids),
13299                 TEST_CASE_ST(ut_setup, ut_teardown,
13300                                 test_multi_session),
13301                 TEST_CASE_ST(ut_setup, ut_teardown,
13302                                 test_multi_session_random_usage),
13303
13304                 TEST_CASE_ST(ut_setup, ut_teardown,
13305                         test_null_invalid_operation),
13306                 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
13307                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13308                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13309                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13310                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13311                 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all),
13312                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all),
13313                 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all),
13314                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13315                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
13316
13317                 /** AES CCM Authenticated Encryption 128 bits key */
13318                 TEST_CASE_ST(ut_setup, ut_teardown,
13319                         test_AES_CCM_authenticated_encryption_test_case_128_1),
13320                 TEST_CASE_ST(ut_setup, ut_teardown,
13321                         test_AES_CCM_authenticated_encryption_test_case_128_2),
13322                 TEST_CASE_ST(ut_setup, ut_teardown,
13323                         test_AES_CCM_authenticated_encryption_test_case_128_3),
13324
13325                 /** AES CCM Authenticated Decryption 128 bits key*/
13326                 TEST_CASE_ST(ut_setup, ut_teardown,
13327                         test_AES_CCM_authenticated_decryption_test_case_128_1),
13328                 TEST_CASE_ST(ut_setup, ut_teardown,
13329                         test_AES_CCM_authenticated_decryption_test_case_128_2),
13330                 TEST_CASE_ST(ut_setup, ut_teardown,
13331                         test_AES_CCM_authenticated_decryption_test_case_128_3),
13332
13333                 /** AES CCM Authenticated Encryption 192 bits key */
13334                 TEST_CASE_ST(ut_setup, ut_teardown,
13335                         test_AES_CCM_authenticated_encryption_test_case_192_1),
13336                 TEST_CASE_ST(ut_setup, ut_teardown,
13337                         test_AES_CCM_authenticated_encryption_test_case_192_2),
13338                 TEST_CASE_ST(ut_setup, ut_teardown,
13339                         test_AES_CCM_authenticated_encryption_test_case_192_3),
13340
13341                 /** AES CCM Authenticated Decryption 192 bits key*/
13342                 TEST_CASE_ST(ut_setup, ut_teardown,
13343                         test_AES_CCM_authenticated_decryption_test_case_192_1),
13344                 TEST_CASE_ST(ut_setup, ut_teardown,
13345                         test_AES_CCM_authenticated_decryption_test_case_192_2),
13346                 TEST_CASE_ST(ut_setup, ut_teardown,
13347                         test_AES_CCM_authenticated_decryption_test_case_192_3),
13348
13349                 /** AES CCM Authenticated Encryption 256 bits key */
13350                 TEST_CASE_ST(ut_setup, ut_teardown,
13351                         test_AES_CCM_authenticated_encryption_test_case_256_1),
13352                 TEST_CASE_ST(ut_setup, ut_teardown,
13353                         test_AES_CCM_authenticated_encryption_test_case_256_2),
13354                 TEST_CASE_ST(ut_setup, ut_teardown,
13355                         test_AES_CCM_authenticated_encryption_test_case_256_3),
13356
13357                 /** AES CCM Authenticated Decryption 256 bits key*/
13358                 TEST_CASE_ST(ut_setup, ut_teardown,
13359                         test_AES_CCM_authenticated_decryption_test_case_256_1),
13360                 TEST_CASE_ST(ut_setup, ut_teardown,
13361                         test_AES_CCM_authenticated_decryption_test_case_256_2),
13362                 TEST_CASE_ST(ut_setup, ut_teardown,
13363                         test_AES_CCM_authenticated_decryption_test_case_256_3),
13364
13365                 /** AES GCM Authenticated Encryption */
13366                 TEST_CASE_ST(ut_setup, ut_teardown,
13367                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
13368                 TEST_CASE_ST(ut_setup, ut_teardown,
13369                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
13370                 TEST_CASE_ST(ut_setup, ut_teardown,
13371                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
13372                 TEST_CASE_ST(ut_setup, ut_teardown,
13373                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
13374                 TEST_CASE_ST(ut_setup, ut_teardown,
13375                         test_AES_GCM_authenticated_encryption_test_case_1),
13376                 TEST_CASE_ST(ut_setup, ut_teardown,
13377                         test_AES_GCM_authenticated_encryption_test_case_2),
13378                 TEST_CASE_ST(ut_setup, ut_teardown,
13379                         test_AES_GCM_authenticated_encryption_test_case_3),
13380                 TEST_CASE_ST(ut_setup, ut_teardown,
13381                         test_AES_GCM_authenticated_encryption_test_case_4),
13382                 TEST_CASE_ST(ut_setup, ut_teardown,
13383                         test_AES_GCM_authenticated_encryption_test_case_5),
13384                 TEST_CASE_ST(ut_setup, ut_teardown,
13385                         test_AES_GCM_authenticated_encryption_test_case_6),
13386                 TEST_CASE_ST(ut_setup, ut_teardown,
13387                         test_AES_GCM_authenticated_encryption_test_case_7),
13388                 TEST_CASE_ST(ut_setup, ut_teardown,
13389                         test_AES_GCM_authenticated_encryption_test_case_8),
13390                 TEST_CASE_ST(ut_setup, ut_teardown,
13391                         test_AES_GCM_J0_authenticated_encryption_test_case_1),
13392
13393                 /** AES GCM Authenticated Decryption */
13394                 TEST_CASE_ST(ut_setup, ut_teardown,
13395                         test_AES_GCM_authenticated_decryption_test_case_1),
13396                 TEST_CASE_ST(ut_setup, ut_teardown,
13397                         test_AES_GCM_authenticated_decryption_test_case_2),
13398                 TEST_CASE_ST(ut_setup, ut_teardown,
13399                         test_AES_GCM_authenticated_decryption_test_case_3),
13400                 TEST_CASE_ST(ut_setup, ut_teardown,
13401                         test_AES_GCM_authenticated_decryption_test_case_4),
13402                 TEST_CASE_ST(ut_setup, ut_teardown,
13403                         test_AES_GCM_authenticated_decryption_test_case_5),
13404                 TEST_CASE_ST(ut_setup, ut_teardown,
13405                         test_AES_GCM_authenticated_decryption_test_case_6),
13406                 TEST_CASE_ST(ut_setup, ut_teardown,
13407                         test_AES_GCM_authenticated_decryption_test_case_7),
13408                 TEST_CASE_ST(ut_setup, ut_teardown,
13409                         test_AES_GCM_authenticated_decryption_test_case_8),
13410                 TEST_CASE_ST(ut_setup, ut_teardown,
13411                         test_AES_GCM_J0_authenticated_decryption_test_case_1),
13412
13413                 /** AES GCM Authenticated Encryption 192 bits key */
13414                 TEST_CASE_ST(ut_setup, ut_teardown,
13415                         test_AES_GCM_auth_encryption_test_case_192_1),
13416                 TEST_CASE_ST(ut_setup, ut_teardown,
13417                         test_AES_GCM_auth_encryption_test_case_192_2),
13418                 TEST_CASE_ST(ut_setup, ut_teardown,
13419                         test_AES_GCM_auth_encryption_test_case_192_3),
13420                 TEST_CASE_ST(ut_setup, ut_teardown,
13421                         test_AES_GCM_auth_encryption_test_case_192_4),
13422                 TEST_CASE_ST(ut_setup, ut_teardown,
13423                         test_AES_GCM_auth_encryption_test_case_192_5),
13424                 TEST_CASE_ST(ut_setup, ut_teardown,
13425                         test_AES_GCM_auth_encryption_test_case_192_6),
13426                 TEST_CASE_ST(ut_setup, ut_teardown,
13427                         test_AES_GCM_auth_encryption_test_case_192_7),
13428
13429                 /** AES GCM Authenticated Decryption 192 bits key */
13430                 TEST_CASE_ST(ut_setup, ut_teardown,
13431                         test_AES_GCM_auth_decryption_test_case_192_1),
13432                 TEST_CASE_ST(ut_setup, ut_teardown,
13433                         test_AES_GCM_auth_decryption_test_case_192_2),
13434                 TEST_CASE_ST(ut_setup, ut_teardown,
13435                         test_AES_GCM_auth_decryption_test_case_192_3),
13436                 TEST_CASE_ST(ut_setup, ut_teardown,
13437                         test_AES_GCM_auth_decryption_test_case_192_4),
13438                 TEST_CASE_ST(ut_setup, ut_teardown,
13439                         test_AES_GCM_auth_decryption_test_case_192_5),
13440                 TEST_CASE_ST(ut_setup, ut_teardown,
13441                         test_AES_GCM_auth_decryption_test_case_192_6),
13442                 TEST_CASE_ST(ut_setup, ut_teardown,
13443                         test_AES_GCM_auth_decryption_test_case_192_7),
13444
13445                 /** AES GCM Authenticated Encryption 256 bits key */
13446                 TEST_CASE_ST(ut_setup, ut_teardown,
13447                         test_AES_GCM_auth_encryption_test_case_256_1),
13448                 TEST_CASE_ST(ut_setup, ut_teardown,
13449                         test_AES_GCM_auth_encryption_test_case_256_2),
13450                 TEST_CASE_ST(ut_setup, ut_teardown,
13451                         test_AES_GCM_auth_encryption_test_case_256_3),
13452                 TEST_CASE_ST(ut_setup, ut_teardown,
13453                         test_AES_GCM_auth_encryption_test_case_256_4),
13454                 TEST_CASE_ST(ut_setup, ut_teardown,
13455                         test_AES_GCM_auth_encryption_test_case_256_5),
13456                 TEST_CASE_ST(ut_setup, ut_teardown,
13457                         test_AES_GCM_auth_encryption_test_case_256_6),
13458                 TEST_CASE_ST(ut_setup, ut_teardown,
13459                         test_AES_GCM_auth_encryption_test_case_256_7),
13460
13461                 /** AES GCM Authenticated Decryption 256 bits key */
13462                 TEST_CASE_ST(ut_setup, ut_teardown,
13463                         test_AES_GCM_auth_decryption_test_case_256_1),
13464                 TEST_CASE_ST(ut_setup, ut_teardown,
13465                         test_AES_GCM_auth_decryption_test_case_256_2),
13466                 TEST_CASE_ST(ut_setup, ut_teardown,
13467                         test_AES_GCM_auth_decryption_test_case_256_3),
13468                 TEST_CASE_ST(ut_setup, ut_teardown,
13469                         test_AES_GCM_auth_decryption_test_case_256_4),
13470                 TEST_CASE_ST(ut_setup, ut_teardown,
13471                         test_AES_GCM_auth_decryption_test_case_256_5),
13472                 TEST_CASE_ST(ut_setup, ut_teardown,
13473                         test_AES_GCM_auth_decryption_test_case_256_6),
13474                 TEST_CASE_ST(ut_setup, ut_teardown,
13475                         test_AES_GCM_auth_decryption_test_case_256_7),
13476
13477                 /** AES GCM Authenticated Encryption big aad size */
13478                 TEST_CASE_ST(ut_setup, ut_teardown,
13479                         test_AES_GCM_auth_encryption_test_case_aad_1),
13480                 TEST_CASE_ST(ut_setup, ut_teardown,
13481                         test_AES_GCM_auth_encryption_test_case_aad_2),
13482
13483                 /** AES GCM Authenticated Decryption big aad size */
13484                 TEST_CASE_ST(ut_setup, ut_teardown,
13485                         test_AES_GCM_auth_decryption_test_case_aad_1),
13486                 TEST_CASE_ST(ut_setup, ut_teardown,
13487                         test_AES_GCM_auth_decryption_test_case_aad_2),
13488
13489                 /** Out of place tests */
13490                 TEST_CASE_ST(ut_setup, ut_teardown,
13491                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
13492                 TEST_CASE_ST(ut_setup, ut_teardown,
13493                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
13494
13495                 /** Session-less tests */
13496                 TEST_CASE_ST(ut_setup, ut_teardown,
13497                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
13498                 TEST_CASE_ST(ut_setup, ut_teardown,
13499                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
13500
13501                 /** AES GMAC Authentication */
13502                 TEST_CASE_ST(ut_setup, ut_teardown,
13503                         test_AES_GMAC_authentication_test_case_1),
13504                 TEST_CASE_ST(ut_setup, ut_teardown,
13505                         test_AES_GMAC_authentication_verify_test_case_1),
13506                 TEST_CASE_ST(ut_setup, ut_teardown,
13507                         test_AES_GMAC_authentication_test_case_2),
13508                 TEST_CASE_ST(ut_setup, ut_teardown,
13509                         test_AES_GMAC_authentication_verify_test_case_2),
13510                 TEST_CASE_ST(ut_setup, ut_teardown,
13511                         test_AES_GMAC_authentication_test_case_3),
13512                 TEST_CASE_ST(ut_setup, ut_teardown,
13513                         test_AES_GMAC_authentication_verify_test_case_3),
13514                 TEST_CASE_ST(ut_setup, ut_teardown,
13515                         test_AES_GMAC_authentication_test_case_4),
13516                 TEST_CASE_ST(ut_setup, ut_teardown,
13517                         test_AES_GMAC_authentication_verify_test_case_4),
13518                 TEST_CASE_ST(ut_setup, ut_teardown,
13519                         test_AES_GMAC_authentication_SGL_40B),
13520                 TEST_CASE_ST(ut_setup, ut_teardown,
13521                         test_AES_GMAC_authentication_SGL_80B),
13522                 TEST_CASE_ST(ut_setup, ut_teardown,
13523                         test_AES_GMAC_authentication_SGL_2048B),
13524                 TEST_CASE_ST(ut_setup, ut_teardown,
13525                         test_AES_GMAC_authentication_SGL_2047B),
13526
13527                 /** Chacha20-Poly1305 */
13528                 TEST_CASE_ST(ut_setup, ut_teardown,
13529                         test_chacha20_poly1305_encrypt_test_case_rfc8439),
13530                 TEST_CASE_ST(ut_setup, ut_teardown,
13531                         test_chacha20_poly1305_decrypt_test_case_rfc8439),
13532                 /** SNOW 3G encrypt only (UEA2) */
13533                 TEST_CASE_ST(ut_setup, ut_teardown,
13534                         test_snow3g_encryption_test_case_1),
13535                 TEST_CASE_ST(ut_setup, ut_teardown,
13536                         test_snow3g_encryption_test_case_2),
13537                 TEST_CASE_ST(ut_setup, ut_teardown,
13538                         test_snow3g_encryption_test_case_3),
13539                 TEST_CASE_ST(ut_setup, ut_teardown,
13540                         test_snow3g_encryption_test_case_4),
13541                 TEST_CASE_ST(ut_setup, ut_teardown,
13542                         test_snow3g_encryption_test_case_5),
13543
13544                 TEST_CASE_ST(ut_setup, ut_teardown,
13545                         test_snow3g_encryption_test_case_1_oop),
13546                 TEST_CASE_ST(ut_setup, ut_teardown,
13547                         test_snow3g_encryption_test_case_1_oop_sgl),
13548                 TEST_CASE_ST(ut_setup, ut_teardown,
13549                         test_snow3g_encryption_test_case_1_offset_oop),
13550                 TEST_CASE_ST(ut_setup, ut_teardown,
13551                         test_snow3g_decryption_test_case_1_oop),
13552
13553                 /** SNOW 3G generate auth, then encrypt (UEA2) */
13554                 TEST_CASE_ST(ut_setup, ut_teardown,
13555                         test_snow3g_auth_cipher_test_case_1),
13556                 TEST_CASE_ST(ut_setup, ut_teardown,
13557                         test_snow3g_auth_cipher_test_case_2),
13558                 TEST_CASE_ST(ut_setup, ut_teardown,
13559                         test_snow3g_auth_cipher_test_case_2_oop),
13560                 TEST_CASE_ST(ut_setup, ut_teardown,
13561                         test_snow3g_auth_cipher_part_digest_enc),
13562                 TEST_CASE_ST(ut_setup, ut_teardown,
13563                         test_snow3g_auth_cipher_part_digest_enc_oop),
13564                 TEST_CASE_ST(ut_setup, ut_teardown,
13565                         test_snow3g_auth_cipher_test_case_3_sgl),
13566                 TEST_CASE_ST(ut_setup, ut_teardown,
13567                         test_snow3g_auth_cipher_test_case_3_oop_sgl),
13568                 TEST_CASE_ST(ut_setup, ut_teardown,
13569                         test_snow3g_auth_cipher_part_digest_enc_sgl),
13570                 TEST_CASE_ST(ut_setup, ut_teardown,
13571                         test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
13572
13573                 /** SNOW 3G decrypt (UEA2), then verify auth */
13574                 TEST_CASE_ST(ut_setup, ut_teardown,
13575                         test_snow3g_auth_cipher_verify_test_case_1),
13576                 TEST_CASE_ST(ut_setup, ut_teardown,
13577                         test_snow3g_auth_cipher_verify_test_case_2),
13578                 TEST_CASE_ST(ut_setup, ut_teardown,
13579                         test_snow3g_auth_cipher_verify_test_case_2_oop),
13580                 TEST_CASE_ST(ut_setup, ut_teardown,
13581                         test_snow3g_auth_cipher_verify_part_digest_enc),
13582                 TEST_CASE_ST(ut_setup, ut_teardown,
13583                         test_snow3g_auth_cipher_verify_part_digest_enc_oop),
13584                 TEST_CASE_ST(ut_setup, ut_teardown,
13585                         test_snow3g_auth_cipher_verify_test_case_3_sgl),
13586                 TEST_CASE_ST(ut_setup, ut_teardown,
13587                         test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
13588                 TEST_CASE_ST(ut_setup, ut_teardown,
13589                         test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
13590                 TEST_CASE_ST(ut_setup, ut_teardown,
13591                         test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
13592
13593                 /** SNOW 3G decrypt only (UEA2) */
13594                 TEST_CASE_ST(ut_setup, ut_teardown,
13595                         test_snow3g_decryption_test_case_1),
13596                 TEST_CASE_ST(ut_setup, ut_teardown,
13597                         test_snow3g_decryption_test_case_2),
13598                 TEST_CASE_ST(ut_setup, ut_teardown,
13599                         test_snow3g_decryption_test_case_3),
13600                 TEST_CASE_ST(ut_setup, ut_teardown,
13601                         test_snow3g_decryption_test_case_4),
13602                 TEST_CASE_ST(ut_setup, ut_teardown,
13603                         test_snow3g_decryption_test_case_5),
13604                 TEST_CASE_ST(ut_setup, ut_teardown,
13605                         test_snow3g_decryption_with_digest_test_case_1),
13606                 TEST_CASE_ST(ut_setup, ut_teardown,
13607                         test_snow3g_hash_generate_test_case_1),
13608                 TEST_CASE_ST(ut_setup, ut_teardown,
13609                         test_snow3g_hash_generate_test_case_2),
13610                 TEST_CASE_ST(ut_setup, ut_teardown,
13611                         test_snow3g_hash_generate_test_case_3),
13612                 /* Tests with buffers which length is not byte-aligned */
13613                 TEST_CASE_ST(ut_setup, ut_teardown,
13614                         test_snow3g_hash_generate_test_case_4),
13615                 TEST_CASE_ST(ut_setup, ut_teardown,
13616                         test_snow3g_hash_generate_test_case_5),
13617                 TEST_CASE_ST(ut_setup, ut_teardown,
13618                         test_snow3g_hash_generate_test_case_6),
13619                 TEST_CASE_ST(ut_setup, ut_teardown,
13620                         test_snow3g_hash_verify_test_case_1),
13621                 TEST_CASE_ST(ut_setup, ut_teardown,
13622                         test_snow3g_hash_verify_test_case_2),
13623                 TEST_CASE_ST(ut_setup, ut_teardown,
13624                         test_snow3g_hash_verify_test_case_3),
13625                 /* Tests with buffers which length is not byte-aligned */
13626                 TEST_CASE_ST(ut_setup, ut_teardown,
13627                         test_snow3g_hash_verify_test_case_4),
13628                 TEST_CASE_ST(ut_setup, ut_teardown,
13629                         test_snow3g_hash_verify_test_case_5),
13630                 TEST_CASE_ST(ut_setup, ut_teardown,
13631                         test_snow3g_hash_verify_test_case_6),
13632                 TEST_CASE_ST(ut_setup, ut_teardown,
13633                         test_snow3g_cipher_auth_test_case_1),
13634                 TEST_CASE_ST(ut_setup, ut_teardown,
13635                         test_snow3g_auth_cipher_with_digest_test_case_1),
13636
13637                 /** ZUC encrypt only (EEA3) */
13638                 TEST_CASE_ST(ut_setup, ut_teardown,
13639                         test_zuc_encryption_test_case_1),
13640                 TEST_CASE_ST(ut_setup, ut_teardown,
13641                         test_zuc_encryption_test_case_2),
13642                 TEST_CASE_ST(ut_setup, ut_teardown,
13643                         test_zuc_encryption_test_case_3),
13644                 TEST_CASE_ST(ut_setup, ut_teardown,
13645                         test_zuc_encryption_test_case_4),
13646                 TEST_CASE_ST(ut_setup, ut_teardown,
13647                         test_zuc_encryption_test_case_5),
13648                 TEST_CASE_ST(ut_setup, ut_teardown,
13649                         test_zuc_encryption_test_case_6_sgl),
13650
13651                 /** ZUC authenticate (EIA3) */
13652                 TEST_CASE_ST(ut_setup, ut_teardown,
13653                         test_zuc_hash_generate_test_case_1),
13654                 TEST_CASE_ST(ut_setup, ut_teardown,
13655                         test_zuc_hash_generate_test_case_2),
13656                 TEST_CASE_ST(ut_setup, ut_teardown,
13657                         test_zuc_hash_generate_test_case_3),
13658                 TEST_CASE_ST(ut_setup, ut_teardown,
13659                         test_zuc_hash_generate_test_case_4),
13660                 TEST_CASE_ST(ut_setup, ut_teardown,
13661                         test_zuc_hash_generate_test_case_5),
13662                 TEST_CASE_ST(ut_setup, ut_teardown,
13663                         test_zuc_hash_generate_test_case_6),
13664                 TEST_CASE_ST(ut_setup, ut_teardown,
13665                         test_zuc_hash_generate_test_case_7),
13666                 TEST_CASE_ST(ut_setup, ut_teardown,
13667                         test_zuc_hash_generate_test_case_8),
13668
13669                 /** ZUC alg-chain (EEA3/EIA3) */
13670                 TEST_CASE_ST(ut_setup, ut_teardown,
13671                         test_zuc_cipher_auth_test_case_1),
13672                 TEST_CASE_ST(ut_setup, ut_teardown,
13673                         test_zuc_cipher_auth_test_case_2),
13674
13675                 /** ZUC generate auth, then encrypt (EEA3) */
13676                 TEST_CASE_ST(ut_setup, ut_teardown,
13677                         test_zuc_auth_cipher_test_case_1),
13678                 TEST_CASE_ST(ut_setup, ut_teardown,
13679                         test_zuc_auth_cipher_test_case_1_oop),
13680                 TEST_CASE_ST(ut_setup, ut_teardown,
13681                         test_zuc_auth_cipher_test_case_1_sgl),
13682                 TEST_CASE_ST(ut_setup, ut_teardown,
13683                         test_zuc_auth_cipher_test_case_1_oop_sgl),
13684
13685                 /** ZUC decrypt (EEA3), then verify auth */
13686                 TEST_CASE_ST(ut_setup, ut_teardown,
13687                         test_zuc_auth_cipher_verify_test_case_1),
13688                 TEST_CASE_ST(ut_setup, ut_teardown,
13689                         test_zuc_auth_cipher_verify_test_case_1_oop),
13690                 TEST_CASE_ST(ut_setup, ut_teardown,
13691                         test_zuc_auth_cipher_verify_test_case_1_sgl),
13692                 TEST_CASE_ST(ut_setup, ut_teardown,
13693                         test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
13694
13695                 /** HMAC_MD5 Authentication */
13696                 TEST_CASE_ST(ut_setup, ut_teardown,
13697                         test_MD5_HMAC_generate_case_1),
13698                 TEST_CASE_ST(ut_setup, ut_teardown,
13699                         test_MD5_HMAC_verify_case_1),
13700                 TEST_CASE_ST(ut_setup, ut_teardown,
13701                         test_MD5_HMAC_generate_case_2),
13702                 TEST_CASE_ST(ut_setup, ut_teardown,
13703                         test_MD5_HMAC_verify_case_2),
13704
13705                 /** KASUMI hash only (UIA1) */
13706                 TEST_CASE_ST(ut_setup, ut_teardown,
13707                         test_kasumi_hash_generate_test_case_1),
13708                 TEST_CASE_ST(ut_setup, ut_teardown,
13709                         test_kasumi_hash_generate_test_case_2),
13710                 TEST_CASE_ST(ut_setup, ut_teardown,
13711                         test_kasumi_hash_generate_test_case_3),
13712                 TEST_CASE_ST(ut_setup, ut_teardown,
13713                         test_kasumi_hash_generate_test_case_4),
13714                 TEST_CASE_ST(ut_setup, ut_teardown,
13715                         test_kasumi_hash_generate_test_case_5),
13716                 TEST_CASE_ST(ut_setup, ut_teardown,
13717                         test_kasumi_hash_generate_test_case_6),
13718
13719                 TEST_CASE_ST(ut_setup, ut_teardown,
13720                         test_kasumi_hash_verify_test_case_1),
13721                 TEST_CASE_ST(ut_setup, ut_teardown,
13722                         test_kasumi_hash_verify_test_case_2),
13723                 TEST_CASE_ST(ut_setup, ut_teardown,
13724                         test_kasumi_hash_verify_test_case_3),
13725                 TEST_CASE_ST(ut_setup, ut_teardown,
13726                         test_kasumi_hash_verify_test_case_4),
13727                 TEST_CASE_ST(ut_setup, ut_teardown,
13728                         test_kasumi_hash_verify_test_case_5),
13729
13730                 /** KASUMI encrypt only (UEA1) */
13731                 TEST_CASE_ST(ut_setup, ut_teardown,
13732                         test_kasumi_encryption_test_case_1),
13733                 TEST_CASE_ST(ut_setup, ut_teardown,
13734                         test_kasumi_encryption_test_case_1_sgl),
13735                 TEST_CASE_ST(ut_setup, ut_teardown,
13736                         test_kasumi_encryption_test_case_1_oop),
13737                 TEST_CASE_ST(ut_setup, ut_teardown,
13738                         test_kasumi_encryption_test_case_1_oop_sgl),
13739                 TEST_CASE_ST(ut_setup, ut_teardown,
13740                         test_kasumi_encryption_test_case_2),
13741                 TEST_CASE_ST(ut_setup, ut_teardown,
13742                         test_kasumi_encryption_test_case_3),
13743                 TEST_CASE_ST(ut_setup, ut_teardown,
13744                         test_kasumi_encryption_test_case_4),
13745                 TEST_CASE_ST(ut_setup, ut_teardown,
13746                         test_kasumi_encryption_test_case_5),
13747
13748                 /** KASUMI decrypt only (UEA1) */
13749                 TEST_CASE_ST(ut_setup, ut_teardown,
13750                         test_kasumi_decryption_test_case_1),
13751                 TEST_CASE_ST(ut_setup, ut_teardown,
13752                         test_kasumi_decryption_test_case_2),
13753                 TEST_CASE_ST(ut_setup, ut_teardown,
13754                         test_kasumi_decryption_test_case_3),
13755                 TEST_CASE_ST(ut_setup, ut_teardown,
13756                         test_kasumi_decryption_test_case_4),
13757                 TEST_CASE_ST(ut_setup, ut_teardown,
13758                         test_kasumi_decryption_test_case_5),
13759                 TEST_CASE_ST(ut_setup, ut_teardown,
13760                         test_kasumi_decryption_test_case_1_oop),
13761
13762                 TEST_CASE_ST(ut_setup, ut_teardown,
13763                         test_kasumi_cipher_auth_test_case_1),
13764
13765                 /** KASUMI generate auth, then encrypt (F8) */
13766                 TEST_CASE_ST(ut_setup, ut_teardown,
13767                         test_kasumi_auth_cipher_test_case_1),
13768                 TEST_CASE_ST(ut_setup, ut_teardown,
13769                         test_kasumi_auth_cipher_test_case_2),
13770                 TEST_CASE_ST(ut_setup, ut_teardown,
13771                         test_kasumi_auth_cipher_test_case_2_oop),
13772                 TEST_CASE_ST(ut_setup, ut_teardown,
13773                         test_kasumi_auth_cipher_test_case_2_sgl),
13774                 TEST_CASE_ST(ut_setup, ut_teardown,
13775                         test_kasumi_auth_cipher_test_case_2_oop_sgl),
13776
13777                 /** KASUMI decrypt (F8), then verify auth */
13778                 TEST_CASE_ST(ut_setup, ut_teardown,
13779                         test_kasumi_auth_cipher_verify_test_case_1),
13780                 TEST_CASE_ST(ut_setup, ut_teardown,
13781                         test_kasumi_auth_cipher_verify_test_case_2),
13782                 TEST_CASE_ST(ut_setup, ut_teardown,
13783                         test_kasumi_auth_cipher_verify_test_case_2_oop),
13784                 TEST_CASE_ST(ut_setup, ut_teardown,
13785                         test_kasumi_auth_cipher_verify_test_case_2_sgl),
13786                 TEST_CASE_ST(ut_setup, ut_teardown,
13787                         test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
13788
13789                 /** ESN Testcase */
13790                 TEST_CASE_ST(ut_setup, ut_teardown,
13791                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
13792                 TEST_CASE_ST(ut_setup, ut_teardown,
13793                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
13794
13795                 /** Negative tests */
13796                 TEST_CASE_ST(ut_setup, ut_teardown,
13797                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13798                 TEST_CASE_ST(ut_setup, ut_teardown,
13799                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13800                 TEST_CASE_ST(ut_setup, ut_teardown,
13801                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
13802                 TEST_CASE_ST(ut_setup, ut_teardown,
13803                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
13804                 TEST_CASE_ST(ut_setup, ut_teardown,
13805                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
13806                 TEST_CASE_ST(ut_setup, ut_teardown,
13807                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
13808                 TEST_CASE_ST(ut_setup, ut_teardown,
13809                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
13810                 TEST_CASE_ST(ut_setup, ut_teardown,
13811                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
13812                 TEST_CASE_ST(ut_setup, ut_teardown,
13813                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
13814                 TEST_CASE_ST(ut_setup, ut_teardown,
13815                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
13816                 TEST_CASE_ST(ut_setup, ut_teardown,
13817                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
13818                 TEST_CASE_ST(ut_setup, ut_teardown,
13819                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
13820                 TEST_CASE_ST(ut_setup, ut_teardown,
13821                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
13822                 TEST_CASE_ST(ut_setup, ut_teardown,
13823                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
13824                 TEST_CASE_ST(ut_setup, ut_teardown,
13825                         authentication_verify_AES128_GMAC_fail_data_corrupt),
13826                 TEST_CASE_ST(ut_setup, ut_teardown,
13827                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
13828                 TEST_CASE_ST(ut_setup, ut_teardown,
13829                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13830                 TEST_CASE_ST(ut_setup, ut_teardown,
13831                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13832
13833                 /** Mixed CIPHER + HASH algorithms */
13834                 /** AUTH AES CMAC + CIPHER AES CTR */
13835                 TEST_CASE_ST(ut_setup, ut_teardown,
13836                         test_aes_cmac_aes_ctr_digest_enc_test_case_1),
13837                 TEST_CASE_ST(ut_setup, ut_teardown,
13838                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13839                 TEST_CASE_ST(ut_setup, ut_teardown,
13840                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13841                 TEST_CASE_ST(ut_setup, ut_teardown,
13842                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13843                 TEST_CASE_ST(ut_setup, ut_teardown,
13844                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
13845                 TEST_CASE_ST(ut_setup, ut_teardown,
13846                        test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13847                 TEST_CASE_ST(ut_setup, ut_teardown,
13848                        test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13849                 TEST_CASE_ST(ut_setup, ut_teardown,
13850                    test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13851
13852                 /** AUTH ZUC + CIPHER SNOW3G */
13853                 TEST_CASE_ST(ut_setup, ut_teardown,
13854                         test_auth_zuc_cipher_snow_test_case_1),
13855                 TEST_CASE_ST(ut_setup, ut_teardown,
13856                         test_verify_auth_zuc_cipher_snow_test_case_1),
13857                 /** AUTH AES CMAC + CIPHER SNOW3G */
13858                 TEST_CASE_ST(ut_setup, ut_teardown,
13859                         test_auth_aes_cmac_cipher_snow_test_case_1),
13860                 TEST_CASE_ST(ut_setup, ut_teardown,
13861                         test_verify_auth_aes_cmac_cipher_snow_test_case_1),
13862                 /** AUTH ZUC + CIPHER AES CTR */
13863                 TEST_CASE_ST(ut_setup, ut_teardown,
13864                         test_auth_zuc_cipher_aes_ctr_test_case_1),
13865                 TEST_CASE_ST(ut_setup, ut_teardown,
13866                         test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
13867                 /** AUTH SNOW3G + CIPHER AES CTR */
13868                 TEST_CASE_ST(ut_setup, ut_teardown,
13869                         test_auth_snow_cipher_aes_ctr_test_case_1),
13870                 TEST_CASE_ST(ut_setup, ut_teardown,
13871                         test_verify_auth_snow_cipher_aes_ctr_test_case_1),
13872                 /** AUTH SNOW3G + CIPHER ZUC */
13873                 TEST_CASE_ST(ut_setup, ut_teardown,
13874                         test_auth_snow_cipher_zuc_test_case_1),
13875                 TEST_CASE_ST(ut_setup, ut_teardown,
13876                         test_verify_auth_snow_cipher_zuc_test_case_1),
13877                 /** AUTH AES CMAC + CIPHER ZUC */
13878                 TEST_CASE_ST(ut_setup, ut_teardown,
13879                         test_auth_aes_cmac_cipher_zuc_test_case_1),
13880                 TEST_CASE_ST(ut_setup, ut_teardown,
13881                         test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
13882
13883                 /** AUTH NULL + CIPHER SNOW3G */
13884                 TEST_CASE_ST(ut_setup, ut_teardown,
13885                         test_auth_null_cipher_snow_test_case_1),
13886                 TEST_CASE_ST(ut_setup, ut_teardown,
13887                         test_verify_auth_null_cipher_snow_test_case_1),
13888                 /** AUTH NULL + CIPHER ZUC */
13889                 TEST_CASE_ST(ut_setup, ut_teardown,
13890                         test_auth_null_cipher_zuc_test_case_1),
13891                 TEST_CASE_ST(ut_setup, ut_teardown,
13892                         test_verify_auth_null_cipher_zuc_test_case_1),
13893                 /** AUTH SNOW3G + CIPHER NULL */
13894                 TEST_CASE_ST(ut_setup, ut_teardown,
13895                         test_auth_snow_cipher_null_test_case_1),
13896                 TEST_CASE_ST(ut_setup, ut_teardown,
13897                         test_verify_auth_snow_cipher_null_test_case_1),
13898                 /** AUTH ZUC + CIPHER NULL */
13899                 TEST_CASE_ST(ut_setup, ut_teardown,
13900                         test_auth_zuc_cipher_null_test_case_1),
13901                 TEST_CASE_ST(ut_setup, ut_teardown,
13902                         test_verify_auth_zuc_cipher_null_test_case_1),
13903                 /** AUTH NULL + CIPHER AES CTR */
13904                 TEST_CASE_ST(ut_setup, ut_teardown,
13905                         test_auth_null_cipher_aes_ctr_test_case_1),
13906                 TEST_CASE_ST(ut_setup, ut_teardown,
13907                         test_verify_auth_null_cipher_aes_ctr_test_case_1),
13908                 /** AUTH AES CMAC + CIPHER NULL */
13909                 TEST_CASE_ST(ut_setup, ut_teardown,
13910                         test_auth_aes_cmac_cipher_null_test_case_1),
13911                 TEST_CASE_ST(ut_setup, ut_teardown,
13912                         test_verify_auth_aes_cmac_cipher_null_test_case_1),
13913
13914 #ifdef RTE_LIB_SECURITY
13915                 TEST_CASE_ST(ut_setup_security, ut_teardown,
13916                         test_PDCP_PROTO_all),
13917                 TEST_CASE_ST(ut_setup_security, ut_teardown,
13918                         test_DOCSIS_PROTO_all),
13919 #endif
13920                 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
13921                 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
13922                 TEST_CASES_END() /**< NULL terminate unit test array */
13923         }
13924 };
13925
13926 static struct unit_test_suite cryptodev_virtio_testsuite = {
13927         .suite_name = "Crypto VIRTIO Unit Test Suite",
13928         .setup = testsuite_setup,
13929         .teardown = testsuite_teardown,
13930         .unit_test_cases = {
13931                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13932
13933                 TEST_CASES_END() /**< NULL terminate unit test array */
13934         }
13935 };
13936
13937 static struct unit_test_suite cryptodev_caam_jr_testsuite  = {
13938         .suite_name = "Crypto CAAM JR Unit Test Suite",
13939         .setup = testsuite_setup,
13940         .teardown = testsuite_teardown,
13941         .unit_test_cases = {
13942                 TEST_CASE_ST(ut_setup, ut_teardown,
13943                              test_device_configure_invalid_dev_id),
13944                 TEST_CASE_ST(ut_setup, ut_teardown,
13945                              test_multi_session),
13946
13947                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13948                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13949                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13950                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13951                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13952
13953                 TEST_CASES_END() /**< NULL terminate unit test array */
13954         }
13955 };
13956
13957 static struct unit_test_suite cryptodev_mrvl_testsuite  = {
13958         .suite_name = "Crypto Device Marvell Component Test Suite",
13959         .setup = testsuite_setup,
13960         .teardown = testsuite_teardown,
13961         .unit_test_cases = {
13962                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13963                 TEST_CASE_ST(ut_setup, ut_teardown,
13964                                 test_multi_session_random_usage),
13965                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13966                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13967                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13968                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13969                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13970
13971                 /** Negative tests */
13972                 TEST_CASE_ST(ut_setup, ut_teardown,
13973                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13974                 TEST_CASE_ST(ut_setup, ut_teardown,
13975                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13976                 TEST_CASE_ST(ut_setup, ut_teardown,
13977                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13978                 TEST_CASE_ST(ut_setup, ut_teardown,
13979                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13980
13981                 TEST_CASES_END() /**< NULL terminate unit test array */
13982         }
13983 };
13984
13985 static struct unit_test_suite cryptodev_ccp_testsuite  = {
13986         .suite_name = "Crypto Device CCP Unit Test Suite",
13987         .setup = testsuite_setup,
13988         .teardown = testsuite_teardown,
13989         .unit_test_cases = {
13990                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13991                 TEST_CASE_ST(ut_setup, ut_teardown,
13992                                 test_multi_session_random_usage),
13993                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13994                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13995                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13996                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13997                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13998
13999                 /** Negative tests */
14000                 TEST_CASE_ST(ut_setup, ut_teardown,
14001                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
14002                 TEST_CASE_ST(ut_setup, ut_teardown,
14003                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14004                 TEST_CASE_ST(ut_setup, ut_teardown,
14005                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14006                 TEST_CASE_ST(ut_setup, ut_teardown,
14007                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14008
14009                 TEST_CASES_END() /**< NULL terminate unit test array */
14010         }
14011 };
14012
14013 static int
14014 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
14015 {
14016         gbl_driver_id = rte_cryptodev_driver_id_get(
14017                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14018
14019         if (gbl_driver_id == -1) {
14020                 RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14021                 return TEST_SKIPPED;
14022         }
14023
14024         return unit_test_suite_runner(&cryptodev_testsuite);
14025 }
14026
14027 static int
14028 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)
14029 {
14030         gbl_driver_id = rte_cryptodev_driver_id_get(
14031                         RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
14032
14033         if (gbl_driver_id == -1) {
14034                 RTE_LOG(ERR, USER1, "VIRTIO PMD must be loaded.\n");
14035                 return TEST_FAILED;
14036         }
14037
14038         return unit_test_suite_runner(&cryptodev_virtio_testsuite);
14039 }
14040
14041 static int
14042 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
14043 {
14044         gbl_driver_id = rte_cryptodev_driver_id_get(
14045                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14046
14047         if (gbl_driver_id == -1) {
14048                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14049                 return TEST_SKIPPED;
14050         }
14051
14052         return unit_test_suite_runner(&cryptodev_testsuite);
14053 }
14054
14055 static int
14056 test_cryptodev_cpu_aesni_mb(void)
14057 {
14058         int32_t rc;
14059         enum rte_security_session_action_type at;
14060
14061         gbl_driver_id = rte_cryptodev_driver_id_get(
14062                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14063
14064         if (gbl_driver_id == -1) {
14065                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14066                 return TEST_SKIPPED;
14067         }
14068
14069         at = gbl_action_type;
14070         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14071         rc = unit_test_suite_runner(&cryptodev_testsuite);
14072         gbl_action_type = at;
14073         return rc;
14074 }
14075
14076 static int
14077 test_cryptodev_openssl(void)
14078 {
14079         gbl_driver_id = rte_cryptodev_driver_id_get(
14080                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
14081
14082         if (gbl_driver_id == -1) {
14083                 RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded.\n");
14084                 return TEST_SKIPPED;
14085         }
14086
14087         return unit_test_suite_runner(&cryptodev_testsuite);
14088 }
14089
14090 static int
14091 test_cryptodev_aesni_gcm(void)
14092 {
14093         gbl_driver_id = rte_cryptodev_driver_id_get(
14094                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14095
14096         if (gbl_driver_id == -1) {
14097                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
14098                 return TEST_SKIPPED;
14099         }
14100
14101         return unit_test_suite_runner(&cryptodev_testsuite);
14102 }
14103
14104 static int
14105 test_cryptodev_cpu_aesni_gcm(void)
14106 {
14107         int32_t rc;
14108         enum rte_security_session_action_type at;
14109
14110         gbl_driver_id = rte_cryptodev_driver_id_get(
14111                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14112
14113         if (gbl_driver_id == -1) {
14114                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
14115                 return TEST_SKIPPED;
14116         }
14117
14118         at = gbl_action_type;
14119         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14120         rc = unit_test_suite_runner(&cryptodev_testsuite);
14121         gbl_action_type = at;
14122         return rc;
14123 }
14124
14125 static int
14126 test_cryptodev_null(void)
14127 {
14128         gbl_driver_id = rte_cryptodev_driver_id_get(
14129                         RTE_STR(CRYPTODEV_NAME_NULL_PMD));
14130
14131         if (gbl_driver_id == -1) {
14132                 RTE_LOG(ERR, USER1, "NULL PMD must be loaded.\n");
14133                 return TEST_SKIPPED;
14134         }
14135
14136         return unit_test_suite_runner(&cryptodev_testsuite);
14137 }
14138
14139 static int
14140 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
14141 {
14142         gbl_driver_id = rte_cryptodev_driver_id_get(
14143                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
14144
14145         if (gbl_driver_id == -1) {
14146                 RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded.\n");
14147                 return TEST_SKIPPED;
14148         }
14149
14150         return unit_test_suite_runner(&cryptodev_testsuite);
14151 }
14152
14153 static int
14154 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
14155 {
14156         gbl_driver_id = rte_cryptodev_driver_id_get(
14157                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
14158
14159         if (gbl_driver_id == -1) {
14160                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
14161                 return TEST_SKIPPED;
14162         }
14163
14164         return unit_test_suite_runner(&cryptodev_testsuite);
14165 }
14166
14167 static int
14168 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
14169 {
14170         gbl_driver_id = rte_cryptodev_driver_id_get(
14171                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
14172
14173         if (gbl_driver_id == -1) {
14174                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
14175                 return TEST_SKIPPED;
14176         }
14177
14178         return unit_test_suite_runner(&cryptodev_testsuite);
14179 }
14180
14181 static int
14182 test_cryptodev_armv8(void)
14183 {
14184         gbl_driver_id = rte_cryptodev_driver_id_get(
14185                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
14186
14187         if (gbl_driver_id == -1) {
14188                 RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded.\n");
14189                 return TEST_SKIPPED;
14190         }
14191
14192         return unit_test_suite_runner(&cryptodev_testsuite);
14193 }
14194
14195 static int
14196 test_cryptodev_mrvl(void)
14197 {
14198         gbl_driver_id = rte_cryptodev_driver_id_get(
14199                         RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
14200
14201         if (gbl_driver_id == -1) {
14202                 RTE_LOG(ERR, USER1, "MVSAM PMD must be loaded.\n");
14203                 return TEST_SKIPPED;
14204         }
14205
14206         return unit_test_suite_runner(&cryptodev_mrvl_testsuite);
14207 }
14208
14209 #ifdef RTE_CRYPTO_SCHEDULER
14210
14211 static int
14212 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
14213 {
14214         gbl_driver_id = rte_cryptodev_driver_id_get(
14215                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14216
14217         if (gbl_driver_id == -1) {
14218                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
14219                 return TEST_SKIPPED;
14220         }
14221
14222         if (rte_cryptodev_driver_id_get(
14223                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
14224                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14225                 return TEST_SKIPPED;
14226 }
14227         return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
14228 }
14229
14230 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
14231
14232 #endif
14233
14234 static int
14235 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14236 {
14237         gbl_driver_id = rte_cryptodev_driver_id_get(
14238                         RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
14239
14240         if (gbl_driver_id == -1) {
14241                 RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded.\n");
14242                 return TEST_SKIPPED;
14243         }
14244
14245         return unit_test_suite_runner(&cryptodev_testsuite);
14246 }
14247
14248 static int
14249 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14250 {
14251         gbl_driver_id = rte_cryptodev_driver_id_get(
14252                         RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
14253
14254         if (gbl_driver_id == -1) {
14255                 RTE_LOG(ERR, USER1, "DPAA SEC PMD must be loaded.\n");
14256                 return TEST_SKIPPED;
14257         }
14258
14259         return unit_test_suite_runner(&cryptodev_testsuite);
14260 }
14261
14262 static int
14263 test_cryptodev_ccp(void)
14264 {
14265         gbl_driver_id = rte_cryptodev_driver_id_get(
14266                         RTE_STR(CRYPTODEV_NAME_CCP_PMD));
14267
14268         if (gbl_driver_id == -1) {
14269                 RTE_LOG(ERR, USER1, "CCP PMD must be loaded.\n");
14270                 return TEST_FAILED;
14271         }
14272
14273         return unit_test_suite_runner(&cryptodev_ccp_testsuite);
14274 }
14275
14276 static int
14277 test_cryptodev_octeontx(void)
14278 {
14279         gbl_driver_id = rte_cryptodev_driver_id_get(
14280                         RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
14281         if (gbl_driver_id == -1) {
14282                 RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded.\n");
14283                 return TEST_FAILED;
14284         }
14285         return unit_test_suite_runner(&cryptodev_testsuite);
14286 }
14287
14288 static int
14289 test_cryptodev_octeontx2(void)
14290 {
14291         gbl_driver_id = rte_cryptodev_driver_id_get(
14292                         RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
14293         if (gbl_driver_id == -1) {
14294                 RTE_LOG(ERR, USER1, "OCTEON TX2 PMD must be loaded.\n");
14295                 return TEST_FAILED;
14296         }
14297         return unit_test_suite_runner(&cryptodev_testsuite);
14298 }
14299
14300 static int
14301 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)
14302 {
14303         gbl_driver_id = rte_cryptodev_driver_id_get(
14304                         RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
14305
14306         if (gbl_driver_id == -1) {
14307                 RTE_LOG(ERR, USER1, "CAAM_JR PMD must be loaded.\n");
14308                 return TEST_FAILED;
14309         }
14310
14311         return unit_test_suite_runner(&cryptodev_caam_jr_testsuite);
14312 }
14313
14314 static int
14315 test_cryptodev_nitrox(void)
14316 {
14317         gbl_driver_id = rte_cryptodev_driver_id_get(
14318                         RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
14319
14320         if (gbl_driver_id == -1) {
14321                 RTE_LOG(ERR, USER1, "NITROX PMD must be loaded.\n");
14322                 return TEST_FAILED;
14323         }
14324
14325         return unit_test_suite_runner(&cryptodev_testsuite);
14326 }
14327
14328 static int
14329 test_cryptodev_bcmfs(void)
14330 {
14331         gbl_driver_id = rte_cryptodev_driver_id_get(
14332                         RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
14333
14334         if (gbl_driver_id == -1) {
14335                 RTE_LOG(ERR, USER1, "BCMFS PMD must be loaded.\n");
14336                 return TEST_FAILED;
14337         }
14338
14339         return unit_test_suite_runner(&cryptodev_testsuite);
14340 }
14341
14342 static int
14343 test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/)
14344 {
14345         int ret;
14346
14347         gbl_driver_id = rte_cryptodev_driver_id_get(
14348                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14349
14350         if (gbl_driver_id == -1) {
14351                 RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14352                 return TEST_SKIPPED;
14353         }
14354
14355         global_api_test_type = CRYPTODEV_RAW_API_TEST;
14356         ret = unit_test_suite_runner(&cryptodev_testsuite);
14357         global_api_test_type = CRYPTODEV_API_TEST;
14358
14359         return ret;
14360 }
14361
14362 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
14363                 test_cryptodev_qat_raw_api);
14364 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
14365 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
14366 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
14367         test_cryptodev_cpu_aesni_mb);
14368 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
14369 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
14370 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
14371         test_cryptodev_cpu_aesni_gcm);
14372 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
14373 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
14374 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
14375 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
14376 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
14377 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
14378 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
14379 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
14380 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
14381 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
14382 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
14383 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
14384 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
14385 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
14386 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);