test/crypto: add case for enqueue/dequeue callbacks
[dpdk.git] / app / test / test_cryptodev.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2020 Intel Corporation
3  * Copyright 2020 NXP
4  */
5
6 #include <time.h>
7
8 #include <rte_common.h>
9 #include <rte_hexdump.h>
10 #include <rte_mbuf.h>
11 #include <rte_malloc.h>
12 #include <rte_memcpy.h>
13 #include <rte_pause.h>
14 #include <rte_bus_vdev.h>
15 #include <rte_ether.h>
16
17 #include <rte_crypto.h>
18 #include <rte_cryptodev.h>
19 #include <rte_cryptodev_pmd.h>
20 #include <rte_string_fns.h>
21
22 #ifdef RTE_CRYPTO_SCHEDULER
23 #include <rte_cryptodev_scheduler.h>
24 #include <rte_cryptodev_scheduler_operations.h>
25 #endif
26
27 #include <rte_lcore.h>
28
29 #include "test.h"
30 #include "test_cryptodev.h"
31
32 #include "test_cryptodev_blockcipher.h"
33 #include "test_cryptodev_aes_test_vectors.h"
34 #include "test_cryptodev_des_test_vectors.h"
35 #include "test_cryptodev_hash_test_vectors.h"
36 #include "test_cryptodev_kasumi_test_vectors.h"
37 #include "test_cryptodev_kasumi_hash_test_vectors.h"
38 #include "test_cryptodev_snow3g_test_vectors.h"
39 #include "test_cryptodev_snow3g_hash_test_vectors.h"
40 #include "test_cryptodev_zuc_test_vectors.h"
41 #include "test_cryptodev_aead_test_vectors.h"
42 #include "test_cryptodev_hmac_test_vectors.h"
43 #include "test_cryptodev_mixed_test_vectors.h"
44 #ifdef RTE_LIB_SECURITY
45 #include "test_cryptodev_security_pdcp_test_vectors.h"
46 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
47 #include "test_cryptodev_security_pdcp_test_func.h"
48 #include "test_cryptodev_security_docsis_test_vectors.h"
49
50 #define SDAP_DISABLED   0
51 #define SDAP_ENABLED    1
52 #endif
53
54 #define VDEV_ARGS_SIZE 100
55 #define MAX_NB_SESSIONS 4
56
57 #define MAX_DRV_SERVICE_CTX_SIZE 256
58
59 #define MAX_RAW_DEQUEUE_COUNT   65535
60
61 #define IN_PLACE 0
62 #define OUT_OF_PLACE 1
63
64 #ifndef ARRAY_SIZE
65 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
66 #endif
67
68 static int gbl_driver_id;
69
70 static enum rte_security_session_action_type gbl_action_type =
71         RTE_SECURITY_ACTION_TYPE_NONE;
72
73 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
74
75 struct crypto_testsuite_params {
76         struct rte_mempool *mbuf_pool;
77         struct rte_mempool *large_mbuf_pool;
78         struct rte_mempool *op_mpool;
79         struct rte_mempool *session_mpool;
80         struct rte_mempool *session_priv_mpool;
81         struct rte_cryptodev_config conf;
82         struct rte_cryptodev_qp_conf qp_conf;
83
84         uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
85         uint8_t valid_dev_count;
86 };
87
88 struct crypto_unittest_params {
89         struct rte_crypto_sym_xform cipher_xform;
90         struct rte_crypto_sym_xform auth_xform;
91         struct rte_crypto_sym_xform aead_xform;
92 #ifdef RTE_LIB_SECURITY
93         struct rte_security_docsis_xform docsis_xform;
94 #endif
95
96         union {
97                 struct rte_cryptodev_sym_session *sess;
98 #ifdef RTE_LIB_SECURITY
99                 struct rte_security_session *sec_session;
100 #endif
101         };
102 #ifdef RTE_LIB_SECURITY
103         enum rte_security_session_action_type type;
104 #endif
105         struct rte_crypto_op *op;
106
107         struct rte_mbuf *obuf, *ibuf;
108
109         uint8_t *digest;
110 };
111
112 #define ALIGN_POW2_ROUNDUP(num, align) \
113         (((num) + (align) - 1) & ~((align) - 1))
114
115 /*
116  * Forward declarations.
117  */
118 static int
119 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
120                 struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
121                 uint8_t *hmac_key);
122
123 static int
124 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
125                 struct crypto_unittest_params *ut_params,
126                 struct crypto_testsuite_params *ts_param,
127                 const uint8_t *cipher,
128                 const uint8_t *digest,
129                 const uint8_t *iv);
130
131 static struct rte_mbuf *
132 setup_test_string(struct rte_mempool *mpool,
133                 const char *string, size_t len, uint8_t blocksize)
134 {
135         struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
136         size_t t_len = len - (blocksize ? (len % blocksize) : 0);
137
138         memset(m->buf_addr, 0, m->buf_len);
139         if (m) {
140                 char *dst = rte_pktmbuf_append(m, t_len);
141
142                 if (!dst) {
143                         rte_pktmbuf_free(m);
144                         return NULL;
145                 }
146                 if (string != NULL)
147                         rte_memcpy(dst, string, t_len);
148                 else
149                         memset(dst, 0, t_len);
150         }
151
152         return m;
153 }
154
155 /* Get number of bytes in X bits (rounding up) */
156 static uint32_t
157 ceil_byte_length(uint32_t num_bits)
158 {
159         if (num_bits % 8)
160                 return ((num_bits >> 3) + 1);
161         else
162                 return (num_bits >> 3);
163 }
164
165 static uint32_t
166 get_raw_dp_dequeue_count(void *user_data __rte_unused)
167 {
168         return 1;
169 }
170
171 static void
172 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,
173                 uint8_t is_op_success)
174 {
175         struct rte_crypto_op *op = user_data;
176         op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
177                         RTE_CRYPTO_OP_STATUS_ERROR;
178 }
179
180 void
181 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
182                 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
183                 uint8_t len_in_bits, uint8_t cipher_iv_len)
184 {
185         struct rte_crypto_sym_op *sop = op->sym;
186         struct rte_crypto_op *ret_op = NULL;
187         struct rte_crypto_vec data_vec[UINT8_MAX];
188         struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
189         union rte_crypto_sym_ofs ofs;
190         struct rte_crypto_sym_vec vec;
191         struct rte_crypto_sgl sgl;
192         uint32_t max_len;
193         union rte_cryptodev_session_ctx sess;
194         uint32_t count = 0;
195         struct rte_crypto_raw_dp_ctx *ctx;
196         uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
197                         auth_len = 0;
198         int32_t n;
199         uint32_t n_success;
200         int ctx_service_size;
201         int32_t status = 0;
202         int enqueue_status, dequeue_status;
203
204         ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
205         if (ctx_service_size < 0) {
206                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
207                 return;
208         }
209
210         ctx = malloc(ctx_service_size);
211         if (!ctx) {
212                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
213                 return;
214         }
215
216         /* Both are enums, setting crypto_sess will suit any session type */
217         sess.crypto_sess = op->sym->session;
218
219         if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
220                         op->sess_type, sess, 0) < 0) {
221                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
222                 goto exit;
223         }
224
225         cipher_iv.iova = 0;
226         cipher_iv.va = NULL;
227         aad_auth_iv.iova = 0;
228         aad_auth_iv.va = NULL;
229         digest.iova = 0;
230         digest.va = NULL;
231         sgl.vec = data_vec;
232         vec.num = 1;
233         vec.sgl = &sgl;
234         vec.iv = &cipher_iv;
235         vec.digest = &digest;
236         vec.aad = &aad_auth_iv;
237         vec.status = &status;
238
239         ofs.raw = 0;
240
241         if (is_cipher && is_auth) {
242                 cipher_offset = sop->cipher.data.offset;
243                 cipher_len = sop->cipher.data.length;
244                 auth_offset = sop->auth.data.offset;
245                 auth_len = sop->auth.data.length;
246                 max_len = RTE_MAX(cipher_offset + cipher_len,
247                                 auth_offset + auth_len);
248                 if (len_in_bits) {
249                         max_len = max_len >> 3;
250                         cipher_offset = cipher_offset >> 3;
251                         auth_offset = auth_offset >> 3;
252                         cipher_len = cipher_len >> 3;
253                         auth_len = auth_len >> 3;
254                 }
255                 ofs.ofs.cipher.head = cipher_offset;
256                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
257                 ofs.ofs.auth.head = auth_offset;
258                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
259                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
260                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
261                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
262                                 op, void *, IV_OFFSET + cipher_iv_len);
263                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
264                                 cipher_iv_len);
265                 digest.va = (void *)sop->auth.digest.data;
266                 digest.iova = sop->auth.digest.phys_addr;
267
268         } else if (is_cipher) {
269                 cipher_offset = sop->cipher.data.offset;
270                 cipher_len = sop->cipher.data.length;
271                 max_len = cipher_len + cipher_offset;
272                 if (len_in_bits) {
273                         max_len = max_len >> 3;
274                         cipher_offset = cipher_offset >> 3;
275                         cipher_len = cipher_len >> 3;
276                 }
277                 ofs.ofs.cipher.head = cipher_offset;
278                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
279                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
280                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
281
282         } else if (is_auth) {
283                 auth_offset = sop->auth.data.offset;
284                 auth_len = sop->auth.data.length;
285                 max_len = auth_len + auth_offset;
286                 if (len_in_bits) {
287                         max_len = max_len >> 3;
288                         auth_offset = auth_offset >> 3;
289                         auth_len = auth_len >> 3;
290                 }
291                 ofs.ofs.auth.head = auth_offset;
292                 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
293                 aad_auth_iv.va = rte_crypto_op_ctod_offset(
294                                 op, void *, IV_OFFSET + cipher_iv_len);
295                 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
296                                 cipher_iv_len);
297                 digest.va = (void *)sop->auth.digest.data;
298                 digest.iova = sop->auth.digest.phys_addr;
299
300         } else { /* aead */
301                 cipher_offset = sop->aead.data.offset;
302                 cipher_len = sop->aead.data.length;
303                 max_len = cipher_len + cipher_offset;
304                 if (len_in_bits) {
305                         max_len = max_len >> 3;
306                         cipher_offset = cipher_offset >> 3;
307                         cipher_len = cipher_len >> 3;
308                 }
309                 ofs.ofs.cipher.head = cipher_offset;
310                 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
311                 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
312                 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
313                 aad_auth_iv.va = (void *)sop->aead.aad.data;
314                 aad_auth_iv.iova = sop->aead.aad.phys_addr;
315                 digest.va = (void *)sop->aead.digest.data;
316                 digest.iova = sop->aead.digest.phys_addr;
317         }
318
319         n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
320                         data_vec, RTE_DIM(data_vec));
321         if (n < 0 || n > sop->m_src->nb_segs) {
322                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
323                 goto exit;
324         }
325
326         sgl.num = n;
327
328         if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
329                         &enqueue_status) < 1) {
330                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
331                 goto exit;
332         }
333
334         if (enqueue_status == 0) {
335                 status = rte_cryptodev_raw_enqueue_done(ctx, 1);
336                 if (status < 0) {
337                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
338                         goto exit;
339                 }
340         } else if (enqueue_status < 0) {
341                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
342                 goto exit;
343         }
344
345         n = n_success = 0;
346         while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
347                 n = rte_cryptodev_raw_dequeue_burst(ctx,
348                         get_raw_dp_dequeue_count, post_process_raw_dp_op,
349                                 (void **)&ret_op, 0, &n_success,
350                                 &dequeue_status);
351                 if (dequeue_status < 0) {
352                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
353                         goto exit;
354                 }
355                 if (n == 0)
356                         rte_pause();
357         }
358
359         if (n == 1 && dequeue_status == 0) {
360                 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
361                         op->status = RTE_CRYPTO_OP_STATUS_ERROR;
362                         goto exit;
363                 }
364         }
365
366         op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
367                         n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
368                                         RTE_CRYPTO_OP_STATUS_SUCCESS;
369
370 exit:
371         free(ctx);
372 }
373
374 static void
375 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
376 {
377         int32_t n, st;
378         struct rte_crypto_sym_op *sop;
379         union rte_crypto_sym_ofs ofs;
380         struct rte_crypto_sgl sgl;
381         struct rte_crypto_sym_vec symvec;
382         struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
383         struct rte_crypto_vec vec[UINT8_MAX];
384
385         sop = op->sym;
386
387         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
388                 sop->aead.data.length, vec, RTE_DIM(vec));
389
390         if (n < 0 || n != sop->m_src->nb_segs) {
391                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
392                 return;
393         }
394
395         sgl.vec = vec;
396         sgl.num = n;
397         symvec.sgl = &sgl;
398         symvec.iv = &iv_ptr;
399         symvec.digest = &digest_ptr;
400         symvec.aad = &aad_ptr;
401         symvec.status = &st;
402         symvec.num = 1;
403
404         /* for CPU crypto the IOVA address is not required */
405         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
406         digest_ptr.va = (void *)sop->aead.digest.data;
407         aad_ptr.va = (void *)sop->aead.aad.data;
408
409         ofs.raw = 0;
410
411         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
412                 &symvec);
413
414         if (n != 1)
415                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
416         else
417                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
418 }
419
420 static void
421 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
422 {
423         int32_t n, st;
424         struct rte_crypto_sym_op *sop;
425         union rte_crypto_sym_ofs ofs;
426         struct rte_crypto_sgl sgl;
427         struct rte_crypto_sym_vec symvec;
428         struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
429         struct rte_crypto_vec vec[UINT8_MAX];
430
431         sop = op->sym;
432
433         n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
434                 sop->auth.data.length, vec, RTE_DIM(vec));
435
436         if (n < 0 || n != sop->m_src->nb_segs) {
437                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
438                 return;
439         }
440
441         sgl.vec = vec;
442         sgl.num = n;
443         symvec.sgl = &sgl;
444         symvec.iv = &iv_ptr;
445         symvec.digest = &digest_ptr;
446         symvec.status = &st;
447         symvec.num = 1;
448
449         iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
450         digest_ptr.va = (void *)sop->auth.digest.data;
451
452         ofs.raw = 0;
453         ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
454         ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
455                 (sop->cipher.data.offset + sop->cipher.data.length);
456
457         n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
458                 &symvec);
459
460         if (n != 1)
461                 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
462         else
463                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
464 }
465
466 static struct rte_crypto_op *
467 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
468 {
469
470         RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
471
472         if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
473                 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
474                 return NULL;
475         }
476
477         op = NULL;
478
479         while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
480                 rte_pause();
481
482         if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
483                 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
484                 return NULL;
485         }
486
487         return op;
488 }
489
490 static struct crypto_testsuite_params testsuite_params = { NULL };
491 static struct crypto_unittest_params unittest_params;
492
493 static int
494 testsuite_setup(void)
495 {
496         struct crypto_testsuite_params *ts_params = &testsuite_params;
497         struct rte_cryptodev_info info;
498         uint32_t i = 0, nb_devs, dev_id;
499         int ret;
500         uint16_t qp_id;
501
502         memset(ts_params, 0, sizeof(*ts_params));
503
504         ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
505         if (ts_params->mbuf_pool == NULL) {
506                 /* Not already created so create */
507                 ts_params->mbuf_pool = rte_pktmbuf_pool_create(
508                                 "CRYPTO_MBUFPOOL",
509                                 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
510                                 rte_socket_id());
511                 if (ts_params->mbuf_pool == NULL) {
512                         RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
513                         return TEST_FAILED;
514                 }
515         }
516
517         ts_params->large_mbuf_pool = rte_mempool_lookup(
518                         "CRYPTO_LARGE_MBUFPOOL");
519         if (ts_params->large_mbuf_pool == NULL) {
520                 /* Not already created so create */
521                 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
522                                 "CRYPTO_LARGE_MBUFPOOL",
523                                 1, 0, 0, UINT16_MAX,
524                                 rte_socket_id());
525                 if (ts_params->large_mbuf_pool == NULL) {
526                         RTE_LOG(ERR, USER1,
527                                 "Can't create CRYPTO_LARGE_MBUFPOOL\n");
528                         return TEST_FAILED;
529                 }
530         }
531
532         ts_params->op_mpool = rte_crypto_op_pool_create(
533                         "MBUF_CRYPTO_SYM_OP_POOL",
534                         RTE_CRYPTO_OP_TYPE_SYMMETRIC,
535                         NUM_MBUFS, MBUF_CACHE_SIZE,
536                         DEFAULT_NUM_XFORMS *
537                         sizeof(struct rte_crypto_sym_xform) +
538                         MAXIMUM_IV_LENGTH,
539                         rte_socket_id());
540         if (ts_params->op_mpool == NULL) {
541                 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
542                 return TEST_FAILED;
543         }
544
545         /* Create an AESNI MB device if required */
546         if (gbl_driver_id == rte_cryptodev_driver_id_get(
547                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) {
548                 nb_devs = rte_cryptodev_device_count_by_driver(
549                                 rte_cryptodev_driver_id_get(
550                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
551                 if (nb_devs < 1) {
552                         ret = rte_vdev_init(
553                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);
554
555                         TEST_ASSERT(ret == 0,
556                                 "Failed to create instance of"
557                                 " pmd : %s",
558                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
559                 }
560         }
561
562         /* Create an AESNI GCM device if required */
563         if (gbl_driver_id == rte_cryptodev_driver_id_get(
564                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) {
565                 nb_devs = rte_cryptodev_device_count_by_driver(
566                                 rte_cryptodev_driver_id_get(
567                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)));
568                 if (nb_devs < 1) {
569                         TEST_ASSERT_SUCCESS(rte_vdev_init(
570                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL),
571                                 "Failed to create instance of"
572                                 " pmd : %s",
573                                 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
574                 }
575         }
576
577         /* Create a SNOW 3G device if required */
578         if (gbl_driver_id == rte_cryptodev_driver_id_get(
579                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) {
580                 nb_devs = rte_cryptodev_device_count_by_driver(
581                                 rte_cryptodev_driver_id_get(
582                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)));
583                 if (nb_devs < 1) {
584                         TEST_ASSERT_SUCCESS(rte_vdev_init(
585                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL),
586                                 "Failed to create instance of"
587                                 " pmd : %s",
588                                 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
589                 }
590         }
591
592         /* Create a KASUMI device if required */
593         if (gbl_driver_id == rte_cryptodev_driver_id_get(
594                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))) {
595                 nb_devs = rte_cryptodev_device_count_by_driver(
596                                 rte_cryptodev_driver_id_get(
597                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)));
598                 if (nb_devs < 1) {
599                         TEST_ASSERT_SUCCESS(rte_vdev_init(
600                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL),
601                                 "Failed to create instance of"
602                                 " pmd : %s",
603                                 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
604                 }
605         }
606
607         /* Create a ZUC device if required */
608         if (gbl_driver_id == rte_cryptodev_driver_id_get(
609                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) {
610                 nb_devs = rte_cryptodev_device_count_by_driver(
611                                 rte_cryptodev_driver_id_get(
612                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD)));
613                 if (nb_devs < 1) {
614                         TEST_ASSERT_SUCCESS(rte_vdev_init(
615                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL),
616                                 "Failed to create instance of"
617                                 " pmd : %s",
618                                 RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
619                 }
620         }
621
622         /* Create a NULL device if required */
623         if (gbl_driver_id == rte_cryptodev_driver_id_get(
624                         RTE_STR(CRYPTODEV_NAME_NULL_PMD))) {
625                 nb_devs = rte_cryptodev_device_count_by_driver(
626                                 rte_cryptodev_driver_id_get(
627                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD)));
628                 if (nb_devs < 1) {
629                         ret = rte_vdev_init(
630                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL);
631
632                         TEST_ASSERT(ret == 0,
633                                 "Failed to create instance of"
634                                 " pmd : %s",
635                                 RTE_STR(CRYPTODEV_NAME_NULL_PMD));
636                 }
637         }
638
639         /* Create an OPENSSL device if required */
640         if (gbl_driver_id == rte_cryptodev_driver_id_get(
641                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) {
642                 nb_devs = rte_cryptodev_device_count_by_driver(
643                                 rte_cryptodev_driver_id_get(
644                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)));
645                 if (nb_devs < 1) {
646                         ret = rte_vdev_init(
647                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),
648                                 NULL);
649
650                         TEST_ASSERT(ret == 0, "Failed to create "
651                                 "instance of pmd : %s",
652                                 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
653                 }
654         }
655
656         /* Create a ARMv8 device if required */
657         if (gbl_driver_id == rte_cryptodev_driver_id_get(
658                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) {
659                 nb_devs = rte_cryptodev_device_count_by_driver(
660                                 rte_cryptodev_driver_id_get(
661                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)));
662                 if (nb_devs < 1) {
663                         ret = rte_vdev_init(
664                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD),
665                                 NULL);
666
667                         TEST_ASSERT(ret == 0, "Failed to create "
668                                 "instance of pmd : %s",
669                                 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
670                 }
671         }
672
673         /* Create a MVSAM device if required */
674         if (gbl_driver_id == rte_cryptodev_driver_id_get(
675                         RTE_STR(CRYPTODEV_NAME_MVSAM_PMD))) {
676                 nb_devs = rte_cryptodev_device_count_by_driver(
677                                 rte_cryptodev_driver_id_get(
678                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)));
679                 if (nb_devs < 1) {
680                         ret = rte_vdev_init(
681                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD),
682                                 NULL);
683
684                         TEST_ASSERT(ret == 0, "Failed to create "
685                                 "instance of pmd : %s",
686                                 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
687                 }
688         }
689
690         /* Create an CCP device if required */
691         if (gbl_driver_id == rte_cryptodev_driver_id_get(
692                         RTE_STR(CRYPTODEV_NAME_CCP_PMD))) {
693                 nb_devs = rte_cryptodev_device_count_by_driver(
694                                 rte_cryptodev_driver_id_get(
695                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD)));
696                 if (nb_devs < 1) {
697                         ret = rte_vdev_init(
698                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD),
699                                 NULL);
700
701                         TEST_ASSERT(ret == 0, "Failed to create "
702                                 "instance of pmd : %s",
703                                 RTE_STR(CRYPTODEV_NAME_CCP_PMD));
704                 }
705         }
706
707 #ifdef RTE_CRYPTO_SCHEDULER
708         char vdev_args[VDEV_ARGS_SIZE] = {""};
709         char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
710                 "ordering=enable,name=cryptodev_test_scheduler,corelist="};
711         uint16_t worker_core_count = 0;
712         uint16_t socket_id = 0;
713
714         if (gbl_driver_id == rte_cryptodev_driver_id_get(
715                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
716
717                 /* Identify the Worker Cores
718                  * Use 2 worker cores for the device args
719                  */
720                 RTE_LCORE_FOREACH_WORKER(i) {
721                         if (worker_core_count > 1)
722                                 break;
723                         snprintf(vdev_args, sizeof(vdev_args),
724                                         "%s%d", temp_str, i);
725                         strcpy(temp_str, vdev_args);
726                         strlcat(temp_str, ";", sizeof(temp_str));
727                         worker_core_count++;
728                         socket_id = rte_lcore_to_socket_id(i);
729                 }
730                 if (worker_core_count != 2) {
731                         RTE_LOG(ERR, USER1,
732                                 "Cryptodev scheduler test require at least "
733                                 "two worker cores to run. "
734                                 "Please use the correct coremask.\n");
735                         return TEST_FAILED;
736                 }
737                 strcpy(temp_str, vdev_args);
738                 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
739                                 temp_str, socket_id);
740                 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
741                 nb_devs = rte_cryptodev_device_count_by_driver(
742                                 rte_cryptodev_driver_id_get(
743                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
744                 if (nb_devs < 1) {
745                         ret = rte_vdev_init(
746                                 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
747                                         vdev_args);
748                         TEST_ASSERT(ret == 0,
749                                 "Failed to create instance %u of"
750                                 " pmd : %s",
751                                 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
752                 }
753         }
754 #endif /* RTE_CRYPTO_SCHEDULER */
755
756         nb_devs = rte_cryptodev_count();
757         if (nb_devs < 1) {
758                 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
759                 return TEST_SKIPPED;
760         }
761
762         /* Create list of valid crypto devs */
763         for (i = 0; i < nb_devs; i++) {
764                 rte_cryptodev_info_get(i, &info);
765                 if (info.driver_id == gbl_driver_id)
766                         ts_params->valid_devs[ts_params->valid_dev_count++] = i;
767         }
768
769         if (ts_params->valid_dev_count < 1)
770                 return TEST_FAILED;
771
772         /* Set up all the qps on the first of the valid devices found */
773
774         dev_id = ts_params->valid_devs[0];
775
776         rte_cryptodev_info_get(dev_id, &info);
777
778         ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
779         ts_params->conf.socket_id = SOCKET_ID_ANY;
780         ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
781
782         unsigned int session_size =
783                 rte_cryptodev_sym_get_private_session_size(dev_id);
784
785 #ifdef RTE_LIB_SECURITY
786         unsigned int security_session_size = rte_security_session_get_size(
787                         rte_cryptodev_get_sec_ctx(dev_id));
788
789         if (session_size < security_session_size)
790                 session_size = security_session_size;
791 #endif
792         /*
793          * Create mempool with maximum number of sessions.
794          */
795         if (info.sym.max_nb_sessions != 0 &&
796                         info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
797                 RTE_LOG(ERR, USER1, "Device does not support "
798                                 "at least %u sessions\n",
799                                 MAX_NB_SESSIONS);
800                 return TEST_FAILED;
801         }
802
803         ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
804                         "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
805                         SOCKET_ID_ANY);
806         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
807                         "session mempool allocation failed");
808
809         ts_params->session_priv_mpool = rte_mempool_create(
810                         "test_sess_mp_priv",
811                         MAX_NB_SESSIONS,
812                         session_size,
813                         0, 0, NULL, NULL, NULL,
814                         NULL, SOCKET_ID_ANY,
815                         0);
816         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
817                         "session mempool allocation failed");
818
819
820
821         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
822                         &ts_params->conf),
823                         "Failed to configure cryptodev %u with %u qps",
824                         dev_id, ts_params->conf.nb_queue_pairs);
825
826         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
827         ts_params->qp_conf.mp_session = ts_params->session_mpool;
828         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
829
830         for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
831                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
832                         dev_id, qp_id, &ts_params->qp_conf,
833                         rte_cryptodev_socket_id(dev_id)),
834                         "Failed to setup queue pair %u on cryptodev %u",
835                         qp_id, dev_id);
836         }
837
838         return TEST_SUCCESS;
839 }
840
841 static void
842 testsuite_teardown(void)
843 {
844         struct crypto_testsuite_params *ts_params = &testsuite_params;
845
846         if (ts_params->mbuf_pool != NULL) {
847                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
848                 rte_mempool_avail_count(ts_params->mbuf_pool));
849         }
850
851         if (ts_params->op_mpool != NULL) {
852                 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
853                 rte_mempool_avail_count(ts_params->op_mpool));
854         }
855
856         /* Free session mempools */
857         if (ts_params->session_priv_mpool != NULL) {
858                 rte_mempool_free(ts_params->session_priv_mpool);
859                 ts_params->session_priv_mpool = NULL;
860         }
861
862         if (ts_params->session_mpool != NULL) {
863                 rte_mempool_free(ts_params->session_mpool);
864                 ts_params->session_mpool = NULL;
865         }
866 }
867
868 static int
869 dev_configure_and_start(uint64_t ff_disable)
870 {
871         struct crypto_testsuite_params *ts_params = &testsuite_params;
872         struct crypto_unittest_params *ut_params = &unittest_params;
873
874         uint16_t qp_id;
875
876         /* Clear unit test parameters before running test */
877         memset(ut_params, 0, sizeof(*ut_params));
878
879         /* Reconfigure device to default parameters */
880         ts_params->conf.socket_id = SOCKET_ID_ANY;
881         ts_params->conf.ff_disable = ff_disable;
882         ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
883         ts_params->qp_conf.mp_session = ts_params->session_mpool;
884         ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
885
886         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
887                         &ts_params->conf),
888                         "Failed to configure cryptodev %u",
889                         ts_params->valid_devs[0]);
890
891         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
892                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
893                         ts_params->valid_devs[0], qp_id,
894                         &ts_params->qp_conf,
895                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
896                         "Failed to setup queue pair %u on cryptodev %u",
897                         qp_id, ts_params->valid_devs[0]);
898         }
899
900
901         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
902
903         /* Start the device */
904         TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
905                         "Failed to start cryptodev %u",
906                         ts_params->valid_devs[0]);
907
908         return TEST_SUCCESS;
909 }
910
911 static int
912 ut_setup(void)
913 {
914         /* Configure and start the device with security feature disabled */
915         return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
916 }
917
918 static int
919 ut_setup_security(void)
920 {
921         /* Configure and start the device with no features disabled */
922         return dev_configure_and_start(0);
923 }
924
925 static void
926 ut_teardown(void)
927 {
928         struct crypto_testsuite_params *ts_params = &testsuite_params;
929         struct crypto_unittest_params *ut_params = &unittest_params;
930         struct rte_cryptodev_stats stats;
931
932         /* free crypto session structure */
933 #ifdef RTE_LIB_SECURITY
934         if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
935                 if (ut_params->sec_session) {
936                         rte_security_session_destroy(rte_cryptodev_get_sec_ctx
937                                                 (ts_params->valid_devs[0]),
938                                                 ut_params->sec_session);
939                         ut_params->sec_session = NULL;
940                 }
941         } else
942 #endif
943         {
944                 if (ut_params->sess) {
945                         rte_cryptodev_sym_session_clear(
946                                         ts_params->valid_devs[0],
947                                         ut_params->sess);
948                         rte_cryptodev_sym_session_free(ut_params->sess);
949                         ut_params->sess = NULL;
950                 }
951         }
952
953         /* free crypto operation structure */
954         if (ut_params->op)
955                 rte_crypto_op_free(ut_params->op);
956
957         /*
958          * free mbuf - both obuf and ibuf are usually the same,
959          * so check if they point at the same address is necessary,
960          * to avoid freeing the mbuf twice.
961          */
962         if (ut_params->obuf) {
963                 rte_pktmbuf_free(ut_params->obuf);
964                 if (ut_params->ibuf == ut_params->obuf)
965                         ut_params->ibuf = 0;
966                 ut_params->obuf = 0;
967         }
968         if (ut_params->ibuf) {
969                 rte_pktmbuf_free(ut_params->ibuf);
970                 ut_params->ibuf = 0;
971         }
972
973         if (ts_params->mbuf_pool != NULL)
974                 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
975                         rte_mempool_avail_count(ts_params->mbuf_pool));
976
977         rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
978
979         /* Stop the device */
980         rte_cryptodev_stop(ts_params->valid_devs[0]);
981 }
982
983 static int
984 test_device_configure_invalid_dev_id(void)
985 {
986         struct crypto_testsuite_params *ts_params = &testsuite_params;
987         uint16_t dev_id, num_devs = 0;
988
989         TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
990                         "Need at least %d devices for test", 1);
991
992         /* valid dev_id values */
993         dev_id = ts_params->valid_devs[0];
994
995         /* Stop the device in case it's started so it can be configured */
996         rte_cryptodev_stop(dev_id);
997
998         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
999                         "Failed test for rte_cryptodev_configure: "
1000                         "invalid dev_num %u", dev_id);
1001
1002         /* invalid dev_id values */
1003         dev_id = num_devs;
1004
1005         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1006                         "Failed test for rte_cryptodev_configure: "
1007                         "invalid dev_num %u", dev_id);
1008
1009         dev_id = 0xff;
1010
1011         TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1012                         "Failed test for rte_cryptodev_configure:"
1013                         "invalid dev_num %u", dev_id);
1014
1015         return TEST_SUCCESS;
1016 }
1017
1018 static int
1019 test_device_configure_invalid_queue_pair_ids(void)
1020 {
1021         struct crypto_testsuite_params *ts_params = &testsuite_params;
1022         uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1023
1024         /* Stop the device in case it's started so it can be configured */
1025         rte_cryptodev_stop(ts_params->valid_devs[0]);
1026
1027         /* valid - max value queue pairs */
1028         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1029
1030         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1031                         &ts_params->conf),
1032                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1033                         ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1034
1035         /* valid - one queue pairs */
1036         ts_params->conf.nb_queue_pairs = 1;
1037
1038         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1039                         &ts_params->conf),
1040                         "Failed to configure cryptodev: dev_id %u, qp_id %u",
1041                         ts_params->valid_devs[0],
1042                         ts_params->conf.nb_queue_pairs);
1043
1044
1045         /* invalid - zero queue pairs */
1046         ts_params->conf.nb_queue_pairs = 0;
1047
1048         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1049                         &ts_params->conf),
1050                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1051                         " invalid qps: %u",
1052                         ts_params->valid_devs[0],
1053                         ts_params->conf.nb_queue_pairs);
1054
1055
1056         /* invalid - max value supported by field queue pairs */
1057         ts_params->conf.nb_queue_pairs = UINT16_MAX;
1058
1059         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1060                         &ts_params->conf),
1061                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1062                         " invalid qps: %u",
1063                         ts_params->valid_devs[0],
1064                         ts_params->conf.nb_queue_pairs);
1065
1066
1067         /* invalid - max value + 1 queue pairs */
1068         ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1069
1070         TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1071                         &ts_params->conf),
1072                         "Failed test for rte_cryptodev_configure, dev_id %u,"
1073                         " invalid qps: %u",
1074                         ts_params->valid_devs[0],
1075                         ts_params->conf.nb_queue_pairs);
1076
1077         /* revert to original testsuite value */
1078         ts_params->conf.nb_queue_pairs = orig_nb_qps;
1079
1080         return TEST_SUCCESS;
1081 }
1082
1083 static int
1084 test_queue_pair_descriptor_setup(void)
1085 {
1086         struct crypto_testsuite_params *ts_params = &testsuite_params;
1087         struct rte_cryptodev_qp_conf qp_conf = {
1088                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
1089         };
1090         uint16_t qp_id;
1091
1092         /* Stop the device in case it's started so it can be configured */
1093         rte_cryptodev_stop(ts_params->valid_devs[0]);
1094
1095         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1096                         &ts_params->conf),
1097                         "Failed to configure cryptodev %u",
1098                         ts_params->valid_devs[0]);
1099
1100         /*
1101          * Test various ring sizes on this device. memzones can't be
1102          * freed so are re-used if ring is released and re-created.
1103          */
1104         qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1105         qp_conf.mp_session = ts_params->session_mpool;
1106         qp_conf.mp_session_private = ts_params->session_priv_mpool;
1107
1108         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1109                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1110                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1111                                 rte_cryptodev_socket_id(
1112                                                 ts_params->valid_devs[0])),
1113                                 "Failed test for "
1114                                 "rte_cryptodev_queue_pair_setup: num_inflights "
1115                                 "%u on qp %u on cryptodev %u",
1116                                 qp_conf.nb_descriptors, qp_id,
1117                                 ts_params->valid_devs[0]);
1118         }
1119
1120         qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1121
1122         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1123                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1124                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1125                                 rte_cryptodev_socket_id(
1126                                                 ts_params->valid_devs[0])),
1127                                 "Failed test for"
1128                                 " rte_cryptodev_queue_pair_setup: num_inflights"
1129                                 " %u on qp %u on cryptodev %u",
1130                                 qp_conf.nb_descriptors, qp_id,
1131                                 ts_params->valid_devs[0]);
1132         }
1133
1134         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1135
1136         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1137                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1138                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1139                                 rte_cryptodev_socket_id(
1140                                                 ts_params->valid_devs[0])),
1141                                 "Failed test for "
1142                                 "rte_cryptodev_queue_pair_setup: num_inflights"
1143                                 " %u on qp %u on cryptodev %u",
1144                                 qp_conf.nb_descriptors, qp_id,
1145                                 ts_params->valid_devs[0]);
1146         }
1147
1148         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1149
1150         for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1151                 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1152                                 ts_params->valid_devs[0], qp_id, &qp_conf,
1153                                 rte_cryptodev_socket_id(
1154                                                 ts_params->valid_devs[0])),
1155                                 "Failed test for"
1156                                 " rte_cryptodev_queue_pair_setup:"
1157                                 "num_inflights %u on qp %u on cryptodev %u",
1158                                 qp_conf.nb_descriptors, qp_id,
1159                                 ts_params->valid_devs[0]);
1160         }
1161
1162         /* test invalid queue pair id */
1163         qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;      /*valid */
1164
1165         qp_id = ts_params->conf.nb_queue_pairs;         /*invalid */
1166
1167         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1168                         ts_params->valid_devs[0],
1169                         qp_id, &qp_conf,
1170                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1171                         "Failed test for rte_cryptodev_queue_pair_setup:"
1172                         "invalid qp %u on cryptodev %u",
1173                         qp_id, ts_params->valid_devs[0]);
1174
1175         qp_id = 0xffff; /*invalid*/
1176
1177         TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1178                         ts_params->valid_devs[0],
1179                         qp_id, &qp_conf,
1180                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1181                         "Failed test for rte_cryptodev_queue_pair_setup:"
1182                         "invalid qp %u on cryptodev %u",
1183                         qp_id, ts_params->valid_devs[0]);
1184
1185         return TEST_SUCCESS;
1186 }
1187
1188 /* ***** Plaintext data for tests ***** */
1189
1190 const char catch_22_quote_1[] =
1191                 "There was only one catch and that was Catch-22, which "
1192                 "specified that a concern for one's safety in the face of "
1193                 "dangers that were real and immediate was the process of a "
1194                 "rational mind. Orr was crazy and could be grounded. All he "
1195                 "had to do was ask; and as soon as he did, he would no longer "
1196                 "be crazy and would have to fly more missions. Orr would be "
1197                 "crazy to fly more missions and sane if he didn't, but if he "
1198                 "was sane he had to fly them. If he flew them he was crazy "
1199                 "and didn't have to; but if he didn't want to he was sane and "
1200                 "had to. Yossarian was moved very deeply by the absolute "
1201                 "simplicity of this clause of Catch-22 and let out a "
1202                 "respectful whistle. \"That's some catch, that Catch-22\", he "
1203                 "observed. \"It's the best there is,\" Doc Daneeka agreed.";
1204
1205 const char catch_22_quote[] =
1206                 "What a lousy earth! He wondered how many people were "
1207                 "destitute that same night even in his own prosperous country, "
1208                 "how many homes were shanties, how many husbands were drunk "
1209                 "and wives socked, and how many children were bullied, abused, "
1210                 "or abandoned. How many families hungered for food they could "
1211                 "not afford to buy? How many hearts were broken? How many "
1212                 "suicides would take place that same night, how many people "
1213                 "would go insane? How many cockroaches and landlords would "
1214                 "triumph? How many winners were losers, successes failures, "
1215                 "and rich men poor men? How many wise guys were stupid? How "
1216                 "many happy endings were unhappy endings? How many honest men "
1217                 "were liars, brave men cowards, loyal men traitors, how many "
1218                 "sainted men were corrupt, how many people in positions of "
1219                 "trust had sold their souls to bodyguards, how many had never "
1220                 "had souls? How many straight-and-narrow paths were crooked "
1221                 "paths? How many best families were worst families and how "
1222                 "many good people were bad people? When you added them all up "
1223                 "and then subtracted, you might be left with only the children, "
1224                 "and perhaps with Albert Einstein and an old violinist or "
1225                 "sculptor somewhere.";
1226
1227 #define QUOTE_480_BYTES         (480)
1228 #define QUOTE_512_BYTES         (512)
1229 #define QUOTE_768_BYTES         (768)
1230 #define QUOTE_1024_BYTES        (1024)
1231
1232
1233
1234 /* ***** SHA1 Hash Tests ***** */
1235
1236 #define HMAC_KEY_LENGTH_SHA1    (DIGEST_BYTE_LENGTH_SHA1)
1237
1238 static uint8_t hmac_sha1_key[] = {
1239         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1240         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1241         0xDE, 0xF4, 0xDE, 0xAD };
1242
1243 /* ***** SHA224 Hash Tests ***** */
1244
1245 #define HMAC_KEY_LENGTH_SHA224  (DIGEST_BYTE_LENGTH_SHA224)
1246
1247
1248 /* ***** AES-CBC Cipher Tests ***** */
1249
1250 #define CIPHER_KEY_LENGTH_AES_CBC       (16)
1251 #define CIPHER_IV_LENGTH_AES_CBC        (CIPHER_KEY_LENGTH_AES_CBC)
1252
1253 static uint8_t aes_cbc_key[] = {
1254         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1255         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1256
1257 static uint8_t aes_cbc_iv[] = {
1258         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1259         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1260
1261
1262 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1263
1264 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1265         0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1266         0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1267         0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1268         0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1269         0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1270         0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1271         0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1272         0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1273         0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1274         0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1275         0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1276         0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1277         0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1278         0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1279         0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1280         0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1281         0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1282         0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1283         0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1284         0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1285         0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1286         0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1287         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1288         0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1289         0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1290         0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1291         0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1292         0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1293         0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1294         0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1295         0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1296         0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1297         0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1298         0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1299         0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1300         0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1301         0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1302         0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1303         0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1304         0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1305         0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1306         0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1307         0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1308         0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1309         0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1310         0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1311         0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1312         0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1313         0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1314         0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1315         0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1316         0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1317         0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1318         0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1319         0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1320         0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1321         0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1322         0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1323         0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1324         0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1325         0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1326         0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1327         0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1328         0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1329 };
1330
1331 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1332         0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1333         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1334         0x18, 0x8c, 0x1d, 0x32
1335 };
1336
1337
1338 /* Multisession Vector context Test */
1339 /*Begin Session 0 */
1340 static uint8_t ms_aes_cbc_key0[] = {
1341         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1342         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1343 };
1344
1345 static uint8_t ms_aes_cbc_iv0[] = {
1346         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1347         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1348 };
1349
1350 static const uint8_t ms_aes_cbc_cipher0[] = {
1351                 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1352                 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1353                 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1354                 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1355                 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1356                 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1357                 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1358                 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1359                 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1360                 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1361                 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1362                 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1363                 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1364                 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1365                 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1366                 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1367                 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1368                 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1369                 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1370                 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1371                 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1372                 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1373                 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1374                 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1375                 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1376                 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1377                 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1378                 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1379                 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1380                 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1381                 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1382                 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1383                 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1384                 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1385                 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1386                 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1387                 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1388                 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1389                 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1390                 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1391                 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1392                 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1393                 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1394                 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1395                 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1396                 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1397                 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1398                 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1399                 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1400                 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1401                 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1402                 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1403                 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1404                 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1405                 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1406                 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1407                 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1408                 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1409                 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1410                 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1411                 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1412                 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1413                 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1414                 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1415 };
1416
1417
1418 static  uint8_t ms_hmac_key0[] = {
1419                 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1420                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1421                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1422                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1423                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1424                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1425                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1426                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1427 };
1428
1429 static const uint8_t ms_hmac_digest0[] = {
1430                 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1431                 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1432                 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1433                 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1434                 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1435                 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1436                 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1437                 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1438                 };
1439
1440 /* End Session 0 */
1441 /* Begin session 1 */
1442
1443 static  uint8_t ms_aes_cbc_key1[] = {
1444                 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1445                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1446 };
1447
1448 static  uint8_t ms_aes_cbc_iv1[] = {
1449         0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1450         0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1451 };
1452
1453 static const uint8_t ms_aes_cbc_cipher1[] = {
1454                 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1455                 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1456                 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1457                 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1458                 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1459                 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1460                 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1461                 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1462                 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1463                 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1464                 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1465                 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1466                 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1467                 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1468                 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1469                 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1470                 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1471                 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1472                 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1473                 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1474                 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1475                 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1476                 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1477                 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1478                 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1479                 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1480                 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1481                 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1482                 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1483                 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1484                 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1485                 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1486                 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1487                 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1488                 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1489                 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1490                 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1491                 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1492                 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1493                 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1494                 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1495                 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1496                 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1497                 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1498                 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1499                 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1500                 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1501                 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1502                 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1503                 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1504                 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1505                 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1506                 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1507                 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1508                 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1509                 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1510                 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1511                 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1512                 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1513                 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1514                 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1515                 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1516                 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1517                 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1518
1519 };
1520
1521 static uint8_t ms_hmac_key1[] = {
1522                 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1523                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1524                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1525                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1526                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1527                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1528                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1529                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1530 };
1531
1532 static const uint8_t ms_hmac_digest1[] = {
1533                 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1534                 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1535                 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1536                 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1537                 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1538                 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1539                 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1540                 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1541 };
1542 /* End Session 1  */
1543 /* Begin Session 2 */
1544 static  uint8_t ms_aes_cbc_key2[] = {
1545                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1546                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1547 };
1548
1549 static  uint8_t ms_aes_cbc_iv2[] = {
1550                 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1551                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1552 };
1553
1554 static const uint8_t ms_aes_cbc_cipher2[] = {
1555                 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
1556                 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
1557                 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
1558                 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
1559                 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
1560                 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
1561                 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
1562                 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
1563                 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
1564                 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
1565                 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
1566                 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
1567                 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
1568                 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
1569                 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
1570                 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
1571                 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
1572                 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
1573                 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
1574                 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
1575                 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
1576                 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
1577                 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
1578                 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
1579                 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
1580                 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
1581                 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
1582                 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
1583                 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
1584                 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
1585                 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
1586                 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
1587                 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
1588                 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
1589                 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
1590                 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
1591                 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
1592                 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
1593                 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
1594                 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
1595                 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
1596                 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
1597                 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
1598                 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
1599                 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
1600                 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
1601                 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
1602                 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
1603                 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
1604                 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
1605                 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
1606                 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
1607                 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
1608                 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
1609                 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
1610                 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
1611                 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
1612                 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
1613                 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
1614                 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
1615                 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
1616                 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
1617                 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
1618                 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
1619 };
1620
1621 static  uint8_t ms_hmac_key2[] = {
1622                 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1623                 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1624                 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1625                 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1626                 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1627                 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1628                 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1629                 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1630 };
1631
1632 static const uint8_t ms_hmac_digest2[] = {
1633                 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
1634                 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
1635                 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
1636                 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
1637                 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
1638                 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
1639                 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
1640                 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
1641 };
1642
1643 /* End Session 2 */
1644
1645
1646 static int
1647 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
1648 {
1649         struct crypto_testsuite_params *ts_params = &testsuite_params;
1650         struct crypto_unittest_params *ut_params = &unittest_params;
1651
1652         /* Verify the capabilities */
1653         struct rte_cryptodev_sym_capability_idx cap_idx;
1654         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1655         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
1656         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1657                         &cap_idx) == NULL)
1658                 return -ENOTSUP;
1659         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1660         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
1661         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1662                         &cap_idx) == NULL)
1663                 return -ENOTSUP;
1664
1665         /* Generate test mbuf data and space for digest */
1666         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1667                         catch_22_quote, QUOTE_512_BYTES, 0);
1668
1669         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1670                         DIGEST_BYTE_LENGTH_SHA1);
1671         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1672
1673         /* Setup Cipher Parameters */
1674         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1675         ut_params->cipher_xform.next = &ut_params->auth_xform;
1676
1677         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1678         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
1679         ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
1680         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1681         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1682         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1683
1684         /* Setup HMAC Parameters */
1685         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1686
1687         ut_params->auth_xform.next = NULL;
1688
1689         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
1690         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
1691         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
1692         ut_params->auth_xform.auth.key.data = hmac_sha1_key;
1693         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
1694
1695         ut_params->sess = rte_cryptodev_sym_session_create(
1696                         ts_params->session_mpool);
1697
1698         /* Create crypto session*/
1699         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
1700                         ut_params->sess, &ut_params->cipher_xform,
1701                         ts_params->session_priv_mpool);
1702         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1703
1704         /* Generate crypto op data structure */
1705         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1706                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1707         TEST_ASSERT_NOT_NULL(ut_params->op,
1708                         "Failed to allocate symmetric crypto operation struct");
1709
1710         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1711
1712         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1713
1714         /* set crypto operation source mbuf */
1715         sym_op->m_src = ut_params->ibuf;
1716
1717         /* Set crypto operation authentication parameters */
1718         sym_op->auth.digest.data = ut_params->digest;
1719         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1720                         ut_params->ibuf, QUOTE_512_BYTES);
1721
1722         sym_op->auth.data.offset = 0;
1723         sym_op->auth.data.length = QUOTE_512_BYTES;
1724
1725         /* Copy IV at the end of the crypto operation */
1726         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1727                         aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
1728
1729         /* Set crypto operation cipher parameters */
1730         sym_op->cipher.data.offset = 0;
1731         sym_op->cipher.data.length = QUOTE_512_BYTES;
1732
1733         /* Process crypto operation */
1734         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1735                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1736                         ut_params->op);
1737         else
1738                 TEST_ASSERT_NOT_NULL(
1739                         process_crypto_request(ts_params->valid_devs[0],
1740                                 ut_params->op),
1741                                 "failed to process sym crypto op");
1742
1743         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1744                         "crypto op processing failed");
1745
1746         /* Validate obuf */
1747         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
1748                         uint8_t *);
1749
1750         TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
1751                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
1752                         QUOTE_512_BYTES,
1753                         "ciphertext data not as expected");
1754
1755         uint8_t *digest = ciphertext + QUOTE_512_BYTES;
1756
1757         TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
1758                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
1759                         gbl_driver_id == rte_cryptodev_driver_id_get(
1760                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
1761                                         TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
1762                                         DIGEST_BYTE_LENGTH_SHA1,
1763                         "Generated digest data not as expected");
1764
1765         return TEST_SUCCESS;
1766 }
1767
1768 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
1769
1770 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
1771
1772 static uint8_t hmac_sha512_key[] = {
1773         0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1774         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1775         0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1776         0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
1777         0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
1778         0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1779         0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
1780         0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
1781
1782 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
1783         0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
1784         0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
1785         0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
1786         0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
1787         0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
1788         0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
1789         0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
1790         0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
1791
1792
1793
1794 static int
1795 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1796                 struct crypto_unittest_params *ut_params,
1797                 uint8_t *cipher_key,
1798                 uint8_t *hmac_key);
1799
1800 static int
1801 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1802                 struct crypto_unittest_params *ut_params,
1803                 struct crypto_testsuite_params *ts_params,
1804                 const uint8_t *cipher,
1805                 const uint8_t *digest,
1806                 const uint8_t *iv);
1807
1808
1809 static int
1810 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1811                 struct crypto_unittest_params *ut_params,
1812                 uint8_t *cipher_key,
1813                 uint8_t *hmac_key)
1814 {
1815
1816         /* Setup Cipher Parameters */
1817         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1818         ut_params->cipher_xform.next = NULL;
1819
1820         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1821         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
1822         ut_params->cipher_xform.cipher.key.data = cipher_key;
1823         ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1824         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1825         ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1826
1827         /* Setup HMAC Parameters */
1828         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1829         ut_params->auth_xform.next = &ut_params->cipher_xform;
1830
1831         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
1832         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
1833         ut_params->auth_xform.auth.key.data = hmac_key;
1834         ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
1835         ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
1836
1837         return TEST_SUCCESS;
1838 }
1839
1840
1841 static int
1842 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1843                 struct crypto_unittest_params *ut_params,
1844                 struct crypto_testsuite_params *ts_params,
1845                 const uint8_t *cipher,
1846                 const uint8_t *digest,
1847                 const uint8_t *iv)
1848 {
1849         /* Generate test mbuf data and digest */
1850         ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1851                         (const char *)
1852                         cipher,
1853                         QUOTE_512_BYTES, 0);
1854
1855         ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1856                         DIGEST_BYTE_LENGTH_SHA512);
1857         TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1858
1859         rte_memcpy(ut_params->digest,
1860                         digest,
1861                         DIGEST_BYTE_LENGTH_SHA512);
1862
1863         /* Generate Crypto op data structure */
1864         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1865                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1866         TEST_ASSERT_NOT_NULL(ut_params->op,
1867                         "Failed to allocate symmetric crypto operation struct");
1868
1869         rte_crypto_op_attach_sym_session(ut_params->op, sess);
1870
1871         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1872
1873         /* set crypto operation source mbuf */
1874         sym_op->m_src = ut_params->ibuf;
1875
1876         sym_op->auth.digest.data = ut_params->digest;
1877         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1878                         ut_params->ibuf, QUOTE_512_BYTES);
1879
1880         sym_op->auth.data.offset = 0;
1881         sym_op->auth.data.length = QUOTE_512_BYTES;
1882
1883         /* Copy IV at the end of the crypto operation */
1884         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1885                         iv, CIPHER_IV_LENGTH_AES_CBC);
1886
1887         sym_op->cipher.data.offset = 0;
1888         sym_op->cipher.data.length = QUOTE_512_BYTES;
1889
1890         /* Process crypto operation */
1891         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1892                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1893                         ut_params->op);
1894         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1895                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
1896                                 ut_params->op, 1, 1, 0, 0);
1897         else
1898                 TEST_ASSERT_NOT_NULL(
1899                                 process_crypto_request(ts_params->valid_devs[0],
1900                                         ut_params->op),
1901                                         "failed to process sym crypto op");
1902
1903         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1904                         "crypto op processing failed");
1905
1906         ut_params->obuf = ut_params->op->sym->m_src;
1907
1908         /* Validate obuf */
1909         TEST_ASSERT_BUFFERS_ARE_EQUAL(
1910                         rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
1911                         catch_22_quote,
1912                         QUOTE_512_BYTES,
1913                         "Plaintext data not as expected");
1914
1915         /* Validate obuf */
1916         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1917                         "Digest verification failed");
1918
1919         return TEST_SUCCESS;
1920 }
1921
1922 static int
1923 test_blockcipher(enum blockcipher_test_type test_type)
1924 {
1925         struct crypto_testsuite_params *ts_params = &testsuite_params;
1926         int status;
1927
1928         status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1929                 ts_params->op_mpool,
1930                 ts_params->session_mpool, ts_params->session_priv_mpool,
1931                 ts_params->valid_devs[0],
1932                 test_type);
1933
1934         if (status == -ENOTSUP)
1935                 return status;
1936
1937         TEST_ASSERT_EQUAL(status, 0, "Test failed");
1938
1939         return TEST_SUCCESS;
1940 }
1941
1942 static int
1943 test_AES_cipheronly_all(void)
1944 {
1945         return test_blockcipher(BLKCIPHER_AES_CIPHERONLY_TYPE);
1946 }
1947
1948 static int
1949 test_AES_docsis_all(void)
1950 {
1951         /* Data-path service does not support DOCSIS yet */
1952         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1953                 return -ENOTSUP;
1954         return test_blockcipher(BLKCIPHER_AES_DOCSIS_TYPE);
1955 }
1956
1957 static int
1958 test_DES_docsis_all(void)
1959 {
1960         /* Data-path service does not support DOCSIS yet */
1961         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1962                 return -ENOTSUP;
1963         return test_blockcipher(BLKCIPHER_DES_DOCSIS_TYPE);
1964 }
1965
1966 static int
1967 test_DES_cipheronly_all(void)
1968 {
1969         return test_blockcipher(BLKCIPHER_DES_CIPHERONLY_TYPE);
1970 }
1971
1972 static int
1973 test_authonly_all(void)
1974 {
1975         return test_blockcipher(BLKCIPHER_AUTHONLY_TYPE);
1976 }
1977
1978 static int
1979 test_AES_chain_all(void)
1980 {
1981         return test_blockcipher(BLKCIPHER_AES_CHAIN_TYPE);
1982 }
1983
1984 static int
1985 test_3DES_chain_all(void)
1986 {
1987         return test_blockcipher(BLKCIPHER_3DES_CHAIN_TYPE);
1988 }
1989
1990 static int
1991 test_3DES_cipheronly_all(void)
1992 {
1993         return test_blockcipher(BLKCIPHER_3DES_CIPHERONLY_TYPE);
1994 }
1995
1996 /* ***** SNOW 3G Tests ***** */
1997 static int
1998 create_wireless_algo_hash_session(uint8_t dev_id,
1999         const uint8_t *key, const uint8_t key_len,
2000         const uint8_t iv_len, const uint8_t auth_len,
2001         enum rte_crypto_auth_operation op,
2002         enum rte_crypto_auth_algorithm algo)
2003 {
2004         uint8_t hash_key[key_len];
2005         int status;
2006
2007         struct crypto_testsuite_params *ts_params = &testsuite_params;
2008         struct crypto_unittest_params *ut_params = &unittest_params;
2009
2010         memcpy(hash_key, key, key_len);
2011
2012         debug_hexdump(stdout, "key:", key, key_len);
2013
2014         /* Setup Authentication Parameters */
2015         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2016         ut_params->auth_xform.next = NULL;
2017
2018         ut_params->auth_xform.auth.op = op;
2019         ut_params->auth_xform.auth.algo = algo;
2020         ut_params->auth_xform.auth.key.length = key_len;
2021         ut_params->auth_xform.auth.key.data = hash_key;
2022         ut_params->auth_xform.auth.digest_length = auth_len;
2023         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2024         ut_params->auth_xform.auth.iv.length = iv_len;
2025         ut_params->sess = rte_cryptodev_sym_session_create(
2026                         ts_params->session_mpool);
2027
2028         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2029                         &ut_params->auth_xform,
2030                         ts_params->session_priv_mpool);
2031         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2032         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2033         return 0;
2034 }
2035
2036 static int
2037 create_wireless_algo_cipher_session(uint8_t dev_id,
2038                         enum rte_crypto_cipher_operation op,
2039                         enum rte_crypto_cipher_algorithm algo,
2040                         const uint8_t *key, const uint8_t key_len,
2041                         uint8_t iv_len)
2042 {
2043         uint8_t cipher_key[key_len];
2044         int status;
2045         struct crypto_testsuite_params *ts_params = &testsuite_params;
2046         struct crypto_unittest_params *ut_params = &unittest_params;
2047
2048         memcpy(cipher_key, key, key_len);
2049
2050         /* Setup Cipher Parameters */
2051         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2052         ut_params->cipher_xform.next = NULL;
2053
2054         ut_params->cipher_xform.cipher.algo = algo;
2055         ut_params->cipher_xform.cipher.op = op;
2056         ut_params->cipher_xform.cipher.key.data = cipher_key;
2057         ut_params->cipher_xform.cipher.key.length = key_len;
2058         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2059         ut_params->cipher_xform.cipher.iv.length = iv_len;
2060
2061         debug_hexdump(stdout, "key:", key, key_len);
2062
2063         /* Create Crypto session */
2064         ut_params->sess = rte_cryptodev_sym_session_create(
2065                         ts_params->session_mpool);
2066
2067         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2068                         &ut_params->cipher_xform,
2069                         ts_params->session_priv_mpool);
2070         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2071         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2072         return 0;
2073 }
2074
2075 static int
2076 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2077                         unsigned int cipher_len,
2078                         unsigned int cipher_offset)
2079 {
2080         struct crypto_testsuite_params *ts_params = &testsuite_params;
2081         struct crypto_unittest_params *ut_params = &unittest_params;
2082
2083         /* Generate Crypto op data structure */
2084         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2085                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2086         TEST_ASSERT_NOT_NULL(ut_params->op,
2087                                 "Failed to allocate pktmbuf offload");
2088
2089         /* Set crypto operation data parameters */
2090         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2091
2092         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2093
2094         /* set crypto operation source mbuf */
2095         sym_op->m_src = ut_params->ibuf;
2096
2097         /* iv */
2098         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2099                         iv, iv_len);
2100         sym_op->cipher.data.length = cipher_len;
2101         sym_op->cipher.data.offset = cipher_offset;
2102         return 0;
2103 }
2104
2105 static int
2106 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2107                         unsigned int cipher_len,
2108                         unsigned int cipher_offset)
2109 {
2110         struct crypto_testsuite_params *ts_params = &testsuite_params;
2111         struct crypto_unittest_params *ut_params = &unittest_params;
2112
2113         /* Generate Crypto op data structure */
2114         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2115                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2116         TEST_ASSERT_NOT_NULL(ut_params->op,
2117                                 "Failed to allocate pktmbuf offload");
2118
2119         /* Set crypto operation data parameters */
2120         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2121
2122         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2123
2124         /* set crypto operation source mbuf */
2125         sym_op->m_src = ut_params->ibuf;
2126         sym_op->m_dst = ut_params->obuf;
2127
2128         /* iv */
2129         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2130                         iv, iv_len);
2131         sym_op->cipher.data.length = cipher_len;
2132         sym_op->cipher.data.offset = cipher_offset;
2133         return 0;
2134 }
2135
2136 static int
2137 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2138                 enum rte_crypto_cipher_operation cipher_op,
2139                 enum rte_crypto_auth_operation auth_op,
2140                 enum rte_crypto_auth_algorithm auth_algo,
2141                 enum rte_crypto_cipher_algorithm cipher_algo,
2142                 const uint8_t *key, uint8_t key_len,
2143                 uint8_t auth_iv_len, uint8_t auth_len,
2144                 uint8_t cipher_iv_len)
2145
2146 {
2147         uint8_t cipher_auth_key[key_len];
2148         int status;
2149
2150         struct crypto_testsuite_params *ts_params = &testsuite_params;
2151         struct crypto_unittest_params *ut_params = &unittest_params;
2152
2153         memcpy(cipher_auth_key, key, key_len);
2154
2155         /* Setup Authentication Parameters */
2156         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2157         ut_params->auth_xform.next = NULL;
2158
2159         ut_params->auth_xform.auth.op = auth_op;
2160         ut_params->auth_xform.auth.algo = auth_algo;
2161         ut_params->auth_xform.auth.key.length = key_len;
2162         /* Hash key = cipher key */
2163         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2164         ut_params->auth_xform.auth.digest_length = auth_len;
2165         /* Auth IV will be after cipher IV */
2166         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2167         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2168
2169         /* Setup Cipher Parameters */
2170         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2171         ut_params->cipher_xform.next = &ut_params->auth_xform;
2172
2173         ut_params->cipher_xform.cipher.algo = cipher_algo;
2174         ut_params->cipher_xform.cipher.op = cipher_op;
2175         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2176         ut_params->cipher_xform.cipher.key.length = key_len;
2177         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2178         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2179
2180         debug_hexdump(stdout, "key:", key, key_len);
2181
2182         /* Create Crypto session*/
2183         ut_params->sess = rte_cryptodev_sym_session_create(
2184                         ts_params->session_mpool);
2185         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2186
2187         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2188                         &ut_params->cipher_xform,
2189                         ts_params->session_priv_mpool);
2190         if (status == -ENOTSUP)
2191                 return status;
2192
2193         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2194         return 0;
2195 }
2196
2197 static int
2198 create_wireless_cipher_auth_session(uint8_t dev_id,
2199                 enum rte_crypto_cipher_operation cipher_op,
2200                 enum rte_crypto_auth_operation auth_op,
2201                 enum rte_crypto_auth_algorithm auth_algo,
2202                 enum rte_crypto_cipher_algorithm cipher_algo,
2203                 const struct wireless_test_data *tdata)
2204 {
2205         const uint8_t key_len = tdata->key.len;
2206         uint8_t cipher_auth_key[key_len];
2207         int status;
2208
2209         struct crypto_testsuite_params *ts_params = &testsuite_params;
2210         struct crypto_unittest_params *ut_params = &unittest_params;
2211         const uint8_t *key = tdata->key.data;
2212         const uint8_t auth_len = tdata->digest.len;
2213         uint8_t cipher_iv_len = tdata->cipher_iv.len;
2214         uint8_t auth_iv_len = tdata->auth_iv.len;
2215
2216         memcpy(cipher_auth_key, key, key_len);
2217
2218         /* Setup Authentication Parameters */
2219         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2220         ut_params->auth_xform.next = NULL;
2221
2222         ut_params->auth_xform.auth.op = auth_op;
2223         ut_params->auth_xform.auth.algo = auth_algo;
2224         ut_params->auth_xform.auth.key.length = key_len;
2225         /* Hash key = cipher key */
2226         ut_params->auth_xform.auth.key.data = cipher_auth_key;
2227         ut_params->auth_xform.auth.digest_length = auth_len;
2228         /* Auth IV will be after cipher IV */
2229         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2230         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2231
2232         /* Setup Cipher Parameters */
2233         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2234         ut_params->cipher_xform.next = &ut_params->auth_xform;
2235
2236         ut_params->cipher_xform.cipher.algo = cipher_algo;
2237         ut_params->cipher_xform.cipher.op = cipher_op;
2238         ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2239         ut_params->cipher_xform.cipher.key.length = key_len;
2240         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2241         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2242
2243
2244         debug_hexdump(stdout, "key:", key, key_len);
2245
2246         /* Create Crypto session*/
2247         ut_params->sess = rte_cryptodev_sym_session_create(
2248                         ts_params->session_mpool);
2249
2250         status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2251                         &ut_params->cipher_xform,
2252                         ts_params->session_priv_mpool);
2253         if (status == -ENOTSUP)
2254                 return status;
2255
2256         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2257         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2258         return 0;
2259 }
2260
2261 static int
2262 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2263                 const struct wireless_test_data *tdata)
2264 {
2265         return create_wireless_cipher_auth_session(dev_id,
2266                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2267                 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2268                 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2269 }
2270
2271 static int
2272 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2273                 enum rte_crypto_cipher_operation cipher_op,
2274                 enum rte_crypto_auth_operation auth_op,
2275                 enum rte_crypto_auth_algorithm auth_algo,
2276                 enum rte_crypto_cipher_algorithm cipher_algo,
2277                 const uint8_t *key, const uint8_t key_len,
2278                 uint8_t auth_iv_len, uint8_t auth_len,
2279                 uint8_t cipher_iv_len)
2280 {
2281         uint8_t auth_cipher_key[key_len];
2282         int status;
2283         struct crypto_testsuite_params *ts_params = &testsuite_params;
2284         struct crypto_unittest_params *ut_params = &unittest_params;
2285
2286         memcpy(auth_cipher_key, key, key_len);
2287
2288         /* Setup Authentication Parameters */
2289         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2290         ut_params->auth_xform.auth.op = auth_op;
2291         ut_params->auth_xform.next = &ut_params->cipher_xform;
2292         ut_params->auth_xform.auth.algo = auth_algo;
2293         ut_params->auth_xform.auth.key.length = key_len;
2294         ut_params->auth_xform.auth.key.data = auth_cipher_key;
2295         ut_params->auth_xform.auth.digest_length = auth_len;
2296         /* Auth IV will be after cipher IV */
2297         ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2298         ut_params->auth_xform.auth.iv.length = auth_iv_len;
2299
2300         /* Setup Cipher Parameters */
2301         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2302         ut_params->cipher_xform.next = NULL;
2303         ut_params->cipher_xform.cipher.algo = cipher_algo;
2304         ut_params->cipher_xform.cipher.op = cipher_op;
2305         ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2306         ut_params->cipher_xform.cipher.key.length = key_len;
2307         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2308         ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2309
2310         debug_hexdump(stdout, "key:", key, key_len);
2311
2312         /* Create Crypto session*/
2313         ut_params->sess = rte_cryptodev_sym_session_create(
2314                         ts_params->session_mpool);
2315         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2316
2317         if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2318                 ut_params->auth_xform.next = NULL;
2319                 ut_params->cipher_xform.next = &ut_params->auth_xform;
2320                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2321                                 &ut_params->cipher_xform,
2322                                 ts_params->session_priv_mpool);
2323
2324         } else
2325                 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2326                                 &ut_params->auth_xform,
2327                                 ts_params->session_priv_mpool);
2328
2329         if (status == -ENOTSUP)
2330                 return status;
2331
2332         TEST_ASSERT_EQUAL(status, 0, "session init failed");
2333
2334         return 0;
2335 }
2336
2337 static int
2338 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2339                 unsigned int auth_tag_len,
2340                 const uint8_t *iv, unsigned int iv_len,
2341                 unsigned int data_pad_len,
2342                 enum rte_crypto_auth_operation op,
2343                 unsigned int auth_len, unsigned int auth_offset)
2344 {
2345         struct crypto_testsuite_params *ts_params = &testsuite_params;
2346
2347         struct crypto_unittest_params *ut_params = &unittest_params;
2348
2349         /* Generate Crypto op data structure */
2350         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2351                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2352         TEST_ASSERT_NOT_NULL(ut_params->op,
2353                 "Failed to allocate pktmbuf offload");
2354
2355         /* Set crypto operation data parameters */
2356         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2357
2358         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2359
2360         /* set crypto operation source mbuf */
2361         sym_op->m_src = ut_params->ibuf;
2362
2363         /* iv */
2364         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2365                         iv, iv_len);
2366         /* digest */
2367         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2368                                         ut_params->ibuf, auth_tag_len);
2369
2370         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2371                                 "no room to append auth tag");
2372         ut_params->digest = sym_op->auth.digest.data;
2373         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2374                         ut_params->ibuf, data_pad_len);
2375         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2376                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2377         else
2378                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2379
2380         debug_hexdump(stdout, "digest:",
2381                 sym_op->auth.digest.data,
2382                 auth_tag_len);
2383
2384         sym_op->auth.data.length = auth_len;
2385         sym_op->auth.data.offset = auth_offset;
2386
2387         return 0;
2388 }
2389
2390 static int
2391 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2392         enum rte_crypto_auth_operation op)
2393 {
2394         struct crypto_testsuite_params *ts_params = &testsuite_params;
2395         struct crypto_unittest_params *ut_params = &unittest_params;
2396
2397         const uint8_t *auth_tag = tdata->digest.data;
2398         const unsigned int auth_tag_len = tdata->digest.len;
2399         unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2400         unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2401
2402         const uint8_t *cipher_iv = tdata->cipher_iv.data;
2403         const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2404         const uint8_t *auth_iv = tdata->auth_iv.data;
2405         const uint8_t auth_iv_len = tdata->auth_iv.len;
2406         const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2407         const unsigned int auth_len = tdata->validAuthLenInBits.len;
2408
2409         /* Generate Crypto op data structure */
2410         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2411                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2412         TEST_ASSERT_NOT_NULL(ut_params->op,
2413                         "Failed to allocate pktmbuf offload");
2414         /* Set crypto operation data parameters */
2415         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2416
2417         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2418
2419         /* set crypto operation source mbuf */
2420         sym_op->m_src = ut_params->ibuf;
2421
2422         /* digest */
2423         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2424                         ut_params->ibuf, auth_tag_len);
2425
2426         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2427                         "no room to append auth tag");
2428         ut_params->digest = sym_op->auth.digest.data;
2429         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2430                         ut_params->ibuf, data_pad_len);
2431         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2432                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2433         else
2434                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2435
2436         debug_hexdump(stdout, "digest:",
2437                 sym_op->auth.digest.data,
2438                 auth_tag_len);
2439
2440         /* Copy cipher and auth IVs at the end of the crypto operation */
2441         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2442                                                 IV_OFFSET);
2443         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2444         iv_ptr += cipher_iv_len;
2445         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2446
2447         sym_op->cipher.data.length = cipher_len;
2448         sym_op->cipher.data.offset = 0;
2449         sym_op->auth.data.length = auth_len;
2450         sym_op->auth.data.offset = 0;
2451
2452         return 0;
2453 }
2454
2455 static int
2456 create_zuc_cipher_hash_generate_operation(
2457                 const struct wireless_test_data *tdata)
2458 {
2459         return create_wireless_cipher_hash_operation(tdata,
2460                 RTE_CRYPTO_AUTH_OP_GENERATE);
2461 }
2462
2463 static int
2464 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2465                 const unsigned auth_tag_len,
2466                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2467                 unsigned data_pad_len,
2468                 enum rte_crypto_auth_operation op,
2469                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2470                 const unsigned cipher_len, const unsigned cipher_offset,
2471                 const unsigned auth_len, const unsigned auth_offset)
2472 {
2473         struct crypto_testsuite_params *ts_params = &testsuite_params;
2474         struct crypto_unittest_params *ut_params = &unittest_params;
2475
2476         enum rte_crypto_cipher_algorithm cipher_algo =
2477                         ut_params->cipher_xform.cipher.algo;
2478         enum rte_crypto_auth_algorithm auth_algo =
2479                         ut_params->auth_xform.auth.algo;
2480
2481         /* Generate Crypto op data structure */
2482         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2483                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2484         TEST_ASSERT_NOT_NULL(ut_params->op,
2485                         "Failed to allocate pktmbuf offload");
2486         /* Set crypto operation data parameters */
2487         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2488
2489         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2490
2491         /* set crypto operation source mbuf */
2492         sym_op->m_src = ut_params->ibuf;
2493
2494         /* digest */
2495         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2496                         ut_params->ibuf, auth_tag_len);
2497
2498         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2499                         "no room to append auth tag");
2500         ut_params->digest = sym_op->auth.digest.data;
2501
2502         if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2503                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2504                                 ut_params->ibuf, data_pad_len);
2505         } else {
2506                 struct rte_mbuf *m = ut_params->ibuf;
2507                 unsigned int offset = data_pad_len;
2508
2509                 while (offset > m->data_len && m->next != NULL) {
2510                         offset -= m->data_len;
2511                         m = m->next;
2512                 }
2513                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2514                         m, offset);
2515         }
2516
2517         if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2518                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2519         else
2520                 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2521
2522         debug_hexdump(stdout, "digest:",
2523                 sym_op->auth.digest.data,
2524                 auth_tag_len);
2525
2526         /* Copy cipher and auth IVs at the end of the crypto operation */
2527         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2528                                                 IV_OFFSET);
2529         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2530         iv_ptr += cipher_iv_len;
2531         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2532
2533         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2534                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2535                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2536                 sym_op->cipher.data.length = cipher_len;
2537                 sym_op->cipher.data.offset = cipher_offset;
2538         } else {
2539                 sym_op->cipher.data.length = cipher_len >> 3;
2540                 sym_op->cipher.data.offset = cipher_offset >> 3;
2541         }
2542
2543         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2544                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2545                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2546                 sym_op->auth.data.length = auth_len;
2547                 sym_op->auth.data.offset = auth_offset;
2548         } else {
2549                 sym_op->auth.data.length = auth_len >> 3;
2550                 sym_op->auth.data.offset = auth_offset >> 3;
2551         }
2552
2553         return 0;
2554 }
2555
2556 static int
2557 create_wireless_algo_auth_cipher_operation(
2558                 const uint8_t *auth_tag, unsigned int auth_tag_len,
2559                 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2560                 const uint8_t *auth_iv, uint8_t auth_iv_len,
2561                 unsigned int data_pad_len,
2562                 unsigned int cipher_len, unsigned int cipher_offset,
2563                 unsigned int auth_len, unsigned int auth_offset,
2564                 uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2565 {
2566         struct crypto_testsuite_params *ts_params = &testsuite_params;
2567         struct crypto_unittest_params *ut_params = &unittest_params;
2568
2569         enum rte_crypto_cipher_algorithm cipher_algo =
2570                         ut_params->cipher_xform.cipher.algo;
2571         enum rte_crypto_auth_algorithm auth_algo =
2572                         ut_params->auth_xform.auth.algo;
2573
2574         /* Generate Crypto op data structure */
2575         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2576                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2577         TEST_ASSERT_NOT_NULL(ut_params->op,
2578                         "Failed to allocate pktmbuf offload");
2579
2580         /* Set crypto operation data parameters */
2581         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2582
2583         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2584
2585         /* set crypto operation mbufs */
2586         sym_op->m_src = ut_params->ibuf;
2587         if (op_mode == OUT_OF_PLACE)
2588                 sym_op->m_dst = ut_params->obuf;
2589
2590         /* digest */
2591         if (!do_sgl) {
2592                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2593                         (op_mode == IN_PLACE ?
2594                                 ut_params->ibuf : ut_params->obuf),
2595                         uint8_t *, data_pad_len);
2596                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2597                         (op_mode == IN_PLACE ?
2598                                 ut_params->ibuf : ut_params->obuf),
2599                         data_pad_len);
2600                 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2601         } else {
2602                 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
2603                 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
2604                                 sym_op->m_src : sym_op->m_dst);
2605                 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
2606                         remaining_off -= rte_pktmbuf_data_len(sgl_buf);
2607                         sgl_buf = sgl_buf->next;
2608                 }
2609                 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
2610                                 uint8_t *, remaining_off);
2611                 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
2612                                 remaining_off);
2613                 memset(sym_op->auth.digest.data, 0, remaining_off);
2614                 while (sgl_buf->next != NULL) {
2615                         memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
2616                                 0, rte_pktmbuf_data_len(sgl_buf));
2617                         sgl_buf = sgl_buf->next;
2618                 }
2619         }
2620
2621         /* Copy digest for the verification */
2622         if (verify)
2623                 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2624
2625         /* Copy cipher and auth IVs at the end of the crypto operation */
2626         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
2627                         ut_params->op, uint8_t *, IV_OFFSET);
2628
2629         rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2630         iv_ptr += cipher_iv_len;
2631         rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2632
2633         if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2634                 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2635                 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2636                 sym_op->cipher.data.length = cipher_len;
2637                 sym_op->cipher.data.offset = cipher_offset;
2638         } else {
2639                 sym_op->cipher.data.length = cipher_len >> 3;
2640                 sym_op->cipher.data.offset = cipher_offset >> 3;
2641         }
2642
2643         if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2644                 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2645                 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2646                 sym_op->auth.data.length = auth_len;
2647                 sym_op->auth.data.offset = auth_offset;
2648         } else {
2649                 sym_op->auth.data.length = auth_len >> 3;
2650                 sym_op->auth.data.offset = auth_offset >> 3;
2651         }
2652
2653         return 0;
2654 }
2655
2656 static int
2657 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
2658 {
2659         struct crypto_testsuite_params *ts_params = &testsuite_params;
2660         struct crypto_unittest_params *ut_params = &unittest_params;
2661
2662         int retval;
2663         unsigned plaintext_pad_len;
2664         unsigned plaintext_len;
2665         uint8_t *plaintext;
2666         struct rte_cryptodev_info dev_info;
2667
2668         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2669         uint64_t feat_flags = dev_info.feature_flags;
2670
2671         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
2672                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
2673                 printf("Device doesn't support NON-Byte Aligned Data.\n");
2674                 return -ENOTSUP;
2675         }
2676
2677         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2678                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2679                 printf("Device doesn't support RAW data-path APIs.\n");
2680                 return -ENOTSUP;
2681         }
2682
2683         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2684                 return -ENOTSUP;
2685
2686         /* Verify the capabilities */
2687         struct rte_cryptodev_sym_capability_idx cap_idx;
2688         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2689         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2690         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2691                         &cap_idx) == NULL)
2692                 return -ENOTSUP;
2693
2694         /* Create SNOW 3G session */
2695         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2696                         tdata->key.data, tdata->key.len,
2697                         tdata->auth_iv.len, tdata->digest.len,
2698                         RTE_CRYPTO_AUTH_OP_GENERATE,
2699                         RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2700         if (retval < 0)
2701                 return retval;
2702
2703         /* alloc mbuf and set payload */
2704         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2705
2706         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2707         rte_pktmbuf_tailroom(ut_params->ibuf));
2708
2709         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2710         /* Append data which is padded to a multiple of */
2711         /* the algorithms block size */
2712         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2713         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2714                                 plaintext_pad_len);
2715         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2716
2717         /* Create SNOW 3G operation */
2718         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2719                         tdata->auth_iv.data, tdata->auth_iv.len,
2720                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2721                         tdata->validAuthLenInBits.len,
2722                         0);
2723         if (retval < 0)
2724                 return retval;
2725
2726         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2727                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2728                                 ut_params->op, 0, 1, 1, 0);
2729         else
2730                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2731                                 ut_params->op);
2732         ut_params->obuf = ut_params->op->sym->m_src;
2733         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2734         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2735                         + plaintext_pad_len;
2736
2737         /* Validate obuf */
2738         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2739         ut_params->digest,
2740         tdata->digest.data,
2741         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
2742         "SNOW 3G Generated auth tag not as expected");
2743
2744         return 0;
2745 }
2746
2747 static int
2748 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
2749 {
2750         struct crypto_testsuite_params *ts_params = &testsuite_params;
2751         struct crypto_unittest_params *ut_params = &unittest_params;
2752
2753         int retval;
2754         unsigned plaintext_pad_len;
2755         unsigned plaintext_len;
2756         uint8_t *plaintext;
2757         struct rte_cryptodev_info dev_info;
2758
2759         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2760         uint64_t feat_flags = dev_info.feature_flags;
2761
2762         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
2763                         ((tdata->validAuthLenInBits.len % 8) != 0)) {
2764                 printf("Device doesn't support NON-Byte Aligned Data.\n");
2765                 return -ENOTSUP;
2766         }
2767
2768         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2769                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2770                 printf("Device doesn't support RAW data-path APIs.\n");
2771                 return -ENOTSUP;
2772         }
2773
2774         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2775                 return -ENOTSUP;
2776
2777         /* Verify the capabilities */
2778         struct rte_cryptodev_sym_capability_idx cap_idx;
2779         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2780         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2781         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2782                         &cap_idx) == NULL)
2783                 return -ENOTSUP;
2784
2785         /* Create SNOW 3G session */
2786         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2787                                 tdata->key.data, tdata->key.len,
2788                                 tdata->auth_iv.len, tdata->digest.len,
2789                                 RTE_CRYPTO_AUTH_OP_VERIFY,
2790                                 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2791         if (retval < 0)
2792                 return retval;
2793         /* alloc mbuf and set payload */
2794         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2795
2796         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2797         rte_pktmbuf_tailroom(ut_params->ibuf));
2798
2799         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2800         /* Append data which is padded to a multiple of */
2801         /* the algorithms block size */
2802         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2803         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2804                                 plaintext_pad_len);
2805         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2806
2807         /* Create SNOW 3G operation */
2808         retval = create_wireless_algo_hash_operation(tdata->digest.data,
2809                         tdata->digest.len,
2810                         tdata->auth_iv.data, tdata->auth_iv.len,
2811                         plaintext_pad_len,
2812                         RTE_CRYPTO_AUTH_OP_VERIFY,
2813                         tdata->validAuthLenInBits.len,
2814                         0);
2815         if (retval < 0)
2816                 return retval;
2817
2818         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2819                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2820                                 ut_params->op, 0, 1, 1, 0);
2821         else
2822                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2823                                 ut_params->op);
2824         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2825         ut_params->obuf = ut_params->op->sym->m_src;
2826         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2827                                 + plaintext_pad_len;
2828
2829         /* Validate obuf */
2830         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
2831                 return 0;
2832         else
2833                 return -1;
2834
2835         return 0;
2836 }
2837
2838 static int
2839 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
2840 {
2841         struct crypto_testsuite_params *ts_params = &testsuite_params;
2842         struct crypto_unittest_params *ut_params = &unittest_params;
2843
2844         int retval;
2845         unsigned plaintext_pad_len;
2846         unsigned plaintext_len;
2847         uint8_t *plaintext;
2848         struct rte_cryptodev_info dev_info;
2849
2850         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2851         uint64_t feat_flags = dev_info.feature_flags;
2852
2853         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2854                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2855                 printf("Device doesn't support RAW data-path APIs.\n");
2856                 return -ENOTSUP;
2857         }
2858
2859         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2860                 return -ENOTSUP;
2861
2862         /* Verify the capabilities */
2863         struct rte_cryptodev_sym_capability_idx cap_idx;
2864         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2865         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2866         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2867                         &cap_idx) == NULL)
2868                 return -ENOTSUP;
2869
2870         /* Create KASUMI session */
2871         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2872                         tdata->key.data, tdata->key.len,
2873                         0, tdata->digest.len,
2874                         RTE_CRYPTO_AUTH_OP_GENERATE,
2875                         RTE_CRYPTO_AUTH_KASUMI_F9);
2876         if (retval < 0)
2877                 return retval;
2878
2879         /* alloc mbuf and set payload */
2880         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2881
2882         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2883         rte_pktmbuf_tailroom(ut_params->ibuf));
2884
2885         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2886         /* Append data which is padded to a multiple of */
2887         /* the algorithms block size */
2888         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2889         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2890                                 plaintext_pad_len);
2891         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2892
2893         /* Create KASUMI operation */
2894         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2895                         NULL, 0,
2896                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2897                         tdata->plaintext.len,
2898                         0);
2899         if (retval < 0)
2900                 return retval;
2901
2902         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2903                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2904                         ut_params->op);
2905         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2906                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2907                                 ut_params->op, 0, 1, 1, 0);
2908         else
2909                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2910                         ut_params->op);
2911
2912         ut_params->obuf = ut_params->op->sym->m_src;
2913         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2914         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2915                         + plaintext_pad_len;
2916
2917         /* Validate obuf */
2918         TEST_ASSERT_BUFFERS_ARE_EQUAL(
2919         ut_params->digest,
2920         tdata->digest.data,
2921         DIGEST_BYTE_LENGTH_KASUMI_F9,
2922         "KASUMI Generated auth tag not as expected");
2923
2924         return 0;
2925 }
2926
2927 static int
2928 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
2929 {
2930         struct crypto_testsuite_params *ts_params = &testsuite_params;
2931         struct crypto_unittest_params *ut_params = &unittest_params;
2932
2933         int retval;
2934         unsigned plaintext_pad_len;
2935         unsigned plaintext_len;
2936         uint8_t *plaintext;
2937         struct rte_cryptodev_info dev_info;
2938
2939         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2940         uint64_t feat_flags = dev_info.feature_flags;
2941
2942         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2943                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2944                 printf("Device doesn't support RAW data-path APIs.\n");
2945                 return -ENOTSUP;
2946         }
2947
2948         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2949                 return -ENOTSUP;
2950
2951         /* Verify the capabilities */
2952         struct rte_cryptodev_sym_capability_idx cap_idx;
2953         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2954         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2955         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2956                         &cap_idx) == NULL)
2957                 return -ENOTSUP;
2958
2959         /* Create KASUMI session */
2960         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2961                                 tdata->key.data, tdata->key.len,
2962                                 0, tdata->digest.len,
2963                                 RTE_CRYPTO_AUTH_OP_VERIFY,
2964                                 RTE_CRYPTO_AUTH_KASUMI_F9);
2965         if (retval < 0)
2966                 return retval;
2967         /* alloc mbuf and set payload */
2968         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2969
2970         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2971         rte_pktmbuf_tailroom(ut_params->ibuf));
2972
2973         plaintext_len = ceil_byte_length(tdata->plaintext.len);
2974         /* Append data which is padded to a multiple */
2975         /* of the algorithms block size */
2976         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2977         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2978                                 plaintext_pad_len);
2979         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2980
2981         /* Create KASUMI operation */
2982         retval = create_wireless_algo_hash_operation(tdata->digest.data,
2983                         tdata->digest.len,
2984                         NULL, 0,
2985                         plaintext_pad_len,
2986                         RTE_CRYPTO_AUTH_OP_VERIFY,
2987                         tdata->plaintext.len,
2988                         0);
2989         if (retval < 0)
2990                 return retval;
2991
2992         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2993                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2994                                 ut_params->op, 0, 1, 1, 0);
2995         else
2996                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2997                                 ut_params->op);
2998         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2999         ut_params->obuf = ut_params->op->sym->m_src;
3000         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3001                                 + plaintext_pad_len;
3002
3003         /* Validate obuf */
3004         if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3005                 return 0;
3006         else
3007                 return -1;
3008
3009         return 0;
3010 }
3011
3012 static int
3013 test_snow3g_hash_generate_test_case_1(void)
3014 {
3015         return test_snow3g_authentication(&snow3g_hash_test_case_1);
3016 }
3017
3018 static int
3019 test_snow3g_hash_generate_test_case_2(void)
3020 {
3021         return test_snow3g_authentication(&snow3g_hash_test_case_2);
3022 }
3023
3024 static int
3025 test_snow3g_hash_generate_test_case_3(void)
3026 {
3027         return test_snow3g_authentication(&snow3g_hash_test_case_3);
3028 }
3029
3030 static int
3031 test_snow3g_hash_generate_test_case_4(void)
3032 {
3033         return test_snow3g_authentication(&snow3g_hash_test_case_4);
3034 }
3035
3036 static int
3037 test_snow3g_hash_generate_test_case_5(void)
3038 {
3039         return test_snow3g_authentication(&snow3g_hash_test_case_5);
3040 }
3041
3042 static int
3043 test_snow3g_hash_generate_test_case_6(void)
3044 {
3045         return test_snow3g_authentication(&snow3g_hash_test_case_6);
3046 }
3047
3048 static int
3049 test_snow3g_hash_verify_test_case_1(void)
3050 {
3051         return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3052
3053 }
3054
3055 static int
3056 test_snow3g_hash_verify_test_case_2(void)
3057 {
3058         return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3059 }
3060
3061 static int
3062 test_snow3g_hash_verify_test_case_3(void)
3063 {
3064         return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3065 }
3066
3067 static int
3068 test_snow3g_hash_verify_test_case_4(void)
3069 {
3070         return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3071 }
3072
3073 static int
3074 test_snow3g_hash_verify_test_case_5(void)
3075 {
3076         return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3077 }
3078
3079 static int
3080 test_snow3g_hash_verify_test_case_6(void)
3081 {
3082         return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3083 }
3084
3085 static int
3086 test_kasumi_hash_generate_test_case_1(void)
3087 {
3088         return test_kasumi_authentication(&kasumi_hash_test_case_1);
3089 }
3090
3091 static int
3092 test_kasumi_hash_generate_test_case_2(void)
3093 {
3094         return test_kasumi_authentication(&kasumi_hash_test_case_2);
3095 }
3096
3097 static int
3098 test_kasumi_hash_generate_test_case_3(void)
3099 {
3100         return test_kasumi_authentication(&kasumi_hash_test_case_3);
3101 }
3102
3103 static int
3104 test_kasumi_hash_generate_test_case_4(void)
3105 {
3106         return test_kasumi_authentication(&kasumi_hash_test_case_4);
3107 }
3108
3109 static int
3110 test_kasumi_hash_generate_test_case_5(void)
3111 {
3112         return test_kasumi_authentication(&kasumi_hash_test_case_5);
3113 }
3114
3115 static int
3116 test_kasumi_hash_generate_test_case_6(void)
3117 {
3118         return test_kasumi_authentication(&kasumi_hash_test_case_6);
3119 }
3120
3121 static int
3122 test_kasumi_hash_verify_test_case_1(void)
3123 {
3124         return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3125 }
3126
3127 static int
3128 test_kasumi_hash_verify_test_case_2(void)
3129 {
3130         return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3131 }
3132
3133 static int
3134 test_kasumi_hash_verify_test_case_3(void)
3135 {
3136         return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3137 }
3138
3139 static int
3140 test_kasumi_hash_verify_test_case_4(void)
3141 {
3142         return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3143 }
3144
3145 static int
3146 test_kasumi_hash_verify_test_case_5(void)
3147 {
3148         return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3149 }
3150
3151 static int
3152 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3153 {
3154         struct crypto_testsuite_params *ts_params = &testsuite_params;
3155         struct crypto_unittest_params *ut_params = &unittest_params;
3156
3157         int retval;
3158         uint8_t *plaintext, *ciphertext;
3159         unsigned plaintext_pad_len;
3160         unsigned plaintext_len;
3161         struct rte_cryptodev_info dev_info;
3162
3163         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3164         uint64_t feat_flags = dev_info.feature_flags;
3165
3166         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3167                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3168                 printf("Device doesn't support RAW data-path APIs.\n");
3169                 return -ENOTSUP;
3170         }
3171
3172         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3173                 return -ENOTSUP;
3174
3175         /* Verify the capabilities */
3176         struct rte_cryptodev_sym_capability_idx cap_idx;
3177         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3178         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3179         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3180                         &cap_idx) == NULL)
3181                 return -ENOTSUP;
3182
3183         /* Create KASUMI session */
3184         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3185                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3186                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3187                                         tdata->key.data, tdata->key.len,
3188                                         tdata->cipher_iv.len);
3189         if (retval < 0)
3190                 return retval;
3191
3192         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3193
3194         /* Clear mbuf payload */
3195         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3196                rte_pktmbuf_tailroom(ut_params->ibuf));
3197
3198         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3199         /* Append data which is padded to a multiple */
3200         /* of the algorithms block size */
3201         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3202         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3203                                 plaintext_pad_len);
3204         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3205
3206         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3207
3208         /* Create KASUMI operation */
3209         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3210                                 tdata->cipher_iv.len,
3211                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3212                                 tdata->validCipherOffsetInBits.len);
3213         if (retval < 0)
3214                 return retval;
3215
3216         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3217                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3218                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3219         else
3220                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3221                                 ut_params->op);
3222         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3223
3224         ut_params->obuf = ut_params->op->sym->m_dst;
3225         if (ut_params->obuf)
3226                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3227         else
3228                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3229
3230         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3231
3232         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3233                                 (tdata->validCipherOffsetInBits.len >> 3);
3234         /* Validate obuf */
3235         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3236                 ciphertext,
3237                 reference_ciphertext,
3238                 tdata->validCipherLenInBits.len,
3239                 "KASUMI Ciphertext data not as expected");
3240         return 0;
3241 }
3242
3243 static int
3244 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3245 {
3246         struct crypto_testsuite_params *ts_params = &testsuite_params;
3247         struct crypto_unittest_params *ut_params = &unittest_params;
3248
3249         int retval;
3250
3251         unsigned int plaintext_pad_len;
3252         unsigned int plaintext_len;
3253
3254         uint8_t buffer[10000];
3255         const uint8_t *ciphertext;
3256
3257         struct rte_cryptodev_info dev_info;
3258
3259         /* Verify the capabilities */
3260         struct rte_cryptodev_sym_capability_idx cap_idx;
3261         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3262         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3263         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3264                         &cap_idx) == NULL)
3265                 return -ENOTSUP;
3266
3267         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3268
3269         uint64_t feat_flags = dev_info.feature_flags;
3270
3271         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3272                 printf("Device doesn't support in-place scatter-gather. "
3273                                 "Test Skipped.\n");
3274                 return -ENOTSUP;
3275         }
3276
3277         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3278                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3279                 printf("Device doesn't support RAW data-path APIs.\n");
3280                 return -ENOTSUP;
3281         }
3282
3283         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3284                 return -ENOTSUP;
3285
3286         /* Create KASUMI session */
3287         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3288                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3289                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3290                                         tdata->key.data, tdata->key.len,
3291                                         tdata->cipher_iv.len);
3292         if (retval < 0)
3293                 return retval;
3294
3295         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3296
3297
3298         /* Append data which is padded to a multiple */
3299         /* of the algorithms block size */
3300         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3301
3302         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3303                         plaintext_pad_len, 10, 0);
3304
3305         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3306
3307         /* Create KASUMI operation */
3308         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3309                                 tdata->cipher_iv.len,
3310                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3311                                 tdata->validCipherOffsetInBits.len);
3312         if (retval < 0)
3313                 return retval;
3314
3315         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3316                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3317                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3318         else
3319                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3320                                                 ut_params->op);
3321         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3322
3323         ut_params->obuf = ut_params->op->sym->m_dst;
3324
3325         if (ut_params->obuf)
3326                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3327                                 plaintext_len, buffer);
3328         else
3329                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3330                                 tdata->validCipherOffsetInBits.len >> 3,
3331                                 plaintext_len, buffer);
3332
3333         /* Validate obuf */
3334         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3335
3336         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3337                                 (tdata->validCipherOffsetInBits.len >> 3);
3338         /* Validate obuf */
3339         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3340                 ciphertext,
3341                 reference_ciphertext,
3342                 tdata->validCipherLenInBits.len,
3343                 "KASUMI Ciphertext data not as expected");
3344         return 0;
3345 }
3346
3347 static int
3348 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3349 {
3350         struct crypto_testsuite_params *ts_params = &testsuite_params;
3351         struct crypto_unittest_params *ut_params = &unittest_params;
3352
3353         int retval;
3354         uint8_t *plaintext, *ciphertext;
3355         unsigned plaintext_pad_len;
3356         unsigned plaintext_len;
3357
3358         /* Verify the capabilities */
3359         struct rte_cryptodev_sym_capability_idx cap_idx;
3360         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3361         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3362         /* Data-path service does not support OOP */
3363         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3364                         &cap_idx) == NULL)
3365                 return -ENOTSUP;
3366
3367         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3368                 return -ENOTSUP;
3369
3370         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3371                 return -ENOTSUP;
3372
3373         /* Create KASUMI session */
3374         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3375                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3376                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3377                                         tdata->key.data, tdata->key.len,
3378                                         tdata->cipher_iv.len);
3379         if (retval < 0)
3380                 return retval;
3381
3382         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3383         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3384
3385         /* Clear mbuf payload */
3386         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3387                rte_pktmbuf_tailroom(ut_params->ibuf));
3388
3389         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3390         /* Append data which is padded to a multiple */
3391         /* of the algorithms block size */
3392         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3393         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3394                                 plaintext_pad_len);
3395         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3396         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3397
3398         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3399
3400         /* Create KASUMI operation */
3401         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3402                                 tdata->cipher_iv.len,
3403                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3404                                 tdata->validCipherOffsetInBits.len);
3405         if (retval < 0)
3406                 return retval;
3407
3408         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3409                                                 ut_params->op);
3410         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3411
3412         ut_params->obuf = ut_params->op->sym->m_dst;
3413         if (ut_params->obuf)
3414                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3415         else
3416                 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3417
3418         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3419
3420         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3421                                 (tdata->validCipherOffsetInBits.len >> 3);
3422         /* Validate obuf */
3423         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3424                 ciphertext,
3425                 reference_ciphertext,
3426                 tdata->validCipherLenInBits.len,
3427                 "KASUMI Ciphertext data not as expected");
3428         return 0;
3429 }
3430
3431 static int
3432 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3433 {
3434         struct crypto_testsuite_params *ts_params = &testsuite_params;
3435         struct crypto_unittest_params *ut_params = &unittest_params;
3436
3437         int retval;
3438         unsigned int plaintext_pad_len;
3439         unsigned int plaintext_len;
3440
3441         const uint8_t *ciphertext;
3442         uint8_t buffer[2048];
3443
3444         struct rte_cryptodev_info dev_info;
3445
3446         /* Verify the capabilities */
3447         struct rte_cryptodev_sym_capability_idx cap_idx;
3448         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3449         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3450         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3451                         &cap_idx) == NULL)
3452                 return -ENOTSUP;
3453
3454         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3455                 return -ENOTSUP;
3456
3457         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3458                 return -ENOTSUP;
3459
3460         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3461
3462         uint64_t feat_flags = dev_info.feature_flags;
3463         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3464                 printf("Device doesn't support out-of-place scatter-gather "
3465                                 "in both input and output mbufs. "
3466                                 "Test Skipped.\n");
3467                 return -ENOTSUP;
3468         }
3469
3470         /* Create KASUMI session */
3471         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3472                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3473                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3474                                         tdata->key.data, tdata->key.len,
3475                                         tdata->cipher_iv.len);
3476         if (retval < 0)
3477                 return retval;
3478
3479         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3480         /* Append data which is padded to a multiple */
3481         /* of the algorithms block size */
3482         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3483
3484         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3485                         plaintext_pad_len, 10, 0);
3486         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3487                         plaintext_pad_len, 3, 0);
3488
3489         /* Append data which is padded to a multiple */
3490         /* of the algorithms block size */
3491         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3492
3493         /* Create KASUMI operation */
3494         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3495                                 tdata->cipher_iv.len,
3496                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3497                                 tdata->validCipherOffsetInBits.len);
3498         if (retval < 0)
3499                 return retval;
3500
3501         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3502                                                 ut_params->op);
3503         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3504
3505         ut_params->obuf = ut_params->op->sym->m_dst;
3506         if (ut_params->obuf)
3507                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3508                                 plaintext_pad_len, buffer);
3509         else
3510                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3511                                 tdata->validCipherOffsetInBits.len >> 3,
3512                                 plaintext_pad_len, buffer);
3513
3514         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3515                                 (tdata->validCipherOffsetInBits.len >> 3);
3516         /* Validate obuf */
3517         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3518                 ciphertext,
3519                 reference_ciphertext,
3520                 tdata->validCipherLenInBits.len,
3521                 "KASUMI Ciphertext data not as expected");
3522         return 0;
3523 }
3524
3525
3526 static int
3527 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3528 {
3529         struct crypto_testsuite_params *ts_params = &testsuite_params;
3530         struct crypto_unittest_params *ut_params = &unittest_params;
3531
3532         int retval;
3533         uint8_t *ciphertext, *plaintext;
3534         unsigned ciphertext_pad_len;
3535         unsigned ciphertext_len;
3536
3537         /* Verify the capabilities */
3538         struct rte_cryptodev_sym_capability_idx cap_idx;
3539         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3540         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3541         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3542                         &cap_idx) == NULL)
3543                 return -ENOTSUP;
3544
3545         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3546                 return -ENOTSUP;
3547
3548         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3549                 return -ENOTSUP;
3550
3551         /* Create KASUMI session */
3552         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3553                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3554                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3555                                         tdata->key.data, tdata->key.len,
3556                                         tdata->cipher_iv.len);
3557         if (retval < 0)
3558                 return retval;
3559
3560         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3561         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3562
3563         /* Clear mbuf payload */
3564         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3565                rte_pktmbuf_tailroom(ut_params->ibuf));
3566
3567         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3568         /* Append data which is padded to a multiple */
3569         /* of the algorithms block size */
3570         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3571         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3572                                 ciphertext_pad_len);
3573         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3574         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3575
3576         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3577
3578         /* Create KASUMI operation */
3579         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3580                                 tdata->cipher_iv.len,
3581                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3582                                 tdata->validCipherOffsetInBits.len);
3583         if (retval < 0)
3584                 return retval;
3585
3586         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3587                                                 ut_params->op);
3588         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3589
3590         ut_params->obuf = ut_params->op->sym->m_dst;
3591         if (ut_params->obuf)
3592                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3593         else
3594                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3595
3596         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3597
3598         const uint8_t *reference_plaintext = tdata->plaintext.data +
3599                                 (tdata->validCipherOffsetInBits.len >> 3);
3600         /* Validate obuf */
3601         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3602                 plaintext,
3603                 reference_plaintext,
3604                 tdata->validCipherLenInBits.len,
3605                 "KASUMI Plaintext data not as expected");
3606         return 0;
3607 }
3608
3609 static int
3610 test_kasumi_decryption(const struct kasumi_test_data *tdata)
3611 {
3612         struct crypto_testsuite_params *ts_params = &testsuite_params;
3613         struct crypto_unittest_params *ut_params = &unittest_params;
3614
3615         int retval;
3616         uint8_t *ciphertext, *plaintext;
3617         unsigned ciphertext_pad_len;
3618         unsigned ciphertext_len;
3619         struct rte_cryptodev_info dev_info;
3620
3621         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3622         uint64_t feat_flags = dev_info.feature_flags;
3623
3624         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3625                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3626                 printf("Device doesn't support RAW data-path APIs.\n");
3627                 return -ENOTSUP;
3628         }
3629
3630         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3631                 return -ENOTSUP;
3632
3633         /* Verify the capabilities */
3634         struct rte_cryptodev_sym_capability_idx cap_idx;
3635         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3636         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3637         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3638                         &cap_idx) == NULL)
3639                 return -ENOTSUP;
3640
3641         /* Create KASUMI session */
3642         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3643                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
3644                                         RTE_CRYPTO_CIPHER_KASUMI_F8,
3645                                         tdata->key.data, tdata->key.len,
3646                                         tdata->cipher_iv.len);
3647         if (retval < 0)
3648                 return retval;
3649
3650         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3651
3652         /* Clear mbuf payload */
3653         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3654                rte_pktmbuf_tailroom(ut_params->ibuf));
3655
3656         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3657         /* Append data which is padded to a multiple */
3658         /* of the algorithms block size */
3659         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3660         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3661                                 ciphertext_pad_len);
3662         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3663
3664         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3665
3666         /* Create KASUMI operation */
3667         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3668                                         tdata->cipher_iv.len,
3669                                         tdata->ciphertext.len,
3670                                         tdata->validCipherOffsetInBits.len);
3671         if (retval < 0)
3672                 return retval;
3673
3674         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3675                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3676                                 ut_params->op, 1, 0, 1, 0);
3677         else
3678                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3679                                                 ut_params->op);
3680         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3681
3682         ut_params->obuf = ut_params->op->sym->m_dst;
3683         if (ut_params->obuf)
3684                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3685         else
3686                 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3687
3688         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3689
3690         const uint8_t *reference_plaintext = tdata->plaintext.data +
3691                                 (tdata->validCipherOffsetInBits.len >> 3);
3692         /* Validate obuf */
3693         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3694                 plaintext,
3695                 reference_plaintext,
3696                 tdata->validCipherLenInBits.len,
3697                 "KASUMI Plaintext data not as expected");
3698         return 0;
3699 }
3700
3701 static int
3702 test_snow3g_encryption(const struct snow3g_test_data *tdata)
3703 {
3704         struct crypto_testsuite_params *ts_params = &testsuite_params;
3705         struct crypto_unittest_params *ut_params = &unittest_params;
3706
3707         int retval;
3708         uint8_t *plaintext, *ciphertext;
3709         unsigned plaintext_pad_len;
3710         unsigned plaintext_len;
3711         struct rte_cryptodev_info dev_info;
3712
3713         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3714         uint64_t feat_flags = dev_info.feature_flags;
3715
3716         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3717                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3718                 printf("Device doesn't support RAW data-path APIs.\n");
3719                 return -ENOTSUP;
3720         }
3721
3722         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3723                 return -ENOTSUP;
3724
3725         /* Verify the capabilities */
3726         struct rte_cryptodev_sym_capability_idx cap_idx;
3727         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3728         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3729         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3730                         &cap_idx) == NULL)
3731                 return -ENOTSUP;
3732
3733         /* Create SNOW 3G session */
3734         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3735                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3736                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3737                                         tdata->key.data, tdata->key.len,
3738                                         tdata->cipher_iv.len);
3739         if (retval < 0)
3740                 return retval;
3741
3742         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3743
3744         /* Clear mbuf payload */
3745         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3746                rte_pktmbuf_tailroom(ut_params->ibuf));
3747
3748         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3749         /* Append data which is padded to a multiple of */
3750         /* the algorithms block size */
3751         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3752         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3753                                 plaintext_pad_len);
3754         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3755
3756         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3757
3758         /* Create SNOW 3G operation */
3759         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3760                                         tdata->cipher_iv.len,
3761                                         tdata->validCipherLenInBits.len,
3762                                         0);
3763         if (retval < 0)
3764                 return retval;
3765
3766         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3767                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3768                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3769         else
3770                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3771                                                 ut_params->op);
3772         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3773
3774         ut_params->obuf = ut_params->op->sym->m_dst;
3775         if (ut_params->obuf)
3776                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3777         else
3778                 ciphertext = plaintext;
3779
3780         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3781
3782         /* Validate obuf */
3783         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3784                 ciphertext,
3785                 tdata->ciphertext.data,
3786                 tdata->validDataLenInBits.len,
3787                 "SNOW 3G Ciphertext data not as expected");
3788         return 0;
3789 }
3790
3791
3792 static int
3793 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
3794 {
3795         struct crypto_testsuite_params *ts_params = &testsuite_params;
3796         struct crypto_unittest_params *ut_params = &unittest_params;
3797         uint8_t *plaintext, *ciphertext;
3798
3799         int retval;
3800         unsigned plaintext_pad_len;
3801         unsigned plaintext_len;
3802
3803         /* Verify the capabilities */
3804         struct rte_cryptodev_sym_capability_idx cap_idx;
3805         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3806         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3807         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3808                         &cap_idx) == NULL)
3809                 return -ENOTSUP;
3810
3811         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3812                 return -ENOTSUP;
3813
3814         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3815                 return -ENOTSUP;
3816
3817         /* Create SNOW 3G session */
3818         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3819                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3820                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3821                                         tdata->key.data, tdata->key.len,
3822                                         tdata->cipher_iv.len);
3823         if (retval < 0)
3824                 return retval;
3825
3826         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3827         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3828
3829         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3830                         "Failed to allocate input buffer in mempool");
3831         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3832                         "Failed to allocate output buffer in mempool");
3833
3834         /* Clear mbuf payload */
3835         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3836                rte_pktmbuf_tailroom(ut_params->ibuf));
3837
3838         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3839         /* Append data which is padded to a multiple of */
3840         /* the algorithms block size */
3841         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3842         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3843                                 plaintext_pad_len);
3844         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3845         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3846
3847         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3848
3849         /* Create SNOW 3G operation */
3850         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3851                                         tdata->cipher_iv.len,
3852                                         tdata->validCipherLenInBits.len,
3853                                         0);
3854         if (retval < 0)
3855                 return retval;
3856
3857         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3858                                                 ut_params->op);
3859         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3860
3861         ut_params->obuf = ut_params->op->sym->m_dst;
3862         if (ut_params->obuf)
3863                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3864         else
3865                 ciphertext = plaintext;
3866
3867         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3868
3869         /* Validate obuf */
3870         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3871                 ciphertext,
3872                 tdata->ciphertext.data,
3873                 tdata->validDataLenInBits.len,
3874                 "SNOW 3G Ciphertext data not as expected");
3875         return 0;
3876 }
3877
3878 static int
3879 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
3880 {
3881         struct crypto_testsuite_params *ts_params = &testsuite_params;
3882         struct crypto_unittest_params *ut_params = &unittest_params;
3883
3884         int retval;
3885         unsigned int plaintext_pad_len;
3886         unsigned int plaintext_len;
3887         uint8_t buffer[10000];
3888         const uint8_t *ciphertext;
3889
3890         struct rte_cryptodev_info dev_info;
3891
3892         /* Verify the capabilities */
3893         struct rte_cryptodev_sym_capability_idx cap_idx;
3894         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3895         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3896         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3897                         &cap_idx) == NULL)
3898                 return -ENOTSUP;
3899
3900         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3901                 return -ENOTSUP;
3902
3903         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3904                 return -ENOTSUP;
3905
3906         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3907
3908         uint64_t feat_flags = dev_info.feature_flags;
3909
3910         if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3911                 printf("Device doesn't support out-of-place scatter-gather "
3912                                 "in both input and output mbufs. "
3913                                 "Test Skipped.\n");
3914                 return -ENOTSUP;
3915         }
3916
3917         /* Create SNOW 3G session */
3918         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3919                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3920                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3921                                         tdata->key.data, tdata->key.len,
3922                                         tdata->cipher_iv.len);
3923         if (retval < 0)
3924                 return retval;
3925
3926         plaintext_len = ceil_byte_length(tdata->plaintext.len);
3927         /* Append data which is padded to a multiple of */
3928         /* the algorithms block size */
3929         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3930
3931         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3932                         plaintext_pad_len, 10, 0);
3933         ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3934                         plaintext_pad_len, 3, 0);
3935
3936         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3937                         "Failed to allocate input buffer in mempool");
3938         TEST_ASSERT_NOT_NULL(ut_params->obuf,
3939                         "Failed to allocate output buffer in mempool");
3940
3941         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3942
3943         /* Create SNOW 3G operation */
3944         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3945                                         tdata->cipher_iv.len,
3946                                         tdata->validCipherLenInBits.len,
3947                                         0);
3948         if (retval < 0)
3949                 return retval;
3950
3951         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3952                                                 ut_params->op);
3953         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3954
3955         ut_params->obuf = ut_params->op->sym->m_dst;
3956         if (ut_params->obuf)
3957                 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3958                                 plaintext_len, buffer);
3959         else
3960                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
3961                                 plaintext_len, buffer);
3962
3963         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3964
3965         /* Validate obuf */
3966         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3967                 ciphertext,
3968                 tdata->ciphertext.data,
3969                 tdata->validDataLenInBits.len,
3970                 "SNOW 3G Ciphertext data not as expected");
3971
3972         return 0;
3973 }
3974
3975 /* Shift right a buffer by "offset" bits, "offset" < 8 */
3976 static void
3977 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
3978 {
3979         uint8_t curr_byte, prev_byte;
3980         uint32_t length_in_bytes = ceil_byte_length(length + offset);
3981         uint8_t lower_byte_mask = (1 << offset) - 1;
3982         unsigned i;
3983
3984         prev_byte = buffer[0];
3985         buffer[0] >>= offset;
3986
3987         for (i = 1; i < length_in_bytes; i++) {
3988                 curr_byte = buffer[i];
3989                 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
3990                                 (curr_byte >> offset);
3991                 prev_byte = curr_byte;
3992         }
3993 }
3994
3995 static int
3996 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
3997 {
3998         struct crypto_testsuite_params *ts_params = &testsuite_params;
3999         struct crypto_unittest_params *ut_params = &unittest_params;
4000         uint8_t *plaintext, *ciphertext;
4001         int retval;
4002         uint32_t plaintext_len;
4003         uint32_t plaintext_pad_len;
4004         uint8_t extra_offset = 4;
4005         uint8_t *expected_ciphertext_shifted;
4006         struct rte_cryptodev_info dev_info;
4007
4008         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4009         uint64_t feat_flags = dev_info.feature_flags;
4010
4011         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4012                         ((tdata->validDataLenInBits.len % 8) != 0)) {
4013                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4014                 return -ENOTSUP;
4015         }
4016
4017         /* Verify the capabilities */
4018         struct rte_cryptodev_sym_capability_idx cap_idx;
4019         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4020         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4021         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4022                         &cap_idx) == NULL)
4023                 return -ENOTSUP;
4024
4025         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4026                 return -ENOTSUP;
4027
4028         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4029                 return -ENOTSUP;
4030
4031         /* Create SNOW 3G session */
4032         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4033                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4034                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4035                                         tdata->key.data, tdata->key.len,
4036                                         tdata->cipher_iv.len);
4037         if (retval < 0)
4038                 return retval;
4039
4040         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4041         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4042
4043         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4044                         "Failed to allocate input buffer in mempool");
4045         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4046                         "Failed to allocate output buffer in mempool");
4047
4048         /* Clear mbuf payload */
4049         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4050                rte_pktmbuf_tailroom(ut_params->ibuf));
4051
4052         plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4053         /*
4054          * Append data which is padded to a
4055          * multiple of the algorithms block size
4056          */
4057         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4058
4059         plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4060                                                 plaintext_pad_len);
4061
4062         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4063
4064         memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4065         buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4066
4067 #ifdef RTE_APP_TEST_DEBUG
4068         rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4069 #endif
4070         /* Create SNOW 3G operation */
4071         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4072                                         tdata->cipher_iv.len,
4073                                         tdata->validCipherLenInBits.len,
4074                                         extra_offset);
4075         if (retval < 0)
4076                 return retval;
4077
4078         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4079                                                 ut_params->op);
4080         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4081
4082         ut_params->obuf = ut_params->op->sym->m_dst;
4083         if (ut_params->obuf)
4084                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4085         else
4086                 ciphertext = plaintext;
4087
4088 #ifdef RTE_APP_TEST_DEBUG
4089         rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4090 #endif
4091
4092         expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4093
4094         TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4095                         "failed to reserve memory for ciphertext shifted\n");
4096
4097         memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4098                         ceil_byte_length(tdata->ciphertext.len));
4099         buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4100                         extra_offset);
4101         /* Validate obuf */
4102         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4103                 ciphertext,
4104                 expected_ciphertext_shifted,
4105                 tdata->validDataLenInBits.len,
4106                 extra_offset,
4107                 "SNOW 3G Ciphertext data not as expected");
4108         return 0;
4109 }
4110
4111 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4112 {
4113         struct crypto_testsuite_params *ts_params = &testsuite_params;
4114         struct crypto_unittest_params *ut_params = &unittest_params;
4115
4116         int retval;
4117
4118         uint8_t *plaintext, *ciphertext;
4119         unsigned ciphertext_pad_len;
4120         unsigned ciphertext_len;
4121         struct rte_cryptodev_info dev_info;
4122
4123         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4124         uint64_t feat_flags = dev_info.feature_flags;
4125
4126         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4127                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4128                 printf("Device doesn't support RAW data-path APIs.\n");
4129                 return -ENOTSUP;
4130         }
4131
4132         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4133                 return -ENOTSUP;
4134
4135         /* Verify the capabilities */
4136         struct rte_cryptodev_sym_capability_idx cap_idx;
4137         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4138         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4139         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4140                         &cap_idx) == NULL)
4141                 return -ENOTSUP;
4142
4143         /* Create SNOW 3G session */
4144         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4145                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4146                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4147                                         tdata->key.data, tdata->key.len,
4148                                         tdata->cipher_iv.len);
4149         if (retval < 0)
4150                 return retval;
4151
4152         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4153
4154         /* Clear mbuf payload */
4155         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4156                rte_pktmbuf_tailroom(ut_params->ibuf));
4157
4158         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4159         /* Append data which is padded to a multiple of */
4160         /* the algorithms block size */
4161         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4162         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4163                                 ciphertext_pad_len);
4164         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4165
4166         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4167
4168         /* Create SNOW 3G operation */
4169         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4170                                         tdata->cipher_iv.len,
4171                                         tdata->validCipherLenInBits.len,
4172                                         tdata->cipher.offset_bits);
4173         if (retval < 0)
4174                 return retval;
4175
4176         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4177                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4178                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4179         else
4180                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4181                                                 ut_params->op);
4182         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4183         ut_params->obuf = ut_params->op->sym->m_dst;
4184         if (ut_params->obuf)
4185                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4186         else
4187                 plaintext = ciphertext;
4188
4189         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4190
4191         /* Validate obuf */
4192         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4193                                 tdata->plaintext.data,
4194                                 tdata->validDataLenInBits.len,
4195                                 "SNOW 3G Plaintext data not as expected");
4196         return 0;
4197 }
4198
4199 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4200 {
4201         struct crypto_testsuite_params *ts_params = &testsuite_params;
4202         struct crypto_unittest_params *ut_params = &unittest_params;
4203
4204         int retval;
4205
4206         uint8_t *plaintext, *ciphertext;
4207         unsigned ciphertext_pad_len;
4208         unsigned ciphertext_len;
4209
4210         /* Verify the capabilities */
4211         struct rte_cryptodev_sym_capability_idx cap_idx;
4212         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4213         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4214         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4215                         &cap_idx) == NULL)
4216                 return -ENOTSUP;
4217
4218         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4219                 return -ENOTSUP;
4220
4221         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4222                 return -ENOTSUP;
4223
4224         /* Create SNOW 3G session */
4225         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4226                                         RTE_CRYPTO_CIPHER_OP_DECRYPT,
4227                                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4228                                         tdata->key.data, tdata->key.len,
4229                                         tdata->cipher_iv.len);
4230         if (retval < 0)
4231                 return retval;
4232
4233         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4234         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4235
4236         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4237                         "Failed to allocate input buffer");
4238         TEST_ASSERT_NOT_NULL(ut_params->obuf,
4239                         "Failed to allocate output buffer");
4240
4241         /* Clear mbuf payload */
4242         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4243                rte_pktmbuf_tailroom(ut_params->ibuf));
4244
4245         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4246                        rte_pktmbuf_tailroom(ut_params->obuf));
4247
4248         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4249         /* Append data which is padded to a multiple of */
4250         /* the algorithms block size */
4251         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4252         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4253                                 ciphertext_pad_len);
4254         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4255         memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4256
4257         debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4258
4259         /* Create SNOW 3G operation */
4260         retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4261                                         tdata->cipher_iv.len,
4262                                         tdata->validCipherLenInBits.len,
4263                                         0);
4264         if (retval < 0)
4265                 return retval;
4266
4267         ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4268                                                 ut_params->op);
4269         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4270         ut_params->obuf = ut_params->op->sym->m_dst;
4271         if (ut_params->obuf)
4272                 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4273         else
4274                 plaintext = ciphertext;
4275
4276         debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4277
4278         /* Validate obuf */
4279         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4280                                 tdata->plaintext.data,
4281                                 tdata->validDataLenInBits.len,
4282                                 "SNOW 3G Plaintext data not as expected");
4283         return 0;
4284 }
4285
4286 static int
4287 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4288 {
4289         struct crypto_testsuite_params *ts_params = &testsuite_params;
4290         struct crypto_unittest_params *ut_params = &unittest_params;
4291
4292         int retval;
4293
4294         uint8_t *plaintext, *ciphertext;
4295         unsigned int plaintext_pad_len;
4296         unsigned int plaintext_len;
4297
4298         struct rte_cryptodev_info dev_info;
4299         struct rte_cryptodev_sym_capability_idx cap_idx;
4300
4301         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4302         uint64_t feat_flags = dev_info.feature_flags;
4303
4304         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4305                         ((tdata->validAuthLenInBits.len % 8 != 0) ||
4306                         (tdata->validDataLenInBits.len % 8 != 0))) {
4307                 printf("Device doesn't support NON-Byte Aligned Data.\n");
4308                 return -ENOTSUP;
4309         }
4310
4311         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4312                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4313                 printf("Device doesn't support RAW data-path APIs.\n");
4314                 return -ENOTSUP;
4315         }
4316
4317         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4318                 return -ENOTSUP;
4319
4320         /* Check if device supports ZUC EEA3 */
4321         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4322         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4323
4324         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4325                         &cap_idx) == NULL)
4326                 return -ENOTSUP;
4327
4328         /* Check if device supports ZUC EIA3 */
4329         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4330         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4331
4332         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4333                         &cap_idx) == NULL)
4334                 return -ENOTSUP;
4335
4336         /* Create ZUC session */
4337         retval = create_zuc_cipher_auth_encrypt_generate_session(
4338                         ts_params->valid_devs[0],
4339                         tdata);
4340         if (retval < 0)
4341                 return retval;
4342         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4343
4344         /* clear mbuf payload */
4345         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4346                         rte_pktmbuf_tailroom(ut_params->ibuf));
4347
4348         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4349         /* Append data which is padded to a multiple of */
4350         /* the algorithms block size */
4351         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4352         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4353                                 plaintext_pad_len);
4354         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4355
4356         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4357
4358         /* Create ZUC operation */
4359         retval = create_zuc_cipher_hash_generate_operation(tdata);
4360         if (retval < 0)
4361                 return retval;
4362
4363         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4364                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4365                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4366         else
4367                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4368                         ut_params->op);
4369         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4370         ut_params->obuf = ut_params->op->sym->m_src;
4371         if (ut_params->obuf)
4372                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4373         else
4374                 ciphertext = plaintext;
4375
4376         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4377         /* Validate obuf */
4378         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4379                         ciphertext,
4380                         tdata->ciphertext.data,
4381                         tdata->validDataLenInBits.len,
4382                         "ZUC Ciphertext data not as expected");
4383
4384         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4385             + plaintext_pad_len;
4386
4387         /* Validate obuf */
4388         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4389                         ut_params->digest,
4390                         tdata->digest.data,
4391                         4,
4392                         "ZUC Generated auth tag not as expected");
4393         return 0;
4394 }
4395
4396 static int
4397 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4398 {
4399         struct crypto_testsuite_params *ts_params = &testsuite_params;
4400         struct crypto_unittest_params *ut_params = &unittest_params;
4401
4402         int retval;
4403
4404         uint8_t *plaintext, *ciphertext;
4405         unsigned plaintext_pad_len;
4406         unsigned plaintext_len;
4407         struct rte_cryptodev_info dev_info;
4408
4409         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4410         uint64_t feat_flags = dev_info.feature_flags;
4411
4412         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4413                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4414                 printf("Device doesn't support RAW data-path APIs.\n");
4415                 return -ENOTSUP;
4416         }
4417
4418         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4419                 return -ENOTSUP;
4420
4421         /* Verify the capabilities */
4422         struct rte_cryptodev_sym_capability_idx cap_idx;
4423         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4424         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4425         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4426                         &cap_idx) == NULL)
4427                 return -ENOTSUP;
4428         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4429         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4430         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4431                         &cap_idx) == NULL)
4432                 return -ENOTSUP;
4433
4434         /* Create SNOW 3G session */
4435         retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4436                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4437                         RTE_CRYPTO_AUTH_OP_GENERATE,
4438                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4439                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4440                         tdata->key.data, tdata->key.len,
4441                         tdata->auth_iv.len, tdata->digest.len,
4442                         tdata->cipher_iv.len);
4443         if (retval < 0)
4444                 return retval;
4445         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4446
4447         /* clear mbuf payload */
4448         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4449                         rte_pktmbuf_tailroom(ut_params->ibuf));
4450
4451         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4452         /* Append data which is padded to a multiple of */
4453         /* the algorithms block size */
4454         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4455         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4456                                 plaintext_pad_len);
4457         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4458
4459         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4460
4461         /* Create SNOW 3G operation */
4462         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4463                         tdata->digest.len, tdata->auth_iv.data,
4464                         tdata->auth_iv.len,
4465                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4466                         tdata->cipher_iv.data, tdata->cipher_iv.len,
4467                         tdata->validCipherLenInBits.len,
4468                         0,
4469                         tdata->validAuthLenInBits.len,
4470                         0
4471                         );
4472         if (retval < 0)
4473                 return retval;
4474
4475         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4476                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4477                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4478         else
4479                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4480                         ut_params->op);
4481         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4482         ut_params->obuf = ut_params->op->sym->m_src;
4483         if (ut_params->obuf)
4484                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4485         else
4486                 ciphertext = plaintext;
4487
4488         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4489         /* Validate obuf */
4490         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4491                         ciphertext,
4492                         tdata->ciphertext.data,
4493                         tdata->validDataLenInBits.len,
4494                         "SNOW 3G Ciphertext data not as expected");
4495
4496         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4497             + plaintext_pad_len;
4498
4499         /* Validate obuf */
4500         TEST_ASSERT_BUFFERS_ARE_EQUAL(
4501                         ut_params->digest,
4502                         tdata->digest.data,
4503                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4504                         "SNOW 3G Generated auth tag not as expected");
4505         return 0;
4506 }
4507
4508 static int
4509 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4510         uint8_t op_mode, uint8_t verify)
4511 {
4512         struct crypto_testsuite_params *ts_params = &testsuite_params;
4513         struct crypto_unittest_params *ut_params = &unittest_params;
4514
4515         int retval;
4516
4517         uint8_t *plaintext = NULL, *ciphertext = NULL;
4518         unsigned int plaintext_pad_len;
4519         unsigned int plaintext_len;
4520         unsigned int ciphertext_pad_len;
4521         unsigned int ciphertext_len;
4522
4523         struct rte_cryptodev_info dev_info;
4524
4525         /* Verify the capabilities */
4526         struct rte_cryptodev_sym_capability_idx cap_idx;
4527         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4528         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4529         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4530                         &cap_idx) == NULL)
4531                 return -ENOTSUP;
4532         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4533         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4534         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4535                         &cap_idx) == NULL)
4536                 return -ENOTSUP;
4537
4538         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4539                 return -ENOTSUP;
4540
4541         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4542
4543         uint64_t feat_flags = dev_info.feature_flags;
4544
4545         if (op_mode == OUT_OF_PLACE) {
4546                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4547                         printf("Device doesn't support digest encrypted.\n");
4548                         return -ENOTSUP;
4549                 }
4550                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4551                         return -ENOTSUP;
4552         }
4553
4554         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4555                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4556                 printf("Device doesn't support RAW data-path APIs.\n");
4557                 return -ENOTSUP;
4558         }
4559
4560         /* Create SNOW 3G session */
4561         retval = create_wireless_algo_auth_cipher_session(
4562                         ts_params->valid_devs[0],
4563                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4564                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4565                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4566                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4567                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4568                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4569                         tdata->key.data, tdata->key.len,
4570                         tdata->auth_iv.len, tdata->digest.len,
4571                         tdata->cipher_iv.len);
4572
4573         if (retval < 0)
4574                 return retval;
4575
4576         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4577         if (op_mode == OUT_OF_PLACE)
4578                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4579
4580         /* clear mbuf payload */
4581         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4582                 rte_pktmbuf_tailroom(ut_params->ibuf));
4583         if (op_mode == OUT_OF_PLACE)
4584                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4585                         rte_pktmbuf_tailroom(ut_params->obuf));
4586
4587         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4588         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4589         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4590         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4591
4592         if (verify) {
4593                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4594                                         ciphertext_pad_len);
4595                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4596                 if (op_mode == OUT_OF_PLACE)
4597                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4598                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4599                         ciphertext_len);
4600         } else {
4601                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4602                                         plaintext_pad_len);
4603                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4604                 if (op_mode == OUT_OF_PLACE)
4605                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4606                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4607         }
4608
4609         /* Create SNOW 3G operation */
4610         retval = create_wireless_algo_auth_cipher_operation(
4611                 tdata->digest.data, tdata->digest.len,
4612                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4613                 tdata->auth_iv.data, tdata->auth_iv.len,
4614                 (tdata->digest.offset_bytes == 0 ?
4615                 (verify ? ciphertext_pad_len : plaintext_pad_len)
4616                         : tdata->digest.offset_bytes),
4617                 tdata->validCipherLenInBits.len,
4618                 tdata->cipher.offset_bits,
4619                 tdata->validAuthLenInBits.len,
4620                 tdata->auth.offset_bits,
4621                 op_mode, 0, verify);
4622
4623         if (retval < 0)
4624                 return retval;
4625
4626         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4627                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4628                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4629         else
4630                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4631                         ut_params->op);
4632
4633         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4634
4635         ut_params->obuf = (op_mode == IN_PLACE ?
4636                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4637
4638         if (verify) {
4639                 if (ut_params->obuf)
4640                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
4641                                                         uint8_t *);
4642                 else
4643                         plaintext = ciphertext +
4644                                 (tdata->cipher.offset_bits >> 3);
4645
4646                 debug_hexdump(stdout, "plaintext:", plaintext,
4647                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4648                 debug_hexdump(stdout, "plaintext expected:",
4649                         tdata->plaintext.data,
4650                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4651         } else {
4652                 if (ut_params->obuf)
4653                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
4654                                                         uint8_t *);
4655                 else
4656                         ciphertext = plaintext;
4657
4658                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4659                         ciphertext_len);
4660                 debug_hexdump(stdout, "ciphertext expected:",
4661                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4662
4663                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4664                         + (tdata->digest.offset_bytes == 0 ?
4665                 plaintext_pad_len : tdata->digest.offset_bytes);
4666
4667                 debug_hexdump(stdout, "digest:", ut_params->digest,
4668                         tdata->digest.len);
4669                 debug_hexdump(stdout, "digest expected:", tdata->digest.data,
4670                                 tdata->digest.len);
4671         }
4672
4673         /* Validate obuf */
4674         if (verify) {
4675                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4676                         plaintext,
4677                         tdata->plaintext.data,
4678                         tdata->plaintext.len >> 3,
4679                         "SNOW 3G Plaintext data not as expected");
4680         } else {
4681                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4682                         ciphertext,
4683                         tdata->ciphertext.data,
4684                         tdata->validDataLenInBits.len,
4685                         "SNOW 3G Ciphertext data not as expected");
4686
4687                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4688                         ut_params->digest,
4689                         tdata->digest.data,
4690                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4691                         "SNOW 3G Generated auth tag not as expected");
4692         }
4693         return 0;
4694 }
4695
4696 static int
4697 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
4698         uint8_t op_mode, uint8_t verify)
4699 {
4700         struct crypto_testsuite_params *ts_params = &testsuite_params;
4701         struct crypto_unittest_params *ut_params = &unittest_params;
4702
4703         int retval;
4704
4705         const uint8_t *plaintext = NULL;
4706         const uint8_t *ciphertext = NULL;
4707         const uint8_t *digest = NULL;
4708         unsigned int plaintext_pad_len;
4709         unsigned int plaintext_len;
4710         unsigned int ciphertext_pad_len;
4711         unsigned int ciphertext_len;
4712         uint8_t buffer[10000];
4713         uint8_t digest_buffer[10000];
4714
4715         struct rte_cryptodev_info dev_info;
4716
4717         /* Verify the capabilities */
4718         struct rte_cryptodev_sym_capability_idx cap_idx;
4719         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4720         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4721         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4722                         &cap_idx) == NULL)
4723                 return -ENOTSUP;
4724         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4725         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4726         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4727                         &cap_idx) == NULL)
4728                 return -ENOTSUP;
4729
4730         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4731                 return -ENOTSUP;
4732
4733         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4734
4735         uint64_t feat_flags = dev_info.feature_flags;
4736
4737         if (op_mode == IN_PLACE) {
4738                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
4739                         printf("Device doesn't support in-place scatter-gather "
4740                                         "in both input and output mbufs.\n");
4741                         return -ENOTSUP;
4742                 }
4743                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4744                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4745                         printf("Device doesn't support RAW data-path APIs.\n");
4746                         return -ENOTSUP;
4747                 }
4748         } else {
4749                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4750                         return -ENOTSUP;
4751                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4752                         printf("Device doesn't support out-of-place scatter-gather "
4753                                         "in both input and output mbufs.\n");
4754                         return -ENOTSUP;
4755                 }
4756                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4757                         printf("Device doesn't support digest encrypted.\n");
4758                         return -ENOTSUP;
4759                 }
4760         }
4761
4762         /* Create SNOW 3G session */
4763         retval = create_wireless_algo_auth_cipher_session(
4764                         ts_params->valid_devs[0],
4765                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4766                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4767                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4768                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4769                         RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4770                         RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4771                         tdata->key.data, tdata->key.len,
4772                         tdata->auth_iv.len, tdata->digest.len,
4773                         tdata->cipher_iv.len);
4774
4775         if (retval < 0)
4776                 return retval;
4777
4778         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4779         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4780         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4781         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4782
4783         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4784                         plaintext_pad_len, 15, 0);
4785         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4786                         "Failed to allocate input buffer in mempool");
4787
4788         if (op_mode == OUT_OF_PLACE) {
4789                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4790                                 plaintext_pad_len, 15, 0);
4791                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4792                                 "Failed to allocate output buffer in mempool");
4793         }
4794
4795         if (verify) {
4796                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
4797                         tdata->ciphertext.data);
4798                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4799                                         ciphertext_len, buffer);
4800                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4801                         ciphertext_len);
4802         } else {
4803                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
4804                         tdata->plaintext.data);
4805                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4806                                         plaintext_len, buffer);
4807                 debug_hexdump(stdout, "plaintext:", plaintext,
4808                         plaintext_len);
4809         }
4810         memset(buffer, 0, sizeof(buffer));
4811
4812         /* Create SNOW 3G operation */
4813         retval = create_wireless_algo_auth_cipher_operation(
4814                 tdata->digest.data, tdata->digest.len,
4815                 tdata->cipher_iv.data, tdata->cipher_iv.len,
4816                 tdata->auth_iv.data, tdata->auth_iv.len,
4817                 (tdata->digest.offset_bytes == 0 ?
4818                 (verify ? ciphertext_pad_len : plaintext_pad_len)
4819                         : tdata->digest.offset_bytes),
4820                 tdata->validCipherLenInBits.len,
4821                 tdata->cipher.offset_bits,
4822                 tdata->validAuthLenInBits.len,
4823                 tdata->auth.offset_bits,
4824                 op_mode, 1, verify);
4825
4826         if (retval < 0)
4827                 return retval;
4828
4829         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4830                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4831                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4832         else
4833                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4834                         ut_params->op);
4835
4836         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4837
4838         ut_params->obuf = (op_mode == IN_PLACE ?
4839                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4840
4841         if (verify) {
4842                 if (ut_params->obuf)
4843                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
4844                                         plaintext_len, buffer);
4845                 else
4846                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4847                                         plaintext_len, buffer);
4848
4849                 debug_hexdump(stdout, "plaintext:", plaintext,
4850                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4851                 debug_hexdump(stdout, "plaintext expected:",
4852                         tdata->plaintext.data,
4853                         (tdata->plaintext.len >> 3) - tdata->digest.len);
4854         } else {
4855                 if (ut_params->obuf)
4856                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4857                                         ciphertext_len, buffer);
4858                 else
4859                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4860                                         ciphertext_len, buffer);
4861
4862                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4863                         ciphertext_len);
4864                 debug_hexdump(stdout, "ciphertext expected:",
4865                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4866
4867                 if (ut_params->obuf)
4868                         digest = rte_pktmbuf_read(ut_params->obuf,
4869                                 (tdata->digest.offset_bytes == 0 ?
4870                                 plaintext_pad_len : tdata->digest.offset_bytes),
4871                                 tdata->digest.len, digest_buffer);
4872                 else
4873                         digest = rte_pktmbuf_read(ut_params->ibuf,
4874                                 (tdata->digest.offset_bytes == 0 ?
4875                                 plaintext_pad_len : tdata->digest.offset_bytes),
4876                                 tdata->digest.len, digest_buffer);
4877
4878                 debug_hexdump(stdout, "digest:", digest,
4879                         tdata->digest.len);
4880                 debug_hexdump(stdout, "digest expected:",
4881                         tdata->digest.data, tdata->digest.len);
4882         }
4883
4884         /* Validate obuf */
4885         if (verify) {
4886                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4887                         plaintext,
4888                         tdata->plaintext.data,
4889                         tdata->plaintext.len >> 3,
4890                         "SNOW 3G Plaintext data not as expected");
4891         } else {
4892                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4893                         ciphertext,
4894                         tdata->ciphertext.data,
4895                         tdata->validDataLenInBits.len,
4896                         "SNOW 3G Ciphertext data not as expected");
4897
4898                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4899                         digest,
4900                         tdata->digest.data,
4901                         DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4902                         "SNOW 3G Generated auth tag not as expected");
4903         }
4904         return 0;
4905 }
4906
4907 static int
4908 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
4909         uint8_t op_mode, uint8_t verify)
4910 {
4911         struct crypto_testsuite_params *ts_params = &testsuite_params;
4912         struct crypto_unittest_params *ut_params = &unittest_params;
4913
4914         int retval;
4915
4916         uint8_t *plaintext = NULL, *ciphertext = NULL;
4917         unsigned int plaintext_pad_len;
4918         unsigned int plaintext_len;
4919         unsigned int ciphertext_pad_len;
4920         unsigned int ciphertext_len;
4921
4922         struct rte_cryptodev_info dev_info;
4923
4924         /* Verify the capabilities */
4925         struct rte_cryptodev_sym_capability_idx cap_idx;
4926         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4927         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
4928         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4929                         &cap_idx) == NULL)
4930                 return -ENOTSUP;
4931         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4932         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4933         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4934                         &cap_idx) == NULL)
4935                 return -ENOTSUP;
4936
4937         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4938
4939         uint64_t feat_flags = dev_info.feature_flags;
4940
4941         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4942                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4943                 printf("Device doesn't support RAW data-path APIs.\n");
4944                 return -ENOTSUP;
4945         }
4946
4947         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4948                 return -ENOTSUP;
4949
4950         if (op_mode == OUT_OF_PLACE) {
4951                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4952                         return -ENOTSUP;
4953                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4954                         printf("Device doesn't support digest encrypted.\n");
4955                         return -ENOTSUP;
4956                 }
4957         }
4958
4959         /* Create KASUMI session */
4960         retval = create_wireless_algo_auth_cipher_session(
4961                         ts_params->valid_devs[0],
4962                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4963                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4964                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4965                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
4966                         RTE_CRYPTO_AUTH_KASUMI_F9,
4967                         RTE_CRYPTO_CIPHER_KASUMI_F8,
4968                         tdata->key.data, tdata->key.len,
4969                         0, tdata->digest.len,
4970                         tdata->cipher_iv.len);
4971
4972         if (retval < 0)
4973                 return retval;
4974
4975         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4976         if (op_mode == OUT_OF_PLACE)
4977                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4978
4979         /* clear mbuf payload */
4980         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4981                 rte_pktmbuf_tailroom(ut_params->ibuf));
4982         if (op_mode == OUT_OF_PLACE)
4983                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4984                         rte_pktmbuf_tailroom(ut_params->obuf));
4985
4986         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4987         plaintext_len = ceil_byte_length(tdata->plaintext.len);
4988         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4989         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4990
4991         if (verify) {
4992                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4993                                         ciphertext_pad_len);
4994                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4995                 if (op_mode == OUT_OF_PLACE)
4996                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4997                 debug_hexdump(stdout, "ciphertext:", ciphertext,
4998                         ciphertext_len);
4999         } else {
5000                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5001                                         plaintext_pad_len);
5002                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5003                 if (op_mode == OUT_OF_PLACE)
5004                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5005                 debug_hexdump(stdout, "plaintext:", plaintext,
5006                         plaintext_len);
5007         }
5008
5009         /* Create KASUMI operation */
5010         retval = create_wireless_algo_auth_cipher_operation(
5011                 tdata->digest.data, tdata->digest.len,
5012                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5013                 NULL, 0,
5014                 (tdata->digest.offset_bytes == 0 ?
5015                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5016                         : tdata->digest.offset_bytes),
5017                 tdata->validCipherLenInBits.len,
5018                 tdata->validCipherOffsetInBits.len,
5019                 tdata->validAuthLenInBits.len,
5020                 0,
5021                 op_mode, 0, verify);
5022
5023         if (retval < 0)
5024                 return retval;
5025
5026         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5027                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5028                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5029         else
5030                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5031                         ut_params->op);
5032
5033         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5034
5035         ut_params->obuf = (op_mode == IN_PLACE ?
5036                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5037
5038
5039         if (verify) {
5040                 if (ut_params->obuf)
5041                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5042                                                         uint8_t *);
5043                 else
5044                         plaintext = ciphertext;
5045
5046                 debug_hexdump(stdout, "plaintext:", plaintext,
5047                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5048                 debug_hexdump(stdout, "plaintext expected:",
5049                         tdata->plaintext.data,
5050                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5051         } else {
5052                 if (ut_params->obuf)
5053                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5054                                                         uint8_t *);
5055                 else
5056                         ciphertext = plaintext;
5057
5058                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5059                         ciphertext_len);
5060                 debug_hexdump(stdout, "ciphertext expected:",
5061                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5062
5063                 ut_params->digest = rte_pktmbuf_mtod(
5064                         ut_params->obuf, uint8_t *) +
5065                         (tdata->digest.offset_bytes == 0 ?
5066                         plaintext_pad_len : tdata->digest.offset_bytes);
5067
5068                 debug_hexdump(stdout, "digest:", ut_params->digest,
5069                         tdata->digest.len);
5070                 debug_hexdump(stdout, "digest expected:",
5071                         tdata->digest.data, tdata->digest.len);
5072         }
5073
5074         /* Validate obuf */
5075         if (verify) {
5076                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5077                         plaintext,
5078                         tdata->plaintext.data,
5079                         tdata->plaintext.len >> 3,
5080                         "KASUMI Plaintext data not as expected");
5081         } else {
5082                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5083                         ciphertext,
5084                         tdata->ciphertext.data,
5085                         tdata->ciphertext.len >> 3,
5086                         "KASUMI Ciphertext data not as expected");
5087
5088                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5089                         ut_params->digest,
5090                         tdata->digest.data,
5091                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5092                         "KASUMI Generated auth tag not as expected");
5093         }
5094         return 0;
5095 }
5096
5097 static int
5098 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5099         uint8_t op_mode, uint8_t verify)
5100 {
5101         struct crypto_testsuite_params *ts_params = &testsuite_params;
5102         struct crypto_unittest_params *ut_params = &unittest_params;
5103
5104         int retval;
5105
5106         const uint8_t *plaintext = NULL;
5107         const uint8_t *ciphertext = NULL;
5108         const uint8_t *digest = NULL;
5109         unsigned int plaintext_pad_len;
5110         unsigned int plaintext_len;
5111         unsigned int ciphertext_pad_len;
5112         unsigned int ciphertext_len;
5113         uint8_t buffer[10000];
5114         uint8_t digest_buffer[10000];
5115
5116         struct rte_cryptodev_info dev_info;
5117
5118         /* Verify the capabilities */
5119         struct rte_cryptodev_sym_capability_idx cap_idx;
5120         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5121         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5122         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5123                         &cap_idx) == NULL)
5124                 return -ENOTSUP;
5125         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5126         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5127         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5128                         &cap_idx) == NULL)
5129                 return -ENOTSUP;
5130
5131         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5132                 return -ENOTSUP;
5133
5134         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5135
5136         uint64_t feat_flags = dev_info.feature_flags;
5137
5138         if (op_mode == IN_PLACE) {
5139                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5140                         printf("Device doesn't support in-place scatter-gather "
5141                                         "in both input and output mbufs.\n");
5142                         return -ENOTSUP;
5143                 }
5144                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5145                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5146                         printf("Device doesn't support RAW data-path APIs.\n");
5147                         return -ENOTSUP;
5148                 }
5149         } else {
5150                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5151                         return -ENOTSUP;
5152                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5153                         printf("Device doesn't support out-of-place scatter-gather "
5154                                         "in both input and output mbufs.\n");
5155                         return -ENOTSUP;
5156                 }
5157                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5158                         printf("Device doesn't support digest encrypted.\n");
5159                         return -ENOTSUP;
5160                 }
5161         }
5162
5163         /* Create KASUMI session */
5164         retval = create_wireless_algo_auth_cipher_session(
5165                         ts_params->valid_devs[0],
5166                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5167                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5168                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5169                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5170                         RTE_CRYPTO_AUTH_KASUMI_F9,
5171                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5172                         tdata->key.data, tdata->key.len,
5173                         0, tdata->digest.len,
5174                         tdata->cipher_iv.len);
5175
5176         if (retval < 0)
5177                 return retval;
5178
5179         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5180         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5181         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5182         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5183
5184         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5185                         plaintext_pad_len, 15, 0);
5186         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5187                         "Failed to allocate input buffer in mempool");
5188
5189         if (op_mode == OUT_OF_PLACE) {
5190                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5191                                 plaintext_pad_len, 15, 0);
5192                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5193                                 "Failed to allocate output buffer in mempool");
5194         }
5195
5196         if (verify) {
5197                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5198                         tdata->ciphertext.data);
5199                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5200                                         ciphertext_len, buffer);
5201                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5202                         ciphertext_len);
5203         } else {
5204                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5205                         tdata->plaintext.data);
5206                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5207                                         plaintext_len, buffer);
5208                 debug_hexdump(stdout, "plaintext:", plaintext,
5209                         plaintext_len);
5210         }
5211         memset(buffer, 0, sizeof(buffer));
5212
5213         /* Create KASUMI operation */
5214         retval = create_wireless_algo_auth_cipher_operation(
5215                 tdata->digest.data, tdata->digest.len,
5216                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5217                 NULL, 0,
5218                 (tdata->digest.offset_bytes == 0 ?
5219                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5220                         : tdata->digest.offset_bytes),
5221                 tdata->validCipherLenInBits.len,
5222                 tdata->validCipherOffsetInBits.len,
5223                 tdata->validAuthLenInBits.len,
5224                 0,
5225                 op_mode, 1, verify);
5226
5227         if (retval < 0)
5228                 return retval;
5229
5230         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5231                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5232                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5233         else
5234                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5235                         ut_params->op);
5236
5237         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5238
5239         ut_params->obuf = (op_mode == IN_PLACE ?
5240                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5241
5242         if (verify) {
5243                 if (ut_params->obuf)
5244                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5245                                         plaintext_len, buffer);
5246                 else
5247                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5248                                         plaintext_len, buffer);
5249
5250                 debug_hexdump(stdout, "plaintext:", plaintext,
5251                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5252                 debug_hexdump(stdout, "plaintext expected:",
5253                         tdata->plaintext.data,
5254                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5255         } else {
5256                 if (ut_params->obuf)
5257                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5258                                         ciphertext_len, buffer);
5259                 else
5260                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5261                                         ciphertext_len, buffer);
5262
5263                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5264                         ciphertext_len);
5265                 debug_hexdump(stdout, "ciphertext expected:",
5266                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5267
5268                 if (ut_params->obuf)
5269                         digest = rte_pktmbuf_read(ut_params->obuf,
5270                                 (tdata->digest.offset_bytes == 0 ?
5271                                 plaintext_pad_len : tdata->digest.offset_bytes),
5272                                 tdata->digest.len, digest_buffer);
5273                 else
5274                         digest = rte_pktmbuf_read(ut_params->ibuf,
5275                                 (tdata->digest.offset_bytes == 0 ?
5276                                 plaintext_pad_len : tdata->digest.offset_bytes),
5277                                 tdata->digest.len, digest_buffer);
5278
5279                 debug_hexdump(stdout, "digest:", digest,
5280                         tdata->digest.len);
5281                 debug_hexdump(stdout, "digest expected:",
5282                         tdata->digest.data, tdata->digest.len);
5283         }
5284
5285         /* Validate obuf */
5286         if (verify) {
5287                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5288                         plaintext,
5289                         tdata->plaintext.data,
5290                         tdata->plaintext.len >> 3,
5291                         "KASUMI Plaintext data not as expected");
5292         } else {
5293                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5294                         ciphertext,
5295                         tdata->ciphertext.data,
5296                         tdata->validDataLenInBits.len,
5297                         "KASUMI Ciphertext data not as expected");
5298
5299                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5300                         digest,
5301                         tdata->digest.data,
5302                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5303                         "KASUMI Generated auth tag not as expected");
5304         }
5305         return 0;
5306 }
5307
5308 static int
5309 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5310 {
5311         struct crypto_testsuite_params *ts_params = &testsuite_params;
5312         struct crypto_unittest_params *ut_params = &unittest_params;
5313
5314         int retval;
5315
5316         uint8_t *plaintext, *ciphertext;
5317         unsigned plaintext_pad_len;
5318         unsigned plaintext_len;
5319         struct rte_cryptodev_info dev_info;
5320
5321         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5322         uint64_t feat_flags = dev_info.feature_flags;
5323
5324         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5325                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5326                 printf("Device doesn't support RAW data-path APIs.\n");
5327                 return -ENOTSUP;
5328         }
5329
5330         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5331                 return -ENOTSUP;
5332
5333         /* Verify the capabilities */
5334         struct rte_cryptodev_sym_capability_idx cap_idx;
5335         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5336         cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5337         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5338                         &cap_idx) == NULL)
5339                 return -ENOTSUP;
5340         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5341         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5342         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5343                         &cap_idx) == NULL)
5344                 return -ENOTSUP;
5345
5346         /* Create KASUMI session */
5347         retval = create_wireless_algo_cipher_auth_session(
5348                         ts_params->valid_devs[0],
5349                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5350                         RTE_CRYPTO_AUTH_OP_GENERATE,
5351                         RTE_CRYPTO_AUTH_KASUMI_F9,
5352                         RTE_CRYPTO_CIPHER_KASUMI_F8,
5353                         tdata->key.data, tdata->key.len,
5354                         0, tdata->digest.len,
5355                         tdata->cipher_iv.len);
5356         if (retval < 0)
5357                 return retval;
5358
5359         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5360
5361         /* clear mbuf payload */
5362         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5363                         rte_pktmbuf_tailroom(ut_params->ibuf));
5364
5365         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5366         /* Append data which is padded to a multiple of */
5367         /* the algorithms block size */
5368         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5369         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5370                                 plaintext_pad_len);
5371         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5372
5373         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5374
5375         /* Create KASUMI operation */
5376         retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5377                                 tdata->digest.len, NULL, 0,
5378                                 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5379                                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5380                                 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5381                                 tdata->validCipherOffsetInBits.len,
5382                                 tdata->validAuthLenInBits.len,
5383                                 0
5384                                 );
5385         if (retval < 0)
5386                 return retval;
5387
5388         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5389                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5390                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5391         else
5392                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5393                         ut_params->op);
5394         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5395
5396         if (ut_params->op->sym->m_dst)
5397                 ut_params->obuf = ut_params->op->sym->m_dst;
5398         else
5399                 ut_params->obuf = ut_params->op->sym->m_src;
5400
5401         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5402                                 tdata->validCipherOffsetInBits.len >> 3);
5403
5404         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5405                         + plaintext_pad_len;
5406
5407         const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5408                                 (tdata->validCipherOffsetInBits.len >> 3);
5409         /* Validate obuf */
5410         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5411                 ciphertext,
5412                 reference_ciphertext,
5413                 tdata->validCipherLenInBits.len,
5414                 "KASUMI Ciphertext data not as expected");
5415
5416         /* Validate obuf */
5417         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5418                 ut_params->digest,
5419                 tdata->digest.data,
5420                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5421                 "KASUMI Generated auth tag not as expected");
5422         return 0;
5423 }
5424
5425 static int
5426 test_zuc_encryption(const struct wireless_test_data *tdata)
5427 {
5428         struct crypto_testsuite_params *ts_params = &testsuite_params;
5429         struct crypto_unittest_params *ut_params = &unittest_params;
5430
5431         int retval;
5432         uint8_t *plaintext, *ciphertext;
5433         unsigned plaintext_pad_len;
5434         unsigned plaintext_len;
5435         struct rte_cryptodev_info dev_info;
5436
5437         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5438         uint64_t feat_flags = dev_info.feature_flags;
5439
5440         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5441                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5442                 printf("Device doesn't support RAW data-path APIs.\n");
5443                 return -ENOTSUP;
5444         }
5445
5446         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5447                 return -ENOTSUP;
5448
5449         struct rte_cryptodev_sym_capability_idx cap_idx;
5450
5451         /* Check if device supports ZUC EEA3 */
5452         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5453         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5454
5455         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5456                         &cap_idx) == NULL)
5457                 return -ENOTSUP;
5458
5459         /* Create ZUC session */
5460         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5461                                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5462                                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5463                                         tdata->key.data, tdata->key.len,
5464                                         tdata->cipher_iv.len);
5465         if (retval < 0)
5466                 return retval;
5467
5468         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5469
5470         /* Clear mbuf payload */
5471         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5472                rte_pktmbuf_tailroom(ut_params->ibuf));
5473
5474         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5475         /* Append data which is padded to a multiple */
5476         /* of the algorithms block size */
5477         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5478         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5479                                 plaintext_pad_len);
5480         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5481
5482         debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5483
5484         /* Create ZUC operation */
5485         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5486                                         tdata->cipher_iv.len,
5487                                         tdata->plaintext.len,
5488                                         0);
5489         if (retval < 0)
5490                 return retval;
5491
5492         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5493                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5494                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5495         else
5496                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5497                                                 ut_params->op);
5498         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5499
5500         ut_params->obuf = ut_params->op->sym->m_dst;
5501         if (ut_params->obuf)
5502                 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5503         else
5504                 ciphertext = plaintext;
5505
5506         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5507
5508         /* Validate obuf */
5509         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5510                 ciphertext,
5511                 tdata->ciphertext.data,
5512                 tdata->validCipherLenInBits.len,
5513                 "ZUC Ciphertext data not as expected");
5514         return 0;
5515 }
5516
5517 static int
5518 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
5519 {
5520         struct crypto_testsuite_params *ts_params = &testsuite_params;
5521         struct crypto_unittest_params *ut_params = &unittest_params;
5522
5523         int retval;
5524
5525         unsigned int plaintext_pad_len;
5526         unsigned int plaintext_len;
5527         const uint8_t *ciphertext;
5528         uint8_t ciphertext_buffer[2048];
5529         struct rte_cryptodev_info dev_info;
5530
5531         struct rte_cryptodev_sym_capability_idx cap_idx;
5532
5533         /* Check if device supports ZUC EEA3 */
5534         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5535         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5536
5537         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5538                         &cap_idx) == NULL)
5539                 return -ENOTSUP;
5540
5541         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5542                 return -ENOTSUP;
5543
5544         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5545
5546         uint64_t feat_flags = dev_info.feature_flags;
5547
5548         if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5549                 printf("Device doesn't support in-place scatter-gather. "
5550                                 "Test Skipped.\n");
5551                 return -ENOTSUP;
5552         }
5553
5554         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5555                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5556                 printf("Device doesn't support RAW data-path APIs.\n");
5557                 return -ENOTSUP;
5558         }
5559
5560         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5561
5562         /* Append data which is padded to a multiple */
5563         /* of the algorithms block size */
5564         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5565
5566         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5567                         plaintext_pad_len, 10, 0);
5568
5569         pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5570                         tdata->plaintext.data);
5571
5572         /* Create ZUC session */
5573         retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5574                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5575                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5576                         tdata->key.data, tdata->key.len,
5577                         tdata->cipher_iv.len);
5578         if (retval < 0)
5579                 return retval;
5580
5581         /* Clear mbuf payload */
5582
5583         pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
5584
5585         /* Create ZUC operation */
5586         retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5587                         tdata->cipher_iv.len, tdata->plaintext.len,
5588                         0);
5589         if (retval < 0)
5590                 return retval;
5591
5592         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5593                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5594                                 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5595         else
5596                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5597                                                 ut_params->op);
5598         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5599
5600         ut_params->obuf = ut_params->op->sym->m_dst;
5601         if (ut_params->obuf)
5602                 ciphertext = rte_pktmbuf_read(ut_params->obuf,
5603                         0, plaintext_len, ciphertext_buffer);
5604         else
5605                 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
5606                         0, plaintext_len, ciphertext_buffer);
5607
5608         /* Validate obuf */
5609         debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5610
5611         /* Validate obuf */
5612         TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5613                 ciphertext,
5614                 tdata->ciphertext.data,
5615                 tdata->validCipherLenInBits.len,
5616                 "ZUC Ciphertext data not as expected");
5617
5618         return 0;
5619 }
5620
5621 static int
5622 test_zuc_authentication(const struct wireless_test_data *tdata)
5623 {
5624         struct crypto_testsuite_params *ts_params = &testsuite_params;
5625         struct crypto_unittest_params *ut_params = &unittest_params;
5626
5627         int retval;
5628         unsigned plaintext_pad_len;
5629         unsigned plaintext_len;
5630         uint8_t *plaintext;
5631
5632         struct rte_cryptodev_sym_capability_idx cap_idx;
5633         struct rte_cryptodev_info dev_info;
5634
5635         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5636         uint64_t feat_flags = dev_info.feature_flags;
5637
5638         if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
5639                         (tdata->validAuthLenInBits.len % 8 != 0)) {
5640                 printf("Device doesn't support NON-Byte Aligned Data.\n");
5641                 return -ENOTSUP;
5642         }
5643
5644         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5645                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5646                 printf("Device doesn't support RAW data-path APIs.\n");
5647                 return -ENOTSUP;
5648         }
5649
5650         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5651                 return -ENOTSUP;
5652
5653         /* Check if device supports ZUC EIA3 */
5654         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5655         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5656
5657         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5658                         &cap_idx) == NULL)
5659                 return -ENOTSUP;
5660
5661         /* Create ZUC session */
5662         retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
5663                         tdata->key.data, tdata->key.len,
5664                         tdata->auth_iv.len, tdata->digest.len,
5665                         RTE_CRYPTO_AUTH_OP_GENERATE,
5666                         RTE_CRYPTO_AUTH_ZUC_EIA3);
5667         if (retval < 0)
5668                 return retval;
5669
5670         /* alloc mbuf and set payload */
5671         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5672
5673         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5674         rte_pktmbuf_tailroom(ut_params->ibuf));
5675
5676         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5677         /* Append data which is padded to a multiple of */
5678         /* the algorithms block size */
5679         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5680         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5681                                 plaintext_pad_len);
5682         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5683
5684         /* Create ZUC operation */
5685         retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
5686                         tdata->auth_iv.data, tdata->auth_iv.len,
5687                         plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5688                         tdata->validAuthLenInBits.len,
5689                         0);
5690         if (retval < 0)
5691                 return retval;
5692
5693         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5694                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5695                                 ut_params->op, 0, 1, 1, 0);
5696         else
5697                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5698                                 ut_params->op);
5699         ut_params->obuf = ut_params->op->sym->m_src;
5700         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5701         ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5702                         + plaintext_pad_len;
5703
5704         /* Validate obuf */
5705         TEST_ASSERT_BUFFERS_ARE_EQUAL(
5706         ut_params->digest,
5707         tdata->digest.data,
5708         tdata->digest.len,
5709         "ZUC Generated auth tag not as expected");
5710
5711         return 0;
5712 }
5713
5714 static int
5715 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
5716         uint8_t op_mode, uint8_t verify)
5717 {
5718         struct crypto_testsuite_params *ts_params = &testsuite_params;
5719         struct crypto_unittest_params *ut_params = &unittest_params;
5720
5721         int retval;
5722
5723         uint8_t *plaintext = NULL, *ciphertext = NULL;
5724         unsigned int plaintext_pad_len;
5725         unsigned int plaintext_len;
5726         unsigned int ciphertext_pad_len;
5727         unsigned int ciphertext_len;
5728
5729         struct rte_cryptodev_info dev_info;
5730         struct rte_cryptodev_sym_capability_idx cap_idx;
5731
5732         /* Check if device supports ZUC EIA3 */
5733         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5734         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5735
5736         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5737                         &cap_idx) == NULL)
5738                 return -ENOTSUP;
5739
5740         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5741
5742         uint64_t feat_flags = dev_info.feature_flags;
5743
5744         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5745                 printf("Device doesn't support digest encrypted.\n");
5746                 return -ENOTSUP;
5747         }
5748         if (op_mode == IN_PLACE) {
5749                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5750                         printf("Device doesn't support in-place scatter-gather "
5751                                         "in both input and output mbufs.\n");
5752                         return -ENOTSUP;
5753                 }
5754
5755                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5756                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5757                         printf("Device doesn't support RAW data-path APIs.\n");
5758                         return -ENOTSUP;
5759                 }
5760         } else {
5761                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5762                         return -ENOTSUP;
5763                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5764                         printf("Device doesn't support out-of-place scatter-gather "
5765                                         "in both input and output mbufs.\n");
5766                         return -ENOTSUP;
5767                 }
5768         }
5769
5770         /* Create ZUC session */
5771         retval = create_wireless_algo_auth_cipher_session(
5772                         ts_params->valid_devs[0],
5773                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5774                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5775                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5776                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5777                         RTE_CRYPTO_AUTH_ZUC_EIA3,
5778                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5779                         tdata->key.data, tdata->key.len,
5780                         tdata->auth_iv.len, tdata->digest.len,
5781                         tdata->cipher_iv.len);
5782
5783         if (retval < 0)
5784                 return retval;
5785
5786         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5787         if (op_mode == OUT_OF_PLACE)
5788                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5789
5790         /* clear mbuf payload */
5791         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5792                 rte_pktmbuf_tailroom(ut_params->ibuf));
5793         if (op_mode == OUT_OF_PLACE)
5794                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5795                         rte_pktmbuf_tailroom(ut_params->obuf));
5796
5797         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5798         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5799         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5800         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5801
5802         if (verify) {
5803                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5804                                         ciphertext_pad_len);
5805                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5806                 if (op_mode == OUT_OF_PLACE)
5807                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5808                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5809                         ciphertext_len);
5810         } else {
5811                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5812                                         plaintext_pad_len);
5813                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5814                 if (op_mode == OUT_OF_PLACE)
5815                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5816                 debug_hexdump(stdout, "plaintext:", plaintext,
5817                         plaintext_len);
5818         }
5819
5820         /* Create ZUC operation */
5821         retval = create_wireless_algo_auth_cipher_operation(
5822                 tdata->digest.data, tdata->digest.len,
5823                 tdata->cipher_iv.data, tdata->cipher_iv.len,
5824                 tdata->auth_iv.data, tdata->auth_iv.len,
5825                 (tdata->digest.offset_bytes == 0 ?
5826                 (verify ? ciphertext_pad_len : plaintext_pad_len)
5827                         : tdata->digest.offset_bytes),
5828                 tdata->validCipherLenInBits.len,
5829                 tdata->validCipherOffsetInBits.len,
5830                 tdata->validAuthLenInBits.len,
5831                 0,
5832                 op_mode, 0, verify);
5833
5834         if (retval < 0)
5835                 return retval;
5836
5837         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5838                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5839                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5840         else
5841                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5842                         ut_params->op);
5843
5844         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5845
5846         ut_params->obuf = (op_mode == IN_PLACE ?
5847                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5848
5849
5850         if (verify) {
5851                 if (ut_params->obuf)
5852                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5853                                                         uint8_t *);
5854                 else
5855                         plaintext = ciphertext;
5856
5857                 debug_hexdump(stdout, "plaintext:", plaintext,
5858                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5859                 debug_hexdump(stdout, "plaintext expected:",
5860                         tdata->plaintext.data,
5861                         (tdata->plaintext.len >> 3) - tdata->digest.len);
5862         } else {
5863                 if (ut_params->obuf)
5864                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5865                                                         uint8_t *);
5866                 else
5867                         ciphertext = plaintext;
5868
5869                 debug_hexdump(stdout, "ciphertext:", ciphertext,
5870                         ciphertext_len);
5871                 debug_hexdump(stdout, "ciphertext expected:",
5872                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5873
5874                 ut_params->digest = rte_pktmbuf_mtod(
5875                         ut_params->obuf, uint8_t *) +
5876                         (tdata->digest.offset_bytes == 0 ?
5877                         plaintext_pad_len : tdata->digest.offset_bytes);
5878
5879                 debug_hexdump(stdout, "digest:", ut_params->digest,
5880                         tdata->digest.len);
5881                 debug_hexdump(stdout, "digest expected:",
5882                         tdata->digest.data, tdata->digest.len);
5883         }
5884
5885         /* Validate obuf */
5886         if (verify) {
5887                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5888                         plaintext,
5889                         tdata->plaintext.data,
5890                         tdata->plaintext.len >> 3,
5891                         "ZUC Plaintext data not as expected");
5892         } else {
5893                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5894                         ciphertext,
5895                         tdata->ciphertext.data,
5896                         tdata->ciphertext.len >> 3,
5897                         "ZUC Ciphertext data not as expected");
5898
5899                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5900                         ut_params->digest,
5901                         tdata->digest.data,
5902                         DIGEST_BYTE_LENGTH_KASUMI_F9,
5903                         "ZUC Generated auth tag not as expected");
5904         }
5905         return 0;
5906 }
5907
5908 static int
5909 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
5910         uint8_t op_mode, uint8_t verify)
5911 {
5912         struct crypto_testsuite_params *ts_params = &testsuite_params;
5913         struct crypto_unittest_params *ut_params = &unittest_params;
5914
5915         int retval;
5916
5917         const uint8_t *plaintext = NULL;
5918         const uint8_t *ciphertext = NULL;
5919         const uint8_t *digest = NULL;
5920         unsigned int plaintext_pad_len;
5921         unsigned int plaintext_len;
5922         unsigned int ciphertext_pad_len;
5923         unsigned int ciphertext_len;
5924         uint8_t buffer[10000];
5925         uint8_t digest_buffer[10000];
5926
5927         struct rte_cryptodev_info dev_info;
5928         struct rte_cryptodev_sym_capability_idx cap_idx;
5929
5930         /* Check if device supports ZUC EIA3 */
5931         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5932         cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5933
5934         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5935                         &cap_idx) == NULL)
5936                 return -ENOTSUP;
5937
5938         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5939
5940         uint64_t feat_flags = dev_info.feature_flags;
5941
5942         if (op_mode == IN_PLACE) {
5943                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5944                         printf("Device doesn't support in-place scatter-gather "
5945                                         "in both input and output mbufs.\n");
5946                         return -ENOTSUP;
5947                 }
5948
5949                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5950                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5951                         printf("Device doesn't support RAW data-path APIs.\n");
5952                         return -ENOTSUP;
5953                 }
5954         } else {
5955                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5956                         return -ENOTSUP;
5957                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5958                         printf("Device doesn't support out-of-place scatter-gather "
5959                                         "in both input and output mbufs.\n");
5960                         return -ENOTSUP;
5961                 }
5962                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5963                         printf("Device doesn't support digest encrypted.\n");
5964                         return -ENOTSUP;
5965                 }
5966         }
5967
5968         /* Create ZUC session */
5969         retval = create_wireless_algo_auth_cipher_session(
5970                         ts_params->valid_devs[0],
5971                         (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5972                                         : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5973                         (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5974                                         : RTE_CRYPTO_AUTH_OP_GENERATE),
5975                         RTE_CRYPTO_AUTH_ZUC_EIA3,
5976                         RTE_CRYPTO_CIPHER_ZUC_EEA3,
5977                         tdata->key.data, tdata->key.len,
5978                         tdata->auth_iv.len, tdata->digest.len,
5979                         tdata->cipher_iv.len);
5980
5981         if (retval < 0)
5982                 return retval;
5983
5984         ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5985         plaintext_len = ceil_byte_length(tdata->plaintext.len);
5986         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5987         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5988
5989         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5990                         plaintext_pad_len, 15, 0);
5991         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5992                         "Failed to allocate input buffer in mempool");
5993
5994         if (op_mode == OUT_OF_PLACE) {
5995                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5996                                 plaintext_pad_len, 15, 0);
5997                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5998                                 "Failed to allocate output buffer in mempool");
5999         }
6000
6001         if (verify) {
6002                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6003                         tdata->ciphertext.data);
6004                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6005                                         ciphertext_len, buffer);
6006                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6007                         ciphertext_len);
6008         } else {
6009                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6010                         tdata->plaintext.data);
6011                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6012                                         plaintext_len, buffer);
6013                 debug_hexdump(stdout, "plaintext:", plaintext,
6014                         plaintext_len);
6015         }
6016         memset(buffer, 0, sizeof(buffer));
6017
6018         /* Create ZUC operation */
6019         retval = create_wireless_algo_auth_cipher_operation(
6020                 tdata->digest.data, tdata->digest.len,
6021                 tdata->cipher_iv.data, tdata->cipher_iv.len,
6022                 NULL, 0,
6023                 (tdata->digest.offset_bytes == 0 ?
6024                 (verify ? ciphertext_pad_len : plaintext_pad_len)
6025                         : tdata->digest.offset_bytes),
6026                 tdata->validCipherLenInBits.len,
6027                 tdata->validCipherOffsetInBits.len,
6028                 tdata->validAuthLenInBits.len,
6029                 0,
6030                 op_mode, 1, verify);
6031
6032         if (retval < 0)
6033                 return retval;
6034
6035         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6036                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6037                                 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6038         else
6039                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6040                         ut_params->op);
6041
6042         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6043
6044         ut_params->obuf = (op_mode == IN_PLACE ?
6045                 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6046
6047         if (verify) {
6048                 if (ut_params->obuf)
6049                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6050                                         plaintext_len, buffer);
6051                 else
6052                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6053                                         plaintext_len, buffer);
6054
6055                 debug_hexdump(stdout, "plaintext:", plaintext,
6056                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6057                 debug_hexdump(stdout, "plaintext expected:",
6058                         tdata->plaintext.data,
6059                         (tdata->plaintext.len >> 3) - tdata->digest.len);
6060         } else {
6061                 if (ut_params->obuf)
6062                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6063                                         ciphertext_len, buffer);
6064                 else
6065                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6066                                         ciphertext_len, buffer);
6067
6068                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6069                         ciphertext_len);
6070                 debug_hexdump(stdout, "ciphertext expected:",
6071                         tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6072
6073                 if (ut_params->obuf)
6074                         digest = rte_pktmbuf_read(ut_params->obuf,
6075                                 (tdata->digest.offset_bytes == 0 ?
6076                                 plaintext_pad_len : tdata->digest.offset_bytes),
6077                                 tdata->digest.len, digest_buffer);
6078                 else
6079                         digest = rte_pktmbuf_read(ut_params->ibuf,
6080                                 (tdata->digest.offset_bytes == 0 ?
6081                                 plaintext_pad_len : tdata->digest.offset_bytes),
6082                                 tdata->digest.len, digest_buffer);
6083
6084                 debug_hexdump(stdout, "digest:", digest,
6085                         tdata->digest.len);
6086                 debug_hexdump(stdout, "digest expected:",
6087                         tdata->digest.data, tdata->digest.len);
6088         }
6089
6090         /* Validate obuf */
6091         if (verify) {
6092                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6093                         plaintext,
6094                         tdata->plaintext.data,
6095                         tdata->plaintext.len >> 3,
6096                         "ZUC Plaintext data not as expected");
6097         } else {
6098                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6099                         ciphertext,
6100                         tdata->ciphertext.data,
6101                         tdata->validDataLenInBits.len,
6102                         "ZUC Ciphertext data not as expected");
6103
6104                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6105                         digest,
6106                         tdata->digest.data,
6107                         DIGEST_BYTE_LENGTH_KASUMI_F9,
6108                         "ZUC Generated auth tag not as expected");
6109         }
6110         return 0;
6111 }
6112
6113 static int
6114 test_kasumi_encryption_test_case_1(void)
6115 {
6116         return test_kasumi_encryption(&kasumi_test_case_1);
6117 }
6118
6119 static int
6120 test_kasumi_encryption_test_case_1_sgl(void)
6121 {
6122         return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6123 }
6124
6125 static int
6126 test_kasumi_encryption_test_case_1_oop(void)
6127 {
6128         return test_kasumi_encryption_oop(&kasumi_test_case_1);
6129 }
6130
6131 static int
6132 test_kasumi_encryption_test_case_1_oop_sgl(void)
6133 {
6134         return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6135 }
6136
6137 static int
6138 test_kasumi_encryption_test_case_2(void)
6139 {
6140         return test_kasumi_encryption(&kasumi_test_case_2);
6141 }
6142
6143 static int
6144 test_kasumi_encryption_test_case_3(void)
6145 {
6146         return test_kasumi_encryption(&kasumi_test_case_3);
6147 }
6148
6149 static int
6150 test_kasumi_encryption_test_case_4(void)
6151 {
6152         return test_kasumi_encryption(&kasumi_test_case_4);
6153 }
6154
6155 static int
6156 test_kasumi_encryption_test_case_5(void)
6157 {
6158         return test_kasumi_encryption(&kasumi_test_case_5);
6159 }
6160
6161 static int
6162 test_kasumi_decryption_test_case_1(void)
6163 {
6164         return test_kasumi_decryption(&kasumi_test_case_1);
6165 }
6166
6167 static int
6168 test_kasumi_decryption_test_case_1_oop(void)
6169 {
6170         return test_kasumi_decryption_oop(&kasumi_test_case_1);
6171 }
6172
6173 static int
6174 test_kasumi_decryption_test_case_2(void)
6175 {
6176         return test_kasumi_decryption(&kasumi_test_case_2);
6177 }
6178
6179 static int
6180 test_kasumi_decryption_test_case_3(void)
6181 {
6182         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6183         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6184                 return -ENOTSUP;
6185         return test_kasumi_decryption(&kasumi_test_case_3);
6186 }
6187
6188 static int
6189 test_kasumi_decryption_test_case_4(void)
6190 {
6191         return test_kasumi_decryption(&kasumi_test_case_4);
6192 }
6193
6194 static int
6195 test_kasumi_decryption_test_case_5(void)
6196 {
6197         return test_kasumi_decryption(&kasumi_test_case_5);
6198 }
6199 static int
6200 test_snow3g_encryption_test_case_1(void)
6201 {
6202         return test_snow3g_encryption(&snow3g_test_case_1);
6203 }
6204
6205 static int
6206 test_snow3g_encryption_test_case_1_oop(void)
6207 {
6208         return test_snow3g_encryption_oop(&snow3g_test_case_1);
6209 }
6210
6211 static int
6212 test_snow3g_encryption_test_case_1_oop_sgl(void)
6213 {
6214         return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6215 }
6216
6217
6218 static int
6219 test_snow3g_encryption_test_case_1_offset_oop(void)
6220 {
6221         return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6222 }
6223
6224 static int
6225 test_snow3g_encryption_test_case_2(void)
6226 {
6227         return test_snow3g_encryption(&snow3g_test_case_2);
6228 }
6229
6230 static int
6231 test_snow3g_encryption_test_case_3(void)
6232 {
6233         return test_snow3g_encryption(&snow3g_test_case_3);
6234 }
6235
6236 static int
6237 test_snow3g_encryption_test_case_4(void)
6238 {
6239         return test_snow3g_encryption(&snow3g_test_case_4);
6240 }
6241
6242 static int
6243 test_snow3g_encryption_test_case_5(void)
6244 {
6245         return test_snow3g_encryption(&snow3g_test_case_5);
6246 }
6247
6248 static int
6249 test_snow3g_decryption_test_case_1(void)
6250 {
6251         return test_snow3g_decryption(&snow3g_test_case_1);
6252 }
6253
6254 static int
6255 test_snow3g_decryption_test_case_1_oop(void)
6256 {
6257         return test_snow3g_decryption_oop(&snow3g_test_case_1);
6258 }
6259
6260 static int
6261 test_snow3g_decryption_test_case_2(void)
6262 {
6263         return test_snow3g_decryption(&snow3g_test_case_2);
6264 }
6265
6266 static int
6267 test_snow3g_decryption_test_case_3(void)
6268 {
6269         return test_snow3g_decryption(&snow3g_test_case_3);
6270 }
6271
6272 static int
6273 test_snow3g_decryption_test_case_4(void)
6274 {
6275         return test_snow3g_decryption(&snow3g_test_case_4);
6276 }
6277
6278 static int
6279 test_snow3g_decryption_test_case_5(void)
6280 {
6281         return test_snow3g_decryption(&snow3g_test_case_5);
6282 }
6283
6284 /*
6285  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6286  * Pattern digest from snow3g_test_data must be allocated as
6287  * 4 last bytes in plaintext.
6288  */
6289 static void
6290 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6291                 struct snow3g_hash_test_data *output)
6292 {
6293         if ((pattern != NULL) && (output != NULL)) {
6294                 output->key.len = pattern->key.len;
6295
6296                 memcpy(output->key.data,
6297                 pattern->key.data, pattern->key.len);
6298
6299                 output->auth_iv.len = pattern->auth_iv.len;
6300
6301                 memcpy(output->auth_iv.data,
6302                 pattern->auth_iv.data, pattern->auth_iv.len);
6303
6304                 output->plaintext.len = pattern->plaintext.len;
6305
6306                 memcpy(output->plaintext.data,
6307                 pattern->plaintext.data, pattern->plaintext.len >> 3);
6308
6309                 output->digest.len = pattern->digest.len;
6310
6311                 memcpy(output->digest.data,
6312                 &pattern->plaintext.data[pattern->digest.offset_bytes],
6313                 pattern->digest.len);
6314
6315                 output->validAuthLenInBits.len =
6316                 pattern->validAuthLenInBits.len;
6317         }
6318 }
6319
6320 /*
6321  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6322  */
6323 static int
6324 test_snow3g_decryption_with_digest_test_case_1(void)
6325 {
6326         struct snow3g_hash_test_data snow3g_hash_data;
6327
6328         /*
6329          * Function prepare data for hash veryfication test case.
6330          * Digest is allocated in 4 last bytes in plaintext, pattern.
6331          */
6332         snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6333
6334         return test_snow3g_decryption(&snow3g_test_case_7) &
6335                         test_snow3g_authentication_verify(&snow3g_hash_data);
6336 }
6337
6338 static int
6339 test_snow3g_cipher_auth_test_case_1(void)
6340 {
6341         return test_snow3g_cipher_auth(&snow3g_test_case_3);
6342 }
6343
6344 static int
6345 test_snow3g_auth_cipher_test_case_1(void)
6346 {
6347         return test_snow3g_auth_cipher(
6348                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6349 }
6350
6351 static int
6352 test_snow3g_auth_cipher_test_case_2(void)
6353 {
6354         return test_snow3g_auth_cipher(
6355                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6356 }
6357
6358 static int
6359 test_snow3g_auth_cipher_test_case_2_oop(void)
6360 {
6361         return test_snow3g_auth_cipher(
6362                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6363 }
6364
6365 static int
6366 test_snow3g_auth_cipher_part_digest_enc(void)
6367 {
6368         return test_snow3g_auth_cipher(
6369                 &snow3g_auth_cipher_partial_digest_encryption,
6370                         IN_PLACE, 0);
6371 }
6372
6373 static int
6374 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6375 {
6376         return test_snow3g_auth_cipher(
6377                 &snow3g_auth_cipher_partial_digest_encryption,
6378                         OUT_OF_PLACE, 0);
6379 }
6380
6381 static int
6382 test_snow3g_auth_cipher_test_case_3_sgl(void)
6383 {
6384         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6385         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6386                 return -ENOTSUP;
6387         return test_snow3g_auth_cipher_sgl(
6388                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6389 }
6390
6391 static int
6392 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6393 {
6394         return test_snow3g_auth_cipher_sgl(
6395                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6396 }
6397
6398 static int
6399 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6400 {
6401         /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6402         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6403                 return -ENOTSUP;
6404         return test_snow3g_auth_cipher_sgl(
6405                 &snow3g_auth_cipher_partial_digest_encryption,
6406                         IN_PLACE, 0);
6407 }
6408
6409 static int
6410 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6411 {
6412         return test_snow3g_auth_cipher_sgl(
6413                 &snow3g_auth_cipher_partial_digest_encryption,
6414                         OUT_OF_PLACE, 0);
6415 }
6416
6417 static int
6418 test_snow3g_auth_cipher_verify_test_case_1(void)
6419 {
6420         return test_snow3g_auth_cipher(
6421                 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6422 }
6423
6424 static int
6425 test_snow3g_auth_cipher_verify_test_case_2(void)
6426 {
6427         return test_snow3g_auth_cipher(
6428                 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6429 }
6430
6431 static int
6432 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6433 {
6434         return test_snow3g_auth_cipher(
6435                 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6436 }
6437
6438 static int
6439 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6440 {
6441         return test_snow3g_auth_cipher(
6442                 &snow3g_auth_cipher_partial_digest_encryption,
6443                         IN_PLACE, 1);
6444 }
6445
6446 static int
6447 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6448 {
6449         return test_snow3g_auth_cipher(
6450                 &snow3g_auth_cipher_partial_digest_encryption,
6451                         OUT_OF_PLACE, 1);
6452 }
6453
6454 static int
6455 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6456 {
6457         return test_snow3g_auth_cipher_sgl(
6458                 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6459 }
6460
6461 static int
6462 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6463 {
6464         return test_snow3g_auth_cipher_sgl(
6465                 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6466 }
6467
6468 static int
6469 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6470 {
6471         return test_snow3g_auth_cipher_sgl(
6472                 &snow3g_auth_cipher_partial_digest_encryption,
6473                         IN_PLACE, 1);
6474 }
6475
6476 static int
6477 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6478 {
6479         return test_snow3g_auth_cipher_sgl(
6480                 &snow3g_auth_cipher_partial_digest_encryption,
6481                         OUT_OF_PLACE, 1);
6482 }
6483
6484 static int
6485 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6486 {
6487         return test_snow3g_auth_cipher(
6488                 &snow3g_test_case_7, IN_PLACE, 0);
6489 }
6490
6491 static int
6492 test_kasumi_auth_cipher_test_case_1(void)
6493 {
6494         return test_kasumi_auth_cipher(
6495                 &kasumi_test_case_3, IN_PLACE, 0);
6496 }
6497
6498 static int
6499 test_kasumi_auth_cipher_test_case_2(void)
6500 {
6501         return test_kasumi_auth_cipher(
6502                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6503 }
6504
6505 static int
6506 test_kasumi_auth_cipher_test_case_2_oop(void)
6507 {
6508         return test_kasumi_auth_cipher(
6509                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6510 }
6511
6512 static int
6513 test_kasumi_auth_cipher_test_case_2_sgl(void)
6514 {
6515         return test_kasumi_auth_cipher_sgl(
6516                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6517 }
6518
6519 static int
6520 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6521 {
6522         return test_kasumi_auth_cipher_sgl(
6523                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6524 }
6525
6526 static int
6527 test_kasumi_auth_cipher_verify_test_case_1(void)
6528 {
6529         return test_kasumi_auth_cipher(
6530                 &kasumi_test_case_3, IN_PLACE, 1);
6531 }
6532
6533 static int
6534 test_kasumi_auth_cipher_verify_test_case_2(void)
6535 {
6536         return test_kasumi_auth_cipher(
6537                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6538 }
6539
6540 static int
6541 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
6542 {
6543         return test_kasumi_auth_cipher(
6544                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6545 }
6546
6547 static int
6548 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
6549 {
6550         return test_kasumi_auth_cipher_sgl(
6551                 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6552 }
6553
6554 static int
6555 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
6556 {
6557         return test_kasumi_auth_cipher_sgl(
6558                 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6559 }
6560
6561 static int
6562 test_kasumi_cipher_auth_test_case_1(void)
6563 {
6564         return test_kasumi_cipher_auth(&kasumi_test_case_6);
6565 }
6566
6567 static int
6568 test_zuc_encryption_test_case_1(void)
6569 {
6570         return test_zuc_encryption(&zuc_test_case_cipher_193b);
6571 }
6572
6573 static int
6574 test_zuc_encryption_test_case_2(void)
6575 {
6576         return test_zuc_encryption(&zuc_test_case_cipher_800b);
6577 }
6578
6579 static int
6580 test_zuc_encryption_test_case_3(void)
6581 {
6582         return test_zuc_encryption(&zuc_test_case_cipher_1570b);
6583 }
6584
6585 static int
6586 test_zuc_encryption_test_case_4(void)
6587 {
6588         return test_zuc_encryption(&zuc_test_case_cipher_2798b);
6589 }
6590
6591 static int
6592 test_zuc_encryption_test_case_5(void)
6593 {
6594         return test_zuc_encryption(&zuc_test_case_cipher_4019b);
6595 }
6596
6597 static int
6598 test_zuc_encryption_test_case_6_sgl(void)
6599 {
6600         return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
6601 }
6602
6603 static int
6604 test_zuc_hash_generate_test_case_1(void)
6605 {
6606         return test_zuc_authentication(&zuc_test_case_auth_1b);
6607 }
6608
6609 static int
6610 test_zuc_hash_generate_test_case_2(void)
6611 {
6612         return test_zuc_authentication(&zuc_test_case_auth_90b);
6613 }
6614
6615 static int
6616 test_zuc_hash_generate_test_case_3(void)
6617 {
6618         return test_zuc_authentication(&zuc_test_case_auth_577b);
6619 }
6620
6621 static int
6622 test_zuc_hash_generate_test_case_4(void)
6623 {
6624         return test_zuc_authentication(&zuc_test_case_auth_2079b);
6625 }
6626
6627 static int
6628 test_zuc_hash_generate_test_case_5(void)
6629 {
6630         return test_zuc_authentication(&zuc_test_auth_5670b);
6631 }
6632
6633 static int
6634 test_zuc_hash_generate_test_case_6(void)
6635 {
6636         return test_zuc_authentication(&zuc_test_case_auth_128b);
6637 }
6638
6639 static int
6640 test_zuc_hash_generate_test_case_7(void)
6641 {
6642         return test_zuc_authentication(&zuc_test_case_auth_2080b);
6643 }
6644
6645 static int
6646 test_zuc_hash_generate_test_case_8(void)
6647 {
6648         return test_zuc_authentication(&zuc_test_case_auth_584b);
6649 }
6650
6651 static int
6652 test_zuc_cipher_auth_test_case_1(void)
6653 {
6654         return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
6655 }
6656
6657 static int
6658 test_zuc_cipher_auth_test_case_2(void)
6659 {
6660         return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
6661 }
6662
6663 static int
6664 test_zuc_auth_cipher_test_case_1(void)
6665 {
6666         return test_zuc_auth_cipher(
6667                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6668 }
6669
6670 static int
6671 test_zuc_auth_cipher_test_case_1_oop(void)
6672 {
6673         return test_zuc_auth_cipher(
6674                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6675 }
6676
6677 static int
6678 test_zuc_auth_cipher_test_case_1_sgl(void)
6679 {
6680         return test_zuc_auth_cipher_sgl(
6681                 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6682 }
6683
6684 static int
6685 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
6686 {
6687         return test_zuc_auth_cipher_sgl(
6688                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6689 }
6690
6691 static int
6692 test_zuc_auth_cipher_verify_test_case_1(void)
6693 {
6694         return test_zuc_auth_cipher(
6695                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6696 }
6697
6698 static int
6699 test_zuc_auth_cipher_verify_test_case_1_oop(void)
6700 {
6701         return test_zuc_auth_cipher(
6702                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6703 }
6704
6705 static int
6706 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
6707 {
6708         return test_zuc_auth_cipher_sgl(
6709                 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6710 }
6711
6712 static int
6713 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
6714 {
6715         return test_zuc_auth_cipher_sgl(
6716                 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6717 }
6718
6719 static int
6720 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
6721 {
6722         uint8_t dev_id = testsuite_params.valid_devs[0];
6723
6724         struct rte_cryptodev_sym_capability_idx cap_idx;
6725
6726         /* Check if device supports particular cipher algorithm */
6727         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6728         cap_idx.algo.cipher = tdata->cipher_algo;
6729         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6730                 return -ENOTSUP;
6731
6732         /* Check if device supports particular hash algorithm */
6733         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6734         cap_idx.algo.auth = tdata->auth_algo;
6735         if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6736                 return -ENOTSUP;
6737
6738         return 0;
6739 }
6740
6741 static int
6742 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
6743         uint8_t op_mode, uint8_t verify)
6744 {
6745         struct crypto_testsuite_params *ts_params = &testsuite_params;
6746         struct crypto_unittest_params *ut_params = &unittest_params;
6747
6748         int retval;
6749
6750         uint8_t *plaintext = NULL, *ciphertext = NULL;
6751         unsigned int plaintext_pad_len;
6752         unsigned int plaintext_len;
6753         unsigned int ciphertext_pad_len;
6754         unsigned int ciphertext_len;
6755
6756         struct rte_cryptodev_info dev_info;
6757         struct rte_crypto_op *op;
6758
6759         /* Check if device supports particular algorithms separately */
6760         if (test_mixed_check_if_unsupported(tdata))
6761                 return -ENOTSUP;
6762         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6763                 return -ENOTSUP;
6764
6765         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6766
6767         uint64_t feat_flags = dev_info.feature_flags;
6768
6769         if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6770                 printf("Device doesn't support digest encrypted.\n");
6771                 return -ENOTSUP;
6772         }
6773
6774         /* Create the session */
6775         if (verify)
6776                 retval = create_wireless_algo_cipher_auth_session(
6777                                 ts_params->valid_devs[0],
6778                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
6779                                 RTE_CRYPTO_AUTH_OP_VERIFY,
6780                                 tdata->auth_algo,
6781                                 tdata->cipher_algo,
6782                                 tdata->auth_key.data, tdata->auth_key.len,
6783                                 tdata->auth_iv.len, tdata->digest_enc.len,
6784                                 tdata->cipher_iv.len);
6785         else
6786                 retval = create_wireless_algo_auth_cipher_session(
6787                                 ts_params->valid_devs[0],
6788                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6789                                 RTE_CRYPTO_AUTH_OP_GENERATE,
6790                                 tdata->auth_algo,
6791                                 tdata->cipher_algo,
6792                                 tdata->auth_key.data, tdata->auth_key.len,
6793                                 tdata->auth_iv.len, tdata->digest_enc.len,
6794                                 tdata->cipher_iv.len);
6795         if (retval < 0)
6796                 return retval;
6797
6798         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6799         if (op_mode == OUT_OF_PLACE)
6800                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6801
6802         /* clear mbuf payload */
6803         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6804                 rte_pktmbuf_tailroom(ut_params->ibuf));
6805         if (op_mode == OUT_OF_PLACE) {
6806
6807                 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6808                                 rte_pktmbuf_tailroom(ut_params->obuf));
6809         }
6810
6811         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
6812         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
6813         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6814         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6815
6816         if (verify) {
6817                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6818                                 ciphertext_pad_len);
6819                 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6820                 if (op_mode == OUT_OF_PLACE)
6821                         rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6822                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6823                                 ciphertext_len);
6824         } else {
6825                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6826                                 plaintext_pad_len);
6827                 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6828                 if (op_mode == OUT_OF_PLACE)
6829                         rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6830                 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6831         }
6832
6833         /* Create the operation */
6834         retval = create_wireless_algo_auth_cipher_operation(
6835                         tdata->digest_enc.data, tdata->digest_enc.len,
6836                         tdata->cipher_iv.data, tdata->cipher_iv.len,
6837                         tdata->auth_iv.data, tdata->auth_iv.len,
6838                         (tdata->digest_enc.offset == 0 ?
6839                                 plaintext_pad_len
6840                                 : tdata->digest_enc.offset),
6841                         tdata->validCipherLen.len_bits,
6842                         tdata->cipher.offset_bits,
6843                         tdata->validAuthLen.len_bits,
6844                         tdata->auth.offset_bits,
6845                         op_mode, 0, verify);
6846
6847         if (retval < 0)
6848                 return retval;
6849
6850         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
6851
6852         /* Check if the op failed because the device doesn't */
6853         /* support this particular combination of algorithms */
6854         if (op == NULL && ut_params->op->status ==
6855                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
6856                 printf("Device doesn't support this mixed combination. "
6857                                 "Test Skipped.\n");
6858                 return -ENOTSUP;
6859         }
6860         ut_params->op = op;
6861
6862         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6863
6864         ut_params->obuf = (op_mode == IN_PLACE ?
6865                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6866
6867         if (verify) {
6868                 if (ut_params->obuf)
6869                         plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6870                                                         uint8_t *);
6871                 else
6872                         plaintext = ciphertext +
6873                                         (tdata->cipher.offset_bits >> 3);
6874
6875                 debug_hexdump(stdout, "plaintext:", plaintext,
6876                                 tdata->plaintext.len_bits >> 3);
6877                 debug_hexdump(stdout, "plaintext expected:",
6878                                 tdata->plaintext.data,
6879                                 tdata->plaintext.len_bits >> 3);
6880         } else {
6881                 if (ut_params->obuf)
6882                         ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6883                                         uint8_t *);
6884                 else
6885                         ciphertext = plaintext;
6886
6887                 debug_hexdump(stdout, "ciphertext:", ciphertext,
6888                                 ciphertext_len);
6889                 debug_hexdump(stdout, "ciphertext expected:",
6890                                 tdata->ciphertext.data,
6891                                 tdata->ciphertext.len_bits >> 3);
6892
6893                 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6894                                 + (tdata->digest_enc.offset == 0 ?
6895                 plaintext_pad_len : tdata->digest_enc.offset);
6896
6897                 debug_hexdump(stdout, "digest:", ut_params->digest,
6898                                 tdata->digest_enc.len);
6899                 debug_hexdump(stdout, "digest expected:",
6900                                 tdata->digest_enc.data,
6901                                 tdata->digest_enc.len);
6902         }
6903
6904         /* Validate obuf */
6905         if (verify) {
6906                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6907                                 plaintext,
6908                                 tdata->plaintext.data,
6909                                 tdata->plaintext.len_bits >> 3,
6910                                 "Plaintext data not as expected");
6911         } else {
6912                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6913                                 ciphertext,
6914                                 tdata->ciphertext.data,
6915                                 tdata->validDataLen.len_bits,
6916                                 "Ciphertext data not as expected");
6917
6918                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6919                                 ut_params->digest,
6920                                 tdata->digest_enc.data,
6921                                 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
6922                                 "Generated auth tag not as expected");
6923         }
6924
6925         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6926                         "crypto op processing failed");
6927
6928         return 0;
6929 }
6930
6931 static int
6932 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
6933         uint8_t op_mode, uint8_t verify)
6934 {
6935         struct crypto_testsuite_params *ts_params = &testsuite_params;
6936         struct crypto_unittest_params *ut_params = &unittest_params;
6937
6938         int retval;
6939
6940         const uint8_t *plaintext = NULL;
6941         const uint8_t *ciphertext = NULL;
6942         const uint8_t *digest = NULL;
6943         unsigned int plaintext_pad_len;
6944         unsigned int plaintext_len;
6945         unsigned int ciphertext_pad_len;
6946         unsigned int ciphertext_len;
6947         uint8_t buffer[10000];
6948         uint8_t digest_buffer[10000];
6949
6950         struct rte_cryptodev_info dev_info;
6951         struct rte_crypto_op *op;
6952
6953         /* Check if device supports particular algorithms */
6954         if (test_mixed_check_if_unsupported(tdata))
6955                 return -ENOTSUP;
6956         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6957                 return -ENOTSUP;
6958
6959         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6960
6961         uint64_t feat_flags = dev_info.feature_flags;
6962
6963         if (op_mode == IN_PLACE) {
6964                 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6965                         printf("Device doesn't support in-place scatter-gather "
6966                                         "in both input and output mbufs.\n");
6967                         return -ENOTSUP;
6968                 }
6969         } else {
6970                 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6971                         printf("Device doesn't support out-of-place scatter-gather "
6972                                         "in both input and output mbufs.\n");
6973                         return -ENOTSUP;
6974                 }
6975                 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6976                         printf("Device doesn't support digest encrypted.\n");
6977                         return -ENOTSUP;
6978                 }
6979         }
6980
6981         /* Create the session */
6982         if (verify)
6983                 retval = create_wireless_algo_cipher_auth_session(
6984                                 ts_params->valid_devs[0],
6985                                 RTE_CRYPTO_CIPHER_OP_DECRYPT,
6986                                 RTE_CRYPTO_AUTH_OP_VERIFY,
6987                                 tdata->auth_algo,
6988                                 tdata->cipher_algo,
6989                                 tdata->auth_key.data, tdata->auth_key.len,
6990                                 tdata->auth_iv.len, tdata->digest_enc.len,
6991                                 tdata->cipher_iv.len);
6992         else
6993                 retval = create_wireless_algo_auth_cipher_session(
6994                                 ts_params->valid_devs[0],
6995                                 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6996                                 RTE_CRYPTO_AUTH_OP_GENERATE,
6997                                 tdata->auth_algo,
6998                                 tdata->cipher_algo,
6999                                 tdata->auth_key.data, tdata->auth_key.len,
7000                                 tdata->auth_iv.len, tdata->digest_enc.len,
7001                                 tdata->cipher_iv.len);
7002         if (retval < 0)
7003                 return retval;
7004
7005         ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7006         plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7007         ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7008         plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7009
7010         ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7011                         ciphertext_pad_len, 15, 0);
7012         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7013                         "Failed to allocate input buffer in mempool");
7014
7015         if (op_mode == OUT_OF_PLACE) {
7016                 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7017                                 plaintext_pad_len, 15, 0);
7018                 TEST_ASSERT_NOT_NULL(ut_params->obuf,
7019                                 "Failed to allocate output buffer in mempool");
7020         }
7021
7022         if (verify) {
7023                 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7024                         tdata->ciphertext.data);
7025                 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7026                                         ciphertext_len, buffer);
7027                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7028                         ciphertext_len);
7029         } else {
7030                 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7031                         tdata->plaintext.data);
7032                 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7033                                         plaintext_len, buffer);
7034                 debug_hexdump(stdout, "plaintext:", plaintext,
7035                         plaintext_len);
7036         }
7037         memset(buffer, 0, sizeof(buffer));
7038
7039         /* Create the operation */
7040         retval = create_wireless_algo_auth_cipher_operation(
7041                         tdata->digest_enc.data, tdata->digest_enc.len,
7042                         tdata->cipher_iv.data, tdata->cipher_iv.len,
7043                         tdata->auth_iv.data, tdata->auth_iv.len,
7044                         (tdata->digest_enc.offset == 0 ?
7045                                 plaintext_pad_len
7046                                 : tdata->digest_enc.offset),
7047                         tdata->validCipherLen.len_bits,
7048                         tdata->cipher.offset_bits,
7049                         tdata->validAuthLen.len_bits,
7050                         tdata->auth.offset_bits,
7051                         op_mode, 1, verify);
7052
7053         if (retval < 0)
7054                 return retval;
7055
7056         op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7057
7058         /* Check if the op failed because the device doesn't */
7059         /* support this particular combination of algorithms */
7060         if (op == NULL && ut_params->op->status ==
7061                         RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7062                 printf("Device doesn't support this mixed combination. "
7063                                 "Test Skipped.\n");
7064                 return -ENOTSUP;
7065         }
7066         ut_params->op = op;
7067
7068         TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7069
7070         ut_params->obuf = (op_mode == IN_PLACE ?
7071                         ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7072
7073         if (verify) {
7074                 if (ut_params->obuf)
7075                         plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7076                                         plaintext_len, buffer);
7077                 else
7078                         plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7079                                         plaintext_len, buffer);
7080
7081                 debug_hexdump(stdout, "plaintext:", plaintext,
7082                                 (tdata->plaintext.len_bits >> 3) -
7083                                 tdata->digest_enc.len);
7084                 debug_hexdump(stdout, "plaintext expected:",
7085                                 tdata->plaintext.data,
7086                                 (tdata->plaintext.len_bits >> 3) -
7087                                 tdata->digest_enc.len);
7088         } else {
7089                 if (ut_params->obuf)
7090                         ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7091                                         ciphertext_len, buffer);
7092                 else
7093                         ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7094                                         ciphertext_len, buffer);
7095
7096                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7097                         ciphertext_len);
7098                 debug_hexdump(stdout, "ciphertext expected:",
7099                         tdata->ciphertext.data,
7100                         tdata->ciphertext.len_bits >> 3);
7101
7102                 if (ut_params->obuf)
7103                         digest = rte_pktmbuf_read(ut_params->obuf,
7104                                         (tdata->digest_enc.offset == 0 ?
7105                                                 plaintext_pad_len :
7106                                                 tdata->digest_enc.offset),
7107                                         tdata->digest_enc.len, digest_buffer);
7108                 else
7109                         digest = rte_pktmbuf_read(ut_params->ibuf,
7110                                         (tdata->digest_enc.offset == 0 ?
7111                                                 plaintext_pad_len :
7112                                                 tdata->digest_enc.offset),
7113                                         tdata->digest_enc.len, digest_buffer);
7114
7115                 debug_hexdump(stdout, "digest:", digest,
7116                                 tdata->digest_enc.len);
7117                 debug_hexdump(stdout, "digest expected:",
7118                                 tdata->digest_enc.data, tdata->digest_enc.len);
7119         }
7120
7121         /* Validate obuf */
7122         if (verify) {
7123                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7124                                 plaintext,
7125                                 tdata->plaintext.data,
7126                                 tdata->plaintext.len_bits >> 3,
7127                                 "Plaintext data not as expected");
7128         } else {
7129                 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7130                                 ciphertext,
7131                                 tdata->ciphertext.data,
7132                                 tdata->validDataLen.len_bits,
7133                                 "Ciphertext data not as expected");
7134                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7135                                 digest,
7136                                 tdata->digest_enc.data,
7137                                 tdata->digest_enc.len,
7138                                 "Generated auth tag not as expected");
7139         }
7140
7141         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7142                         "crypto op processing failed");
7143
7144         return 0;
7145 }
7146
7147 /** AUTH AES CMAC + CIPHER AES CTR */
7148
7149 static int
7150 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7151 {
7152         return test_mixed_auth_cipher(
7153                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7154 }
7155
7156 static int
7157 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7158 {
7159         return test_mixed_auth_cipher(
7160                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7161 }
7162
7163 static int
7164 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7165 {
7166         return test_mixed_auth_cipher_sgl(
7167                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7168 }
7169
7170 static int
7171 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7172 {
7173         return test_mixed_auth_cipher_sgl(
7174                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7175 }
7176
7177 static int
7178 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7179 {
7180         return test_mixed_auth_cipher(
7181                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7182 }
7183
7184 static int
7185 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7186 {
7187         return test_mixed_auth_cipher(
7188                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7189 }
7190
7191 static int
7192 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7193 {
7194         return test_mixed_auth_cipher_sgl(
7195                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7196 }
7197
7198 static int
7199 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7200 {
7201         return test_mixed_auth_cipher_sgl(
7202                 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7203 }
7204
7205 /** MIXED AUTH + CIPHER */
7206
7207 static int
7208 test_auth_zuc_cipher_snow_test_case_1(void)
7209 {
7210         return test_mixed_auth_cipher(
7211                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7212 }
7213
7214 static int
7215 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7216 {
7217         return test_mixed_auth_cipher(
7218                 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7219 }
7220
7221 static int
7222 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7223 {
7224         return test_mixed_auth_cipher(
7225                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7226 }
7227
7228 static int
7229 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7230 {
7231         return test_mixed_auth_cipher(
7232                 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7233 }
7234
7235 static int
7236 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7237 {
7238         return test_mixed_auth_cipher(
7239                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7240 }
7241
7242 static int
7243 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7244 {
7245         return test_mixed_auth_cipher(
7246                 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7247 }
7248
7249 static int
7250 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7251 {
7252         return test_mixed_auth_cipher(
7253                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7254 }
7255
7256 static int
7257 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7258 {
7259         return test_mixed_auth_cipher(
7260                 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7261 }
7262
7263 static int
7264 test_auth_snow_cipher_zuc_test_case_1(void)
7265 {
7266         return test_mixed_auth_cipher(
7267                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7268 }
7269
7270 static int
7271 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7272 {
7273         return test_mixed_auth_cipher(
7274                 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7275 }
7276
7277 static int
7278 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7279 {
7280         return test_mixed_auth_cipher(
7281                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7282 }
7283
7284 static int
7285 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7286 {
7287         return test_mixed_auth_cipher(
7288                 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7289 }
7290
7291 static int
7292 test_auth_null_cipher_snow_test_case_1(void)
7293 {
7294         return test_mixed_auth_cipher(
7295                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7296 }
7297
7298 static int
7299 test_verify_auth_null_cipher_snow_test_case_1(void)
7300 {
7301         return test_mixed_auth_cipher(
7302                 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7303 }
7304
7305 static int
7306 test_auth_null_cipher_zuc_test_case_1(void)
7307 {
7308         return test_mixed_auth_cipher(
7309                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7310 }
7311
7312 static int
7313 test_verify_auth_null_cipher_zuc_test_case_1(void)
7314 {
7315         return test_mixed_auth_cipher(
7316                 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7317 }
7318
7319 static int
7320 test_auth_snow_cipher_null_test_case_1(void)
7321 {
7322         return test_mixed_auth_cipher(
7323                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7324 }
7325
7326 static int
7327 test_verify_auth_snow_cipher_null_test_case_1(void)
7328 {
7329         return test_mixed_auth_cipher(
7330                 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7331 }
7332
7333 static int
7334 test_auth_zuc_cipher_null_test_case_1(void)
7335 {
7336         return test_mixed_auth_cipher(
7337                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7338 }
7339
7340 static int
7341 test_verify_auth_zuc_cipher_null_test_case_1(void)
7342 {
7343         return test_mixed_auth_cipher(
7344                 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7345 }
7346
7347 static int
7348 test_auth_null_cipher_aes_ctr_test_case_1(void)
7349 {
7350         return test_mixed_auth_cipher(
7351                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7352 }
7353
7354 static int
7355 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7356 {
7357         return test_mixed_auth_cipher(
7358                 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7359 }
7360
7361 static int
7362 test_auth_aes_cmac_cipher_null_test_case_1(void)
7363 {
7364         return test_mixed_auth_cipher(
7365                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7366 }
7367
7368 static int
7369 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7370 {
7371         return test_mixed_auth_cipher(
7372                 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7373 }
7374
7375 /* ***** AEAD algorithm Tests ***** */
7376
7377 static int
7378 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7379                 enum rte_crypto_aead_operation op,
7380                 const uint8_t *key, const uint8_t key_len,
7381                 const uint16_t aad_len, const uint8_t auth_len,
7382                 uint8_t iv_len)
7383 {
7384         uint8_t aead_key[key_len];
7385
7386         struct crypto_testsuite_params *ts_params = &testsuite_params;
7387         struct crypto_unittest_params *ut_params = &unittest_params;
7388
7389         memcpy(aead_key, key, key_len);
7390
7391         /* Setup AEAD Parameters */
7392         ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7393         ut_params->aead_xform.next = NULL;
7394         ut_params->aead_xform.aead.algo = algo;
7395         ut_params->aead_xform.aead.op = op;
7396         ut_params->aead_xform.aead.key.data = aead_key;
7397         ut_params->aead_xform.aead.key.length = key_len;
7398         ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7399         ut_params->aead_xform.aead.iv.length = iv_len;
7400         ut_params->aead_xform.aead.digest_length = auth_len;
7401         ut_params->aead_xform.aead.aad_length = aad_len;
7402
7403         debug_hexdump(stdout, "key:", key, key_len);
7404
7405         /* Create Crypto session*/
7406         ut_params->sess = rte_cryptodev_sym_session_create(
7407                         ts_params->session_mpool);
7408
7409         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7410                         &ut_params->aead_xform,
7411                         ts_params->session_priv_mpool);
7412
7413         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7414
7415         return 0;
7416 }
7417
7418 static int
7419 create_aead_xform(struct rte_crypto_op *op,
7420                 enum rte_crypto_aead_algorithm algo,
7421                 enum rte_crypto_aead_operation aead_op,
7422                 uint8_t *key, const uint8_t key_len,
7423                 const uint8_t aad_len, const uint8_t auth_len,
7424                 uint8_t iv_len)
7425 {
7426         TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7427                         "failed to allocate space for crypto transform");
7428
7429         struct rte_crypto_sym_op *sym_op = op->sym;
7430
7431         /* Setup AEAD Parameters */
7432         sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7433         sym_op->xform->next = NULL;
7434         sym_op->xform->aead.algo = algo;
7435         sym_op->xform->aead.op = aead_op;
7436         sym_op->xform->aead.key.data = key;
7437         sym_op->xform->aead.key.length = key_len;
7438         sym_op->xform->aead.iv.offset = IV_OFFSET;
7439         sym_op->xform->aead.iv.length = iv_len;
7440         sym_op->xform->aead.digest_length = auth_len;
7441         sym_op->xform->aead.aad_length = aad_len;
7442
7443         debug_hexdump(stdout, "key:", key, key_len);
7444
7445         return 0;
7446 }
7447
7448 static int
7449 create_aead_operation(enum rte_crypto_aead_operation op,
7450                 const struct aead_test_data *tdata)
7451 {
7452         struct crypto_testsuite_params *ts_params = &testsuite_params;
7453         struct crypto_unittest_params *ut_params = &unittest_params;
7454
7455         uint8_t *plaintext, *ciphertext;
7456         unsigned int aad_pad_len, plaintext_pad_len;
7457
7458         /* Generate Crypto op data structure */
7459         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7460                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7461         TEST_ASSERT_NOT_NULL(ut_params->op,
7462                         "Failed to allocate symmetric crypto operation struct");
7463
7464         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7465
7466         /* Append aad data */
7467         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7468                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7469                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7470                                 aad_pad_len);
7471                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7472                                 "no room to append aad");
7473
7474                 sym_op->aead.aad.phys_addr =
7475                                 rte_pktmbuf_iova(ut_params->ibuf);
7476                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
7477                 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7478                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7479                         tdata->aad.len);
7480
7481                 /* Append IV at the end of the crypto operation*/
7482                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7483                                 uint8_t *, IV_OFFSET);
7484
7485                 /* Copy IV 1 byte after the IV pointer, according to the API */
7486                 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7487                 debug_hexdump(stdout, "iv:", iv_ptr,
7488                         tdata->iv.len);
7489         } else {
7490                 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7491                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7492                                 aad_pad_len);
7493                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7494                                 "no room to append aad");
7495
7496                 sym_op->aead.aad.phys_addr =
7497                                 rte_pktmbuf_iova(ut_params->ibuf);
7498                 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7499                 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7500                         tdata->aad.len);
7501
7502                 /* Append IV at the end of the crypto operation*/
7503                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7504                                 uint8_t *, IV_OFFSET);
7505
7506                 if (tdata->iv.len == 0) {
7507                         rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
7508                         debug_hexdump(stdout, "iv:", iv_ptr,
7509                                 AES_GCM_J0_LENGTH);
7510                 } else {
7511                         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
7512                         debug_hexdump(stdout, "iv:", iv_ptr,
7513                                 tdata->iv.len);
7514                 }
7515         }
7516
7517         /* Append plaintext/ciphertext */
7518         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7519                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7520                 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7521                                 plaintext_pad_len);
7522                 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7523
7524                 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
7525                 debug_hexdump(stdout, "plaintext:", plaintext,
7526                                 tdata->plaintext.len);
7527
7528                 if (ut_params->obuf) {
7529                         ciphertext = (uint8_t *)rte_pktmbuf_append(
7530                                         ut_params->obuf,
7531                                         plaintext_pad_len + aad_pad_len);
7532                         TEST_ASSERT_NOT_NULL(ciphertext,
7533                                         "no room to append ciphertext");
7534
7535                         memset(ciphertext + aad_pad_len, 0,
7536                                         tdata->ciphertext.len);
7537                 }
7538         } else {
7539                 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
7540                 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7541                                 plaintext_pad_len);
7542                 TEST_ASSERT_NOT_NULL(ciphertext,
7543                                 "no room to append ciphertext");
7544
7545                 memcpy(ciphertext, tdata->ciphertext.data,
7546                                 tdata->ciphertext.len);
7547                 debug_hexdump(stdout, "ciphertext:", ciphertext,
7548                                 tdata->ciphertext.len);
7549
7550                 if (ut_params->obuf) {
7551                         plaintext = (uint8_t *)rte_pktmbuf_append(
7552                                         ut_params->obuf,
7553                                         plaintext_pad_len + aad_pad_len);
7554                         TEST_ASSERT_NOT_NULL(plaintext,
7555                                         "no room to append plaintext");
7556
7557                         memset(plaintext + aad_pad_len, 0,
7558                                         tdata->plaintext.len);
7559                 }
7560         }
7561
7562         /* Append digest data */
7563         if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7564                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7565                                 ut_params->obuf ? ut_params->obuf :
7566                                                 ut_params->ibuf,
7567                                                 tdata->auth_tag.len);
7568                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7569                                 "no room to append digest");
7570                 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
7571                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7572                                 ut_params->obuf ? ut_params->obuf :
7573                                                 ut_params->ibuf,
7574                                                 plaintext_pad_len +
7575                                                 aad_pad_len);
7576         } else {
7577                 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7578                                 ut_params->ibuf, tdata->auth_tag.len);
7579                 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7580                                 "no room to append digest");
7581                 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7582                                 ut_params->ibuf,
7583                                 plaintext_pad_len + aad_pad_len);
7584
7585                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7586                         tdata->auth_tag.len);
7587                 debug_hexdump(stdout, "digest:",
7588                         sym_op->aead.digest.data,
7589                         tdata->auth_tag.len);
7590         }
7591
7592         sym_op->aead.data.length = tdata->plaintext.len;
7593         sym_op->aead.data.offset = aad_pad_len;
7594
7595         return 0;
7596 }
7597
7598 static int
7599 test_authenticated_encryption(const struct aead_test_data *tdata)
7600 {
7601         struct crypto_testsuite_params *ts_params = &testsuite_params;
7602         struct crypto_unittest_params *ut_params = &unittest_params;
7603
7604         int retval;
7605         uint8_t *ciphertext, *auth_tag;
7606         uint16_t plaintext_pad_len;
7607         uint32_t i;
7608         struct rte_cryptodev_info dev_info;
7609
7610         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7611         uint64_t feat_flags = dev_info.feature_flags;
7612
7613         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
7614                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
7615                 printf("Device doesn't support RAW data-path APIs.\n");
7616                 return -ENOTSUP;
7617         }
7618
7619         /* Verify the capabilities */
7620         struct rte_cryptodev_sym_capability_idx cap_idx;
7621         const struct rte_cryptodev_symmetric_capability *capability;
7622         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7623         cap_idx.algo.aead = tdata->algo;
7624         capability = rte_cryptodev_sym_capability_get(
7625                         ts_params->valid_devs[0], &cap_idx);
7626         if (capability == NULL)
7627                 return -ENOTSUP;
7628         if (rte_cryptodev_sym_capability_check_aead(
7629                         capability, tdata->key.len, tdata->auth_tag.len,
7630                         tdata->aad.len, tdata->iv.len))
7631                 return -ENOTSUP;
7632
7633         /* Create AEAD session */
7634         retval = create_aead_session(ts_params->valid_devs[0],
7635                         tdata->algo,
7636                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
7637                         tdata->key.data, tdata->key.len,
7638                         tdata->aad.len, tdata->auth_tag.len,
7639                         tdata->iv.len);
7640         if (retval < 0)
7641                 return retval;
7642
7643         if (tdata->aad.len > MBUF_SIZE) {
7644                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
7645                 /* Populate full size of add data */
7646                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
7647                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
7648         } else
7649                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7650
7651         /* clear mbuf payload */
7652         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7653                         rte_pktmbuf_tailroom(ut_params->ibuf));
7654
7655         /* Create AEAD operation */
7656         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
7657         if (retval < 0)
7658                 return retval;
7659
7660         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7661
7662         ut_params->op->sym->m_src = ut_params->ibuf;
7663
7664         /* Process crypto operation */
7665         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
7666                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
7667         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7668                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
7669                                 ut_params->op, 0, 0, 0, 0);
7670         else
7671                 TEST_ASSERT_NOT_NULL(
7672                         process_crypto_request(ts_params->valid_devs[0],
7673                         ut_params->op), "failed to process sym crypto op");
7674
7675         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7676                         "crypto op processing failed");
7677
7678         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7679
7680         if (ut_params->op->sym->m_dst) {
7681                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7682                                 uint8_t *);
7683                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
7684                                 uint8_t *, plaintext_pad_len);
7685         } else {
7686                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
7687                                 uint8_t *,
7688                                 ut_params->op->sym->cipher.data.offset);
7689                 auth_tag = ciphertext + plaintext_pad_len;
7690         }
7691
7692         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
7693         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
7694
7695         /* Validate obuf */
7696         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7697                         ciphertext,
7698                         tdata->ciphertext.data,
7699                         tdata->ciphertext.len,
7700                         "Ciphertext data not as expected");
7701
7702         TEST_ASSERT_BUFFERS_ARE_EQUAL(
7703                         auth_tag,
7704                         tdata->auth_tag.data,
7705                         tdata->auth_tag.len,
7706                         "Generated auth tag not as expected");
7707
7708         return 0;
7709
7710 }
7711
7712 #ifdef RTE_LIB_SECURITY
7713 static int
7714 security_proto_supported(enum rte_security_session_action_type action,
7715         enum rte_security_session_protocol proto)
7716 {
7717         struct crypto_testsuite_params *ts_params = &testsuite_params;
7718
7719         const struct rte_security_capability *capabilities;
7720         const struct rte_security_capability *capability;
7721         uint16_t i = 0;
7722
7723         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7724                                 rte_cryptodev_get_sec_ctx(
7725                                 ts_params->valid_devs[0]);
7726
7727
7728         capabilities = rte_security_capabilities_get(ctx);
7729
7730         if (capabilities == NULL)
7731                 return -ENOTSUP;
7732
7733         while ((capability = &capabilities[i++])->action !=
7734                         RTE_SECURITY_ACTION_TYPE_NONE) {
7735                 if (capability->action == action &&
7736                                 capability->protocol == proto)
7737                         return 0;
7738         }
7739
7740         return -ENOTSUP;
7741 }
7742
7743 /* Basic algorithm run function for async inplace mode.
7744  * Creates a session from input parameters and runs one operation
7745  * on input_vec. Checks the output of the crypto operation against
7746  * output_vec.
7747  */
7748 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
7749                            enum rte_crypto_auth_operation opa,
7750                            const uint8_t *input_vec, unsigned int input_vec_len,
7751                            const uint8_t *output_vec,
7752                            unsigned int output_vec_len,
7753                            enum rte_crypto_cipher_algorithm cipher_alg,
7754                            const uint8_t *cipher_key, uint32_t cipher_key_len,
7755                            enum rte_crypto_auth_algorithm auth_alg,
7756                            const uint8_t *auth_key, uint32_t auth_key_len,
7757                            uint8_t bearer, enum rte_security_pdcp_domain domain,
7758                            uint8_t packet_direction, uint8_t sn_size,
7759                            uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
7760 {
7761         struct crypto_testsuite_params *ts_params = &testsuite_params;
7762         struct crypto_unittest_params *ut_params = &unittest_params;
7763         uint8_t *plaintext;
7764         int ret = TEST_SUCCESS;
7765         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7766                                 rte_cryptodev_get_sec_ctx(
7767                                 ts_params->valid_devs[0]);
7768
7769         /* Verify the capabilities */
7770         struct rte_security_capability_idx sec_cap_idx;
7771
7772         sec_cap_idx.action = ut_params->type;
7773         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7774         sec_cap_idx.pdcp.domain = domain;
7775         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7776                 return -ENOTSUP;
7777
7778         /* Generate test mbuf data */
7779         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7780
7781         /* clear mbuf payload */
7782         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7783                         rte_pktmbuf_tailroom(ut_params->ibuf));
7784
7785         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7786                                                   input_vec_len);
7787         memcpy(plaintext, input_vec, input_vec_len);
7788
7789         /* Out of place support */
7790         if (oop) {
7791                 /*
7792                  * For out-op-place we need to alloc another mbuf
7793                  */
7794                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7795                 rte_pktmbuf_append(ut_params->obuf, output_vec_len);
7796         }
7797
7798         /* Setup Cipher Parameters */
7799         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7800         ut_params->cipher_xform.cipher.algo = cipher_alg;
7801         ut_params->cipher_xform.cipher.op = opc;
7802         ut_params->cipher_xform.cipher.key.data = cipher_key;
7803         ut_params->cipher_xform.cipher.key.length = cipher_key_len;
7804         ut_params->cipher_xform.cipher.iv.length =
7805                                 packet_direction ? 4 : 0;
7806         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
7807
7808         /* Setup HMAC Parameters if ICV header is required */
7809         if (auth_alg != 0) {
7810                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7811                 ut_params->auth_xform.next = NULL;
7812                 ut_params->auth_xform.auth.algo = auth_alg;
7813                 ut_params->auth_xform.auth.op = opa;
7814                 ut_params->auth_xform.auth.key.data = auth_key;
7815                 ut_params->auth_xform.auth.key.length = auth_key_len;
7816
7817                 ut_params->cipher_xform.next = &ut_params->auth_xform;
7818         } else {
7819                 ut_params->cipher_xform.next = NULL;
7820         }
7821
7822         struct rte_security_session_conf sess_conf = {
7823                 .action_type = ut_params->type,
7824                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
7825                 {.pdcp = {
7826                         .bearer = bearer,
7827                         .domain = domain,
7828                         .pkt_dir = packet_direction,
7829                         .sn_size = sn_size,
7830                         .hfn = packet_direction ? 0 : hfn,
7831                         /**
7832                          * hfn can be set as pdcp_test_hfn[i]
7833                          * if hfn_ovrd is not set. Here, PDCP
7834                          * packet direction is just used to
7835                          * run half of the cases with session
7836                          * HFN and other half with per packet
7837                          * HFN.
7838                          */
7839                         .hfn_threshold = hfn_threshold,
7840                         .hfn_ovrd = packet_direction ? 1 : 0,
7841                         .sdap_enabled = sdap,
7842                 } },
7843                 .crypto_xform = &ut_params->cipher_xform
7844         };
7845
7846         /* Create security session */
7847         ut_params->sec_session = rte_security_session_create(ctx,
7848                                 &sess_conf, ts_params->session_mpool,
7849                                 ts_params->session_priv_mpool);
7850
7851         if (!ut_params->sec_session) {
7852                 printf("TestCase %s()-%d line %d failed %s: ",
7853                         __func__, i, __LINE__, "Failed to allocate session");
7854                 ret = TEST_FAILED;
7855                 goto on_err;
7856         }
7857
7858         /* Generate crypto op data structure */
7859         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7860                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7861         if (!ut_params->op) {
7862                 printf("TestCase %s()-%d line %d failed %s: ",
7863                         __func__, i, __LINE__,
7864                         "Failed to allocate symmetric crypto operation struct");
7865                 ret = TEST_FAILED;
7866                 goto on_err;
7867         }
7868
7869         uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
7870                                         uint32_t *, IV_OFFSET);
7871         *per_pkt_hfn = packet_direction ? hfn : 0;
7872
7873         rte_security_attach_session(ut_params->op, ut_params->sec_session);
7874
7875         /* set crypto operation source mbuf */
7876         ut_params->op->sym->m_src = ut_params->ibuf;
7877         if (oop)
7878                 ut_params->op->sym->m_dst = ut_params->obuf;
7879
7880         /* Process crypto operation */
7881         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
7882                 == NULL) {
7883                 printf("TestCase %s()-%d line %d failed %s: ",
7884                         __func__, i, __LINE__,
7885                         "failed to process sym crypto op");
7886                 ret = TEST_FAILED;
7887                 goto on_err;
7888         }
7889
7890         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
7891                 printf("TestCase %s()-%d line %d failed %s: ",
7892                         __func__, i, __LINE__, "crypto op processing failed");
7893                 ret = TEST_FAILED;
7894                 goto on_err;
7895         }
7896
7897         /* Validate obuf */
7898         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
7899                         uint8_t *);
7900         if (oop) {
7901                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7902                                 uint8_t *);
7903         }
7904
7905         if (memcmp(ciphertext, output_vec, output_vec_len)) {
7906                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
7907                 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
7908                 rte_hexdump(stdout, "reference", output_vec, output_vec_len);
7909                 ret = TEST_FAILED;
7910                 goto on_err;
7911         }
7912
7913 on_err:
7914         rte_crypto_op_free(ut_params->op);
7915         ut_params->op = NULL;
7916
7917         if (ut_params->sec_session)
7918                 rte_security_session_destroy(ctx, ut_params->sec_session);
7919         ut_params->sec_session = NULL;
7920
7921         rte_pktmbuf_free(ut_params->ibuf);
7922         ut_params->ibuf = NULL;
7923         if (oop) {
7924                 rte_pktmbuf_free(ut_params->obuf);
7925                 ut_params->obuf = NULL;
7926         }
7927
7928         return ret;
7929 }
7930
7931 static int
7932 test_pdcp_proto_SGL(int i, int oop,
7933         enum rte_crypto_cipher_operation opc,
7934         enum rte_crypto_auth_operation opa,
7935         uint8_t *input_vec,
7936         unsigned int input_vec_len,
7937         uint8_t *output_vec,
7938         unsigned int output_vec_len,
7939         uint32_t fragsz,
7940         uint32_t fragsz_oop)
7941 {
7942         struct crypto_testsuite_params *ts_params = &testsuite_params;
7943         struct crypto_unittest_params *ut_params = &unittest_params;
7944         uint8_t *plaintext;
7945         struct rte_mbuf *buf, *buf_oop = NULL;
7946         int ret = TEST_SUCCESS;
7947         int to_trn = 0;
7948         int to_trn_tbl[16];
7949         int segs = 1;
7950         unsigned int trn_data = 0;
7951         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7952                                 rte_cryptodev_get_sec_ctx(
7953                                 ts_params->valid_devs[0]);
7954
7955         /* Verify the capabilities */
7956         struct rte_security_capability_idx sec_cap_idx;
7957
7958         sec_cap_idx.action = ut_params->type;
7959         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7960         sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
7961         if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7962                 return -ENOTSUP;
7963
7964         if (fragsz > input_vec_len)
7965                 fragsz = input_vec_len;
7966
7967         uint16_t plaintext_len = fragsz;
7968         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
7969
7970         if (fragsz_oop > output_vec_len)
7971                 frag_size_oop = output_vec_len;
7972
7973         int ecx = 0;
7974         if (input_vec_len % fragsz != 0) {
7975                 if (input_vec_len / fragsz + 1 > 16)
7976                         return 1;
7977         } else if (input_vec_len / fragsz > 16)
7978                 return 1;
7979
7980         /* Out of place support */
7981         if (oop) {
7982                 /*
7983                  * For out-op-place we need to alloc another mbuf
7984                  */
7985                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7986                 rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
7987                 buf_oop = ut_params->obuf;
7988         }
7989
7990         /* Generate test mbuf data */
7991         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7992
7993         /* clear mbuf payload */
7994         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7995                         rte_pktmbuf_tailroom(ut_params->ibuf));
7996
7997         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7998                                                   plaintext_len);
7999         memcpy(plaintext, input_vec, plaintext_len);
8000         trn_data += plaintext_len;
8001
8002         buf = ut_params->ibuf;
8003
8004         /*
8005          * Loop until no more fragments
8006          */
8007
8008         while (trn_data < input_vec_len) {
8009                 ++segs;
8010                 to_trn = (input_vec_len - trn_data < fragsz) ?
8011                                 (input_vec_len - trn_data) : fragsz;
8012
8013                 to_trn_tbl[ecx++] = to_trn;
8014
8015                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8016                 buf = buf->next;
8017
8018                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8019                                 rte_pktmbuf_tailroom(buf));
8020
8021                 /* OOP */
8022                 if (oop && !fragsz_oop) {
8023                         buf_oop->next =
8024                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
8025                         buf_oop = buf_oop->next;
8026                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8027                                         0, rte_pktmbuf_tailroom(buf_oop));
8028                         rte_pktmbuf_append(buf_oop, to_trn);
8029                 }
8030
8031                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8032                                 to_trn);
8033
8034                 memcpy(plaintext, input_vec + trn_data, to_trn);
8035                 trn_data += to_trn;
8036         }
8037
8038         ut_params->ibuf->nb_segs = segs;
8039
8040         segs = 1;
8041         if (fragsz_oop && oop) {
8042                 to_trn = 0;
8043                 ecx = 0;
8044
8045                 trn_data = frag_size_oop;
8046                 while (trn_data < output_vec_len) {
8047                         ++segs;
8048                         to_trn =
8049                                 (output_vec_len - trn_data <
8050                                                 frag_size_oop) ?
8051                                 (output_vec_len - trn_data) :
8052                                                 frag_size_oop;
8053
8054                         to_trn_tbl[ecx++] = to_trn;
8055
8056                         buf_oop->next =
8057                                 rte_pktmbuf_alloc(ts_params->mbuf_pool);
8058                         buf_oop = buf_oop->next;
8059                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8060                                         0, rte_pktmbuf_tailroom(buf_oop));
8061                         rte_pktmbuf_append(buf_oop, to_trn);
8062
8063                         trn_data += to_trn;
8064                 }
8065                 ut_params->obuf->nb_segs = segs;
8066         }
8067
8068         /* Setup Cipher Parameters */
8069         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8070         ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8071         ut_params->cipher_xform.cipher.op = opc;
8072         ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8073         ut_params->cipher_xform.cipher.key.length =
8074                                         pdcp_test_params[i].cipher_key_len;
8075         ut_params->cipher_xform.cipher.iv.length = 0;
8076
8077         /* Setup HMAC Parameters if ICV header is required */
8078         if (pdcp_test_params[i].auth_alg != 0) {
8079                 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8080                 ut_params->auth_xform.next = NULL;
8081                 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8082                 ut_params->auth_xform.auth.op = opa;
8083                 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8084                 ut_params->auth_xform.auth.key.length =
8085                                         pdcp_test_params[i].auth_key_len;
8086
8087                 ut_params->cipher_xform.next = &ut_params->auth_xform;
8088         } else {
8089                 ut_params->cipher_xform.next = NULL;
8090         }
8091
8092         struct rte_security_session_conf sess_conf = {
8093                 .action_type = ut_params->type,
8094                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8095                 {.pdcp = {
8096                         .bearer = pdcp_test_bearer[i],
8097                         .domain = pdcp_test_params[i].domain,
8098                         .pkt_dir = pdcp_test_packet_direction[i],
8099                         .sn_size = pdcp_test_data_sn_size[i],
8100                         .hfn = pdcp_test_hfn[i],
8101                         .hfn_threshold = pdcp_test_hfn_threshold[i],
8102                         .hfn_ovrd = 0,
8103                 } },
8104                 .crypto_xform = &ut_params->cipher_xform
8105         };
8106
8107         /* Create security session */
8108         ut_params->sec_session = rte_security_session_create(ctx,
8109                                 &sess_conf, ts_params->session_mpool,
8110                                 ts_params->session_priv_mpool);
8111
8112         if (!ut_params->sec_session) {
8113                 printf("TestCase %s()-%d line %d failed %s: ",
8114                         __func__, i, __LINE__, "Failed to allocate session");
8115                 ret = TEST_FAILED;
8116                 goto on_err;
8117         }
8118
8119         /* Generate crypto op data structure */
8120         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8121                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8122         if (!ut_params->op) {
8123                 printf("TestCase %s()-%d line %d failed %s: ",
8124                         __func__, i, __LINE__,
8125                         "Failed to allocate symmetric crypto operation struct");
8126                 ret = TEST_FAILED;
8127                 goto on_err;
8128         }
8129
8130         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8131
8132         /* set crypto operation source mbuf */
8133         ut_params->op->sym->m_src = ut_params->ibuf;
8134         if (oop)
8135                 ut_params->op->sym->m_dst = ut_params->obuf;
8136
8137         /* Process crypto operation */
8138         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8139                 == NULL) {
8140                 printf("TestCase %s()-%d line %d failed %s: ",
8141                         __func__, i, __LINE__,
8142                         "failed to process sym crypto op");
8143                 ret = TEST_FAILED;
8144                 goto on_err;
8145         }
8146
8147         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8148                 printf("TestCase %s()-%d line %d failed %s: ",
8149                         __func__, i, __LINE__, "crypto op processing failed");
8150                 ret = TEST_FAILED;
8151                 goto on_err;
8152         }
8153
8154         /* Validate obuf */
8155         uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8156                         uint8_t *);
8157         if (oop) {
8158                 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8159                                 uint8_t *);
8160         }
8161         if (fragsz_oop)
8162                 fragsz = frag_size_oop;
8163         if (memcmp(ciphertext, output_vec, fragsz)) {
8164                 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8165                 rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8166                 rte_hexdump(stdout, "reference", output_vec, fragsz);
8167                 ret = TEST_FAILED;
8168                 goto on_err;
8169         }
8170
8171         buf = ut_params->op->sym->m_src->next;
8172         if (oop)
8173                 buf = ut_params->op->sym->m_dst->next;
8174
8175         unsigned int off = fragsz;
8176
8177         ecx = 0;
8178         while (buf) {
8179                 ciphertext = rte_pktmbuf_mtod(buf,
8180                                 uint8_t *);
8181                 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8182                         printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8183                         rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8184                         rte_hexdump(stdout, "reference", output_vec + off,
8185                                         to_trn_tbl[ecx]);
8186                         ret = TEST_FAILED;
8187                         goto on_err;
8188                 }
8189                 off += to_trn_tbl[ecx++];
8190                 buf = buf->next;
8191         }
8192 on_err:
8193         rte_crypto_op_free(ut_params->op);
8194         ut_params->op = NULL;
8195
8196         if (ut_params->sec_session)
8197                 rte_security_session_destroy(ctx, ut_params->sec_session);
8198         ut_params->sec_session = NULL;
8199
8200         rte_pktmbuf_free(ut_params->ibuf);
8201         ut_params->ibuf = NULL;
8202         if (oop) {
8203                 rte_pktmbuf_free(ut_params->obuf);
8204                 ut_params->obuf = NULL;
8205         }
8206
8207         return ret;
8208 }
8209
8210 int
8211 test_pdcp_proto_cplane_encap(int i)
8212 {
8213         return test_pdcp_proto(
8214                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8215                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8216                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8217                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8218                 pdcp_test_params[i].cipher_key_len,
8219                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8220                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8221                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8222                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8223                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8224 }
8225
8226 int
8227 test_pdcp_proto_uplane_encap(int i)
8228 {
8229         return test_pdcp_proto(
8230                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8231                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8232                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8233                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8234                 pdcp_test_params[i].cipher_key_len,
8235                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8236                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8237                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8238                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8239                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8240 }
8241
8242 int
8243 test_pdcp_proto_uplane_encap_with_int(int i)
8244 {
8245         return test_pdcp_proto(
8246                 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8247                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8248                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8249                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8250                 pdcp_test_params[i].cipher_key_len,
8251                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8252                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8253                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8254                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8255                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8256 }
8257
8258 int
8259 test_pdcp_proto_cplane_decap(int i)
8260 {
8261         return test_pdcp_proto(
8262                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8263                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8264                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8265                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8266                 pdcp_test_params[i].cipher_key_len,
8267                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8268                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8269                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8270                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8271                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8272 }
8273
8274 int
8275 test_pdcp_proto_uplane_decap(int i)
8276 {
8277         return test_pdcp_proto(
8278                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8279                 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8280                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8281                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8282                 pdcp_test_params[i].cipher_key_len,
8283                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8284                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8285                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8286                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8287                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8288 }
8289
8290 int
8291 test_pdcp_proto_uplane_decap_with_int(int i)
8292 {
8293         return test_pdcp_proto(
8294                 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8295                 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8296                 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8297                 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8298                 pdcp_test_params[i].cipher_key_len,
8299                 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8300                 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8301                 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8302                 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8303                 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8304 }
8305
8306 static int
8307 test_PDCP_PROTO_SGL_in_place_32B(void)
8308 {
8309         /* i can be used for running any PDCP case
8310          * In this case it is uplane 12-bit AES-SNOW DL encap
8311          */
8312         int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8313         return test_pdcp_proto_SGL(i, IN_PLACE,
8314                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8315                         RTE_CRYPTO_AUTH_OP_GENERATE,
8316                         pdcp_test_data_in[i],
8317                         pdcp_test_data_in_len[i],
8318                         pdcp_test_data_out[i],
8319                         pdcp_test_data_in_len[i]+4,
8320                         32, 0);
8321 }
8322 static int
8323 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8324 {
8325         /* i can be used for running any PDCP case
8326          * In this case it is uplane 18-bit NULL-NULL DL encap
8327          */
8328         int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8329         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8330                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8331                         RTE_CRYPTO_AUTH_OP_GENERATE,
8332                         pdcp_test_data_in[i],
8333                         pdcp_test_data_in_len[i],
8334                         pdcp_test_data_out[i],
8335                         pdcp_test_data_in_len[i]+4,
8336                         32, 128);
8337 }
8338 static int
8339 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8340 {
8341         /* i can be used for running any PDCP case
8342          * In this case it is uplane 18-bit AES DL encap
8343          */
8344         int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8345                         + DOWNLINK;
8346         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8347                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8348                         RTE_CRYPTO_AUTH_OP_GENERATE,
8349                         pdcp_test_data_in[i],
8350                         pdcp_test_data_in_len[i],
8351                         pdcp_test_data_out[i],
8352                         pdcp_test_data_in_len[i],
8353                         32, 40);
8354 }
8355 static int
8356 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8357 {
8358         /* i can be used for running any PDCP case
8359          * In this case it is cplane 12-bit AES-ZUC DL encap
8360          */
8361         int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8362         return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8363                         RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8364                         RTE_CRYPTO_AUTH_OP_GENERATE,
8365                         pdcp_test_data_in[i],
8366                         pdcp_test_data_in_len[i],
8367                         pdcp_test_data_out[i],
8368                         pdcp_test_data_in_len[i]+4,
8369                         128, 32);
8370 }
8371
8372 static int
8373 test_PDCP_SDAP_PROTO_encap_all(void)
8374 {
8375         int i = 0, size = 0;
8376         int err, all_err = TEST_SUCCESS;
8377         const struct pdcp_sdap_test *cur_test;
8378
8379         size = ARRAY_SIZE(list_pdcp_sdap_tests);
8380
8381         for (i = 0; i < size; i++) {
8382                 cur_test = &list_pdcp_sdap_tests[i];
8383                 err = test_pdcp_proto(
8384                         i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8385                         RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8386                         cur_test->in_len, cur_test->data_out,
8387                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8388                         cur_test->param.cipher_alg, cur_test->cipher_key,
8389                         cur_test->param.cipher_key_len,
8390                         cur_test->param.auth_alg,
8391                         cur_test->auth_key, cur_test->param.auth_key_len,
8392                         cur_test->bearer, cur_test->param.domain,
8393                         cur_test->packet_direction, cur_test->sn_size,
8394                         cur_test->hfn,
8395                         cur_test->hfn_threshold, SDAP_ENABLED);
8396                 if (err) {
8397                         printf("\t%d) %s: Encapsulation failed\n",
8398                                         cur_test->test_idx,
8399                                         cur_test->param.name);
8400                         err = TEST_FAILED;
8401                 } else {
8402                         printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8403                                         cur_test->param.name);
8404                         err = TEST_SUCCESS;
8405                 }
8406                 all_err += err;
8407         }
8408
8409         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8410
8411         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8412 }
8413
8414 static int
8415 test_PDCP_SDAP_PROTO_decap_all(void)
8416 {
8417         int i = 0, size = 0;
8418         int err, all_err = TEST_SUCCESS;
8419         const struct pdcp_sdap_test *cur_test;
8420
8421         size = ARRAY_SIZE(list_pdcp_sdap_tests);
8422
8423         for (i = 0; i < size; i++) {
8424                 cur_test = &list_pdcp_sdap_tests[i];
8425                 err = test_pdcp_proto(
8426                         i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
8427                         RTE_CRYPTO_AUTH_OP_VERIFY,
8428                         cur_test->data_out,
8429                         cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8430                         cur_test->data_in, cur_test->in_len,
8431                         cur_test->param.cipher_alg,
8432                         cur_test->cipher_key, cur_test->param.cipher_key_len,
8433                         cur_test->param.auth_alg, cur_test->auth_key,
8434                         cur_test->param.auth_key_len, cur_test->bearer,
8435                         cur_test->param.domain, cur_test->packet_direction,
8436                         cur_test->sn_size, cur_test->hfn,
8437                         cur_test->hfn_threshold, SDAP_ENABLED);
8438                 if (err) {
8439                         printf("\t%d) %s: Decapsulation failed\n",
8440                                         cur_test->test_idx,
8441                                         cur_test->param.name);
8442                         err = TEST_FAILED;
8443                 } else {
8444                         printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
8445                                         cur_test->param.name);
8446                         err = TEST_SUCCESS;
8447                 }
8448                 all_err += err;
8449         }
8450
8451         printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8452
8453         return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8454 }
8455
8456 static int
8457 test_PDCP_PROTO_all(void)
8458 {
8459         struct crypto_testsuite_params *ts_params = &testsuite_params;
8460         struct crypto_unittest_params *ut_params = &unittest_params;
8461         struct rte_cryptodev_info dev_info;
8462         int status;
8463
8464         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8465         uint64_t feat_flags = dev_info.feature_flags;
8466
8467         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8468                 return -ENOTSUP;
8469
8470         /* Set action type */
8471         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8472                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8473                 gbl_action_type;
8474
8475         if (security_proto_supported(ut_params->type,
8476                         RTE_SECURITY_PROTOCOL_PDCP) < 0)
8477                 return -ENOTSUP;
8478
8479         status = test_PDCP_PROTO_cplane_encap_all();
8480         status += test_PDCP_PROTO_cplane_decap_all();
8481         status += test_PDCP_PROTO_uplane_encap_all();
8482         status += test_PDCP_PROTO_uplane_decap_all();
8483         status += test_PDCP_PROTO_SGL_in_place_32B();
8484         status += test_PDCP_PROTO_SGL_oop_32B_128B();
8485         status += test_PDCP_PROTO_SGL_oop_32B_40B();
8486         status += test_PDCP_PROTO_SGL_oop_128B_32B();
8487         status += test_PDCP_SDAP_PROTO_encap_all();
8488         status += test_PDCP_SDAP_PROTO_decap_all();
8489
8490         if (status)
8491                 return TEST_FAILED;
8492         else
8493                 return TEST_SUCCESS;
8494 }
8495
8496 static int
8497 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
8498 {
8499         struct crypto_testsuite_params *ts_params = &testsuite_params;
8500         struct crypto_unittest_params *ut_params = &unittest_params;
8501         uint8_t *plaintext, *ciphertext;
8502         uint8_t *iv_ptr;
8503         int32_t cipher_len, crc_len;
8504         uint32_t crc_data_len;
8505         int ret = TEST_SUCCESS;
8506
8507         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8508                                         rte_cryptodev_get_sec_ctx(
8509                                                 ts_params->valid_devs[0]);
8510
8511         /* Verify the capabilities */
8512         struct rte_security_capability_idx sec_cap_idx;
8513         const struct rte_security_capability *sec_cap;
8514         const struct rte_cryptodev_capabilities *crypto_cap;
8515         const struct rte_cryptodev_symmetric_capability *sym_cap;
8516         int j = 0;
8517
8518         sec_cap_idx.action = ut_params->type;
8519         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8520         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
8521
8522         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8523         if (sec_cap == NULL)
8524                 return -ENOTSUP;
8525
8526         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8527                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8528                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8529                                 crypto_cap->sym.xform_type ==
8530                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
8531                                 crypto_cap->sym.cipher.algo ==
8532                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8533                         sym_cap = &crypto_cap->sym;
8534                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8535                                                 d_td->key.len,
8536                                                 d_td->iv.len) == 0)
8537                                 break;
8538                 }
8539         }
8540
8541         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8542                 return -ENOTSUP;
8543
8544         /* Setup source mbuf payload */
8545         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8546         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8547                         rte_pktmbuf_tailroom(ut_params->ibuf));
8548
8549         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8550                         d_td->ciphertext.len);
8551
8552         memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
8553
8554         /* Setup cipher session parameters */
8555         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8556         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8557         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
8558         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8559         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8560         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8561         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8562         ut_params->cipher_xform.next = NULL;
8563
8564         /* Setup DOCSIS session parameters */
8565         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
8566
8567         struct rte_security_session_conf sess_conf = {
8568                 .action_type = ut_params->type,
8569                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8570                 .docsis = ut_params->docsis_xform,
8571                 .crypto_xform = &ut_params->cipher_xform,
8572         };
8573
8574         /* Create security session */
8575         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8576                                         ts_params->session_mpool,
8577                                         ts_params->session_priv_mpool);
8578
8579         if (!ut_params->sec_session) {
8580                 printf("TestCase %s(%d) line %d: %s\n",
8581                         __func__, i, __LINE__, "failed to allocate session");
8582                 ret = TEST_FAILED;
8583                 goto on_err;
8584         }
8585
8586         /* Generate crypto op data structure */
8587         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8588                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8589         if (!ut_params->op) {
8590                 printf("TestCase %s(%d) line %d: %s\n",
8591                         __func__, i, __LINE__,
8592                         "failed to allocate symmetric crypto operation");
8593                 ret = TEST_FAILED;
8594                 goto on_err;
8595         }
8596
8597         /* Setup CRC operation parameters */
8598         crc_len = d_td->ciphertext.no_crc == false ?
8599                         (d_td->ciphertext.len -
8600                                 d_td->ciphertext.crc_offset -
8601                                 RTE_ETHER_CRC_LEN) :
8602                         0;
8603         crc_len = crc_len > 0 ? crc_len : 0;
8604         crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
8605         ut_params->op->sym->auth.data.length = crc_len;
8606         ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
8607
8608         /* Setup cipher operation parameters */
8609         cipher_len = d_td->ciphertext.no_cipher == false ?
8610                         (d_td->ciphertext.len -
8611                                 d_td->ciphertext.cipher_offset) :
8612                         0;
8613         cipher_len = cipher_len > 0 ? cipher_len : 0;
8614         ut_params->op->sym->cipher.data.length = cipher_len;
8615         ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
8616
8617         /* Setup cipher IV */
8618         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8619         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8620
8621         /* Attach session to operation */
8622         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8623
8624         /* Set crypto operation mbufs */
8625         ut_params->op->sym->m_src = ut_params->ibuf;
8626         ut_params->op->sym->m_dst = NULL;
8627
8628         /* Process crypto operation */
8629         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8630                         NULL) {
8631                 printf("TestCase %s(%d) line %d: %s\n",
8632                         __func__, i, __LINE__,
8633                         "failed to process security crypto op");
8634                 ret = TEST_FAILED;
8635                 goto on_err;
8636         }
8637
8638         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8639                 printf("TestCase %s(%d) line %d: %s\n",
8640                         __func__, i, __LINE__, "crypto op processing failed");
8641                 ret = TEST_FAILED;
8642                 goto on_err;
8643         }
8644
8645         /* Validate plaintext */
8646         plaintext = ciphertext;
8647
8648         if (memcmp(plaintext, d_td->plaintext.data,
8649                         d_td->plaintext.len - crc_data_len)) {
8650                 printf("TestCase %s(%d) line %d: %s\n",
8651                         __func__, i, __LINE__, "plaintext not as expected\n");
8652                 rte_hexdump(stdout, "expected", d_td->plaintext.data,
8653                                 d_td->plaintext.len);
8654                 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
8655                 ret = TEST_FAILED;
8656                 goto on_err;
8657         }
8658
8659 on_err:
8660         rte_crypto_op_free(ut_params->op);
8661         ut_params->op = NULL;
8662
8663         if (ut_params->sec_session)
8664                 rte_security_session_destroy(ctx, ut_params->sec_session);
8665         ut_params->sec_session = NULL;
8666
8667         rte_pktmbuf_free(ut_params->ibuf);
8668         ut_params->ibuf = NULL;
8669
8670         return ret;
8671 }
8672
8673 static int
8674 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
8675 {
8676         struct crypto_testsuite_params *ts_params = &testsuite_params;
8677         struct crypto_unittest_params *ut_params = &unittest_params;
8678         uint8_t *plaintext, *ciphertext;
8679         uint8_t *iv_ptr;
8680         int32_t cipher_len, crc_len;
8681         int ret = TEST_SUCCESS;
8682
8683         struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8684                                         rte_cryptodev_get_sec_ctx(
8685                                                 ts_params->valid_devs[0]);
8686
8687         /* Verify the capabilities */
8688         struct rte_security_capability_idx sec_cap_idx;
8689         const struct rte_security_capability *sec_cap;
8690         const struct rte_cryptodev_capabilities *crypto_cap;
8691         const struct rte_cryptodev_symmetric_capability *sym_cap;
8692         int j = 0;
8693
8694         sec_cap_idx.action = ut_params->type;
8695         sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8696         sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8697
8698         sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8699         if (sec_cap == NULL)
8700                 return -ENOTSUP;
8701
8702         while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8703                         RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8704                 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8705                                 crypto_cap->sym.xform_type ==
8706                                         RTE_CRYPTO_SYM_XFORM_CIPHER &&
8707                                 crypto_cap->sym.cipher.algo ==
8708                                         RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8709                         sym_cap = &crypto_cap->sym;
8710                         if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8711                                                 d_td->key.len,
8712                                                 d_td->iv.len) == 0)
8713                                 break;
8714                 }
8715         }
8716
8717         if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8718                 return -ENOTSUP;
8719
8720         /* Setup source mbuf payload */
8721         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8722         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8723                         rte_pktmbuf_tailroom(ut_params->ibuf));
8724
8725         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8726                         d_td->plaintext.len);
8727
8728         memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
8729
8730         /* Setup cipher session parameters */
8731         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8732         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8733         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
8734         ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8735         ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8736         ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8737         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8738         ut_params->cipher_xform.next = NULL;
8739
8740         /* Setup DOCSIS session parameters */
8741         ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8742
8743         struct rte_security_session_conf sess_conf = {
8744                 .action_type = ut_params->type,
8745                 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8746                 .docsis = ut_params->docsis_xform,
8747                 .crypto_xform = &ut_params->cipher_xform,
8748         };
8749
8750         /* Create security session */
8751         ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8752                                         ts_params->session_mpool,
8753                                         ts_params->session_priv_mpool);
8754
8755         if (!ut_params->sec_session) {
8756                 printf("TestCase %s(%d) line %d: %s\n",
8757                         __func__, i, __LINE__, "failed to allocate session");
8758                 ret = TEST_FAILED;
8759                 goto on_err;
8760         }
8761
8762         /* Generate crypto op data structure */
8763         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8764                                 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8765         if (!ut_params->op) {
8766                 printf("TestCase %s(%d) line %d: %s\n",
8767                         __func__, i, __LINE__,
8768                         "failed to allocate security crypto operation");
8769                 ret = TEST_FAILED;
8770                 goto on_err;
8771         }
8772
8773         /* Setup CRC operation parameters */
8774         crc_len = d_td->plaintext.no_crc == false ?
8775                         (d_td->plaintext.len -
8776                                 d_td->plaintext.crc_offset -
8777                                 RTE_ETHER_CRC_LEN) :
8778                         0;
8779         crc_len = crc_len > 0 ? crc_len : 0;
8780         ut_params->op->sym->auth.data.length = crc_len;
8781         ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
8782
8783         /* Setup cipher operation parameters */
8784         cipher_len = d_td->plaintext.no_cipher == false ?
8785                         (d_td->plaintext.len -
8786                                 d_td->plaintext.cipher_offset) :
8787                         0;
8788         cipher_len = cipher_len > 0 ? cipher_len : 0;
8789         ut_params->op->sym->cipher.data.length = cipher_len;
8790         ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
8791
8792         /* Setup cipher IV */
8793         iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8794         rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8795
8796         /* Attach session to operation */
8797         rte_security_attach_session(ut_params->op, ut_params->sec_session);
8798
8799         /* Set crypto operation mbufs */
8800         ut_params->op->sym->m_src = ut_params->ibuf;
8801         ut_params->op->sym->m_dst = NULL;
8802
8803         /* Process crypto operation */
8804         if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8805                         NULL) {
8806                 printf("TestCase %s(%d) line %d: %s\n",
8807                         __func__, i, __LINE__,
8808                         "failed to process security crypto op");
8809                 ret = TEST_FAILED;
8810                 goto on_err;
8811         }
8812
8813         if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8814                 printf("TestCase %s(%d) line %d: %s\n",
8815                         __func__, i, __LINE__, "crypto op processing failed");
8816                 ret = TEST_FAILED;
8817                 goto on_err;
8818         }
8819
8820         /* Validate ciphertext */
8821         ciphertext = plaintext;
8822
8823         if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
8824                 printf("TestCase %s(%d) line %d: %s\n",
8825                         __func__, i, __LINE__, "ciphertext not as expected\n");
8826                 rte_hexdump(stdout, "expected", d_td->ciphertext.data,
8827                                 d_td->ciphertext.len);
8828                 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
8829                 ret = TEST_FAILED;
8830                 goto on_err;
8831         }
8832
8833 on_err:
8834         rte_crypto_op_free(ut_params->op);
8835         ut_params->op = NULL;
8836
8837         if (ut_params->sec_session)
8838                 rte_security_session_destroy(ctx, ut_params->sec_session);
8839         ut_params->sec_session = NULL;
8840
8841         rte_pktmbuf_free(ut_params->ibuf);
8842         ut_params->ibuf = NULL;
8843
8844         return ret;
8845 }
8846
8847 #define TEST_DOCSIS_COUNT(func) do {                    \
8848         int ret = func;                                 \
8849         if (ret == TEST_SUCCESS)  {                     \
8850                 printf("\t%2d)", n++);                  \
8851                 printf("+++++ PASSED:" #func"\n");      \
8852                 p++;                                    \
8853         } else if (ret == -ENOTSUP) {                   \
8854                 printf("\t%2d)", n++);                  \
8855                 printf("~~~~~ UNSUPP:" #func"\n");      \
8856                 u++;                                    \
8857         } else {                                        \
8858                 printf("\t%2d)", n++);                  \
8859                 printf("----- FAILED:" #func"\n");      \
8860                 f++;                                    \
8861         }                                               \
8862 } while (0)
8863
8864 static int
8865 test_DOCSIS_PROTO_uplink_all(void)
8866 {
8867         int p = 0, u = 0, f = 0, n = 0;
8868
8869         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
8870         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
8871         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
8872         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
8873         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
8874         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
8875         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
8876         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
8877         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
8878         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
8879         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
8880         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
8881         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
8882         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
8883         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
8884         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
8885         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
8886         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
8887         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
8888         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
8889         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
8890         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
8891         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
8892         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
8893         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
8894         TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
8895
8896         if (f)
8897                 printf("## %s: %d passed out of %d (%d unsupported)\n",
8898                         __func__, p, n, u);
8899
8900         return f;
8901 };
8902
8903 static int
8904 test_DOCSIS_PROTO_downlink_all(void)
8905 {
8906         int p = 0, u = 0, f = 0, n = 0;
8907
8908         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
8909         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
8910         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
8911         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
8912         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
8913         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
8914         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
8915         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
8916         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
8917         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
8918         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
8919         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
8920         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
8921         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
8922         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
8923         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
8924         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
8925         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
8926         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
8927         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
8928         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
8929         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
8930         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
8931         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
8932         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
8933         TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
8934
8935         if (f)
8936                 printf("## %s: %d passed out of %d (%d unsupported)\n",
8937                         __func__, p, n, u);
8938
8939         return f;
8940 };
8941
8942 static int
8943 test_DOCSIS_PROTO_all(void)
8944 {
8945         struct crypto_testsuite_params *ts_params = &testsuite_params;
8946         struct crypto_unittest_params *ut_params = &unittest_params;
8947         struct rte_cryptodev_info dev_info;
8948         int status;
8949
8950         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8951         uint64_t feat_flags = dev_info.feature_flags;
8952
8953         if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8954                 return -ENOTSUP;
8955
8956         /* Set action type */
8957         ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8958                 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8959                 gbl_action_type;
8960
8961         if (security_proto_supported(ut_params->type,
8962                         RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
8963                 return -ENOTSUP;
8964
8965         status = test_DOCSIS_PROTO_uplink_all();
8966         status += test_DOCSIS_PROTO_downlink_all();
8967
8968         if (status)
8969                 return TEST_FAILED;
8970         else
8971                 return TEST_SUCCESS;
8972 }
8973 #endif
8974
8975 static int
8976 test_AES_GCM_authenticated_encryption_test_case_1(void)
8977 {
8978         return test_authenticated_encryption(&gcm_test_case_1);
8979 }
8980
8981 static int
8982 test_AES_GCM_authenticated_encryption_test_case_2(void)
8983 {
8984         return test_authenticated_encryption(&gcm_test_case_2);
8985 }
8986
8987 static int
8988 test_AES_GCM_authenticated_encryption_test_case_3(void)
8989 {
8990         return test_authenticated_encryption(&gcm_test_case_3);
8991 }
8992
8993 static int
8994 test_AES_GCM_authenticated_encryption_test_case_4(void)
8995 {
8996         return test_authenticated_encryption(&gcm_test_case_4);
8997 }
8998
8999 static int
9000 test_AES_GCM_authenticated_encryption_test_case_5(void)
9001 {
9002         return test_authenticated_encryption(&gcm_test_case_5);
9003 }
9004
9005 static int
9006 test_AES_GCM_authenticated_encryption_test_case_6(void)
9007 {
9008         return test_authenticated_encryption(&gcm_test_case_6);
9009 }
9010
9011 static int
9012 test_AES_GCM_authenticated_encryption_test_case_7(void)
9013 {
9014         return test_authenticated_encryption(&gcm_test_case_7);
9015 }
9016
9017 static int
9018 test_AES_GCM_authenticated_encryption_test_case_8(void)
9019 {
9020         return test_authenticated_encryption(&gcm_test_case_8);
9021 }
9022
9023 static int
9024 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9025 {
9026         return test_authenticated_encryption(&gcm_J0_test_case_1);
9027 }
9028
9029 static int
9030 test_AES_GCM_auth_encryption_test_case_192_1(void)
9031 {
9032         return test_authenticated_encryption(&gcm_test_case_192_1);
9033 }
9034
9035 static int
9036 test_AES_GCM_auth_encryption_test_case_192_2(void)
9037 {
9038         return test_authenticated_encryption(&gcm_test_case_192_2);
9039 }
9040
9041 static int
9042 test_AES_GCM_auth_encryption_test_case_192_3(void)
9043 {
9044         return test_authenticated_encryption(&gcm_test_case_192_3);
9045 }
9046
9047 static int
9048 test_AES_GCM_auth_encryption_test_case_192_4(void)
9049 {
9050         return test_authenticated_encryption(&gcm_test_case_192_4);
9051 }
9052
9053 static int
9054 test_AES_GCM_auth_encryption_test_case_192_5(void)
9055 {
9056         return test_authenticated_encryption(&gcm_test_case_192_5);
9057 }
9058
9059 static int
9060 test_AES_GCM_auth_encryption_test_case_192_6(void)
9061 {
9062         return test_authenticated_encryption(&gcm_test_case_192_6);
9063 }
9064
9065 static int
9066 test_AES_GCM_auth_encryption_test_case_192_7(void)
9067 {
9068         return test_authenticated_encryption(&gcm_test_case_192_7);
9069 }
9070
9071 static int
9072 test_AES_GCM_auth_encryption_test_case_256_1(void)
9073 {
9074         return test_authenticated_encryption(&gcm_test_case_256_1);
9075 }
9076
9077 static int
9078 test_AES_GCM_auth_encryption_test_case_256_2(void)
9079 {
9080         return test_authenticated_encryption(&gcm_test_case_256_2);
9081 }
9082
9083 static int
9084 test_AES_GCM_auth_encryption_test_case_256_3(void)
9085 {
9086         return test_authenticated_encryption(&gcm_test_case_256_3);
9087 }
9088
9089 static int
9090 test_AES_GCM_auth_encryption_test_case_256_4(void)
9091 {
9092         return test_authenticated_encryption(&gcm_test_case_256_4);
9093 }
9094
9095 static int
9096 test_AES_GCM_auth_encryption_test_case_256_5(void)
9097 {
9098         return test_authenticated_encryption(&gcm_test_case_256_5);
9099 }
9100
9101 static int
9102 test_AES_GCM_auth_encryption_test_case_256_6(void)
9103 {
9104         return test_authenticated_encryption(&gcm_test_case_256_6);
9105 }
9106
9107 static int
9108 test_AES_GCM_auth_encryption_test_case_256_7(void)
9109 {
9110         return test_authenticated_encryption(&gcm_test_case_256_7);
9111 }
9112
9113 static int
9114 test_AES_GCM_auth_encryption_test_case_aad_1(void)
9115 {
9116         return test_authenticated_encryption(&gcm_test_case_aad_1);
9117 }
9118
9119 static int
9120 test_AES_GCM_auth_encryption_test_case_aad_2(void)
9121 {
9122         return test_authenticated_encryption(&gcm_test_case_aad_2);
9123 }
9124
9125 static int
9126 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
9127 {
9128         struct aead_test_data tdata;
9129         int res;
9130
9131         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9132         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9133         tdata.iv.data[0] += 1;
9134         res = test_authenticated_encryption(&tdata);
9135         if (res == -ENOTSUP)
9136                 return res;
9137         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9138         return TEST_SUCCESS;
9139 }
9140
9141 static int
9142 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
9143 {
9144         struct aead_test_data tdata;
9145         int res;
9146
9147         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9148         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9149         tdata.plaintext.data[0] += 1;
9150         res = test_authenticated_encryption(&tdata);
9151         if (res == -ENOTSUP)
9152                 return res;
9153         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9154         return TEST_SUCCESS;
9155 }
9156
9157 static int
9158 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
9159 {
9160         struct aead_test_data tdata;
9161         int res;
9162
9163         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9164         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9165         tdata.ciphertext.data[0] += 1;
9166         res = test_authenticated_encryption(&tdata);
9167         if (res == -ENOTSUP)
9168                 return res;
9169         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9170         return TEST_SUCCESS;
9171 }
9172
9173 static int
9174 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
9175 {
9176         struct aead_test_data tdata;
9177         int res;
9178
9179         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9180         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9181         tdata.aad.len += 1;
9182         res = test_authenticated_encryption(&tdata);
9183         if (res == -ENOTSUP)
9184                 return res;
9185         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9186         return TEST_SUCCESS;
9187 }
9188
9189 static int
9190 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
9191 {
9192         struct aead_test_data tdata;
9193         uint8_t aad[gcm_test_case_7.aad.len];
9194         int res;
9195
9196         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9197         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9198         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9199         aad[0] += 1;
9200         tdata.aad.data = aad;
9201         res = test_authenticated_encryption(&tdata);
9202         if (res == -ENOTSUP)
9203                 return res;
9204         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9205         return TEST_SUCCESS;
9206 }
9207
9208 static int
9209 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
9210 {
9211         struct aead_test_data tdata;
9212         int res;
9213
9214         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9215         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9216         tdata.auth_tag.data[0] += 1;
9217         res = test_authenticated_encryption(&tdata);
9218         if (res == -ENOTSUP)
9219                 return res;
9220         TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9221         return TEST_SUCCESS;
9222 }
9223
9224 static int
9225 test_authenticated_decryption(const struct aead_test_data *tdata)
9226 {
9227         struct crypto_testsuite_params *ts_params = &testsuite_params;
9228         struct crypto_unittest_params *ut_params = &unittest_params;
9229
9230         int retval;
9231         uint8_t *plaintext;
9232         uint32_t i;
9233         struct rte_cryptodev_info dev_info;
9234
9235         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9236         uint64_t feat_flags = dev_info.feature_flags;
9237
9238         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9239                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9240                 printf("Device doesn't support RAW data-path APIs.\n");
9241                 return -ENOTSUP;
9242         }
9243
9244         /* Verify the capabilities */
9245         struct rte_cryptodev_sym_capability_idx cap_idx;
9246         const struct rte_cryptodev_symmetric_capability *capability;
9247         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9248         cap_idx.algo.aead = tdata->algo;
9249         capability = rte_cryptodev_sym_capability_get(
9250                         ts_params->valid_devs[0], &cap_idx);
9251         if (capability == NULL)
9252                 return -ENOTSUP;
9253         if (rte_cryptodev_sym_capability_check_aead(
9254                         capability, tdata->key.len, tdata->auth_tag.len,
9255                         tdata->aad.len, tdata->iv.len))
9256                 return -ENOTSUP;
9257
9258         /* Create AEAD session */
9259         retval = create_aead_session(ts_params->valid_devs[0],
9260                         tdata->algo,
9261                         RTE_CRYPTO_AEAD_OP_DECRYPT,
9262                         tdata->key.data, tdata->key.len,
9263                         tdata->aad.len, tdata->auth_tag.len,
9264                         tdata->iv.len);
9265         if (retval < 0)
9266                 return retval;
9267
9268         /* alloc mbuf and set payload */
9269         if (tdata->aad.len > MBUF_SIZE) {
9270                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
9271                 /* Populate full size of add data */
9272                 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
9273                         memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
9274         } else
9275                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9276
9277         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9278                         rte_pktmbuf_tailroom(ut_params->ibuf));
9279
9280         /* Create AEAD operation */
9281         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9282         if (retval < 0)
9283                 return retval;
9284
9285         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9286
9287         ut_params->op->sym->m_src = ut_params->ibuf;
9288
9289         /* Process crypto operation */
9290         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9291                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
9292         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9293                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9294                                 ut_params->op, 0, 0, 0, 0);
9295         else
9296                 TEST_ASSERT_NOT_NULL(
9297                         process_crypto_request(ts_params->valid_devs[0],
9298                         ut_params->op), "failed to process sym crypto op");
9299
9300         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9301                         "crypto op processing failed");
9302
9303         if (ut_params->op->sym->m_dst)
9304                 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
9305                                 uint8_t *);
9306         else
9307                 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
9308                                 uint8_t *,
9309                                 ut_params->op->sym->cipher.data.offset);
9310
9311         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9312
9313         /* Validate obuf */
9314         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9315                         plaintext,
9316                         tdata->plaintext.data,
9317                         tdata->plaintext.len,
9318                         "Plaintext data not as expected");
9319
9320         TEST_ASSERT_EQUAL(ut_params->op->status,
9321                         RTE_CRYPTO_OP_STATUS_SUCCESS,
9322                         "Authentication failed");
9323
9324         return 0;
9325 }
9326
9327 static int
9328 test_AES_GCM_authenticated_decryption_test_case_1(void)
9329 {
9330         return test_authenticated_decryption(&gcm_test_case_1);
9331 }
9332
9333 static int
9334 test_AES_GCM_authenticated_decryption_test_case_2(void)
9335 {
9336         return test_authenticated_decryption(&gcm_test_case_2);
9337 }
9338
9339 static int
9340 test_AES_GCM_authenticated_decryption_test_case_3(void)
9341 {
9342         return test_authenticated_decryption(&gcm_test_case_3);
9343 }
9344
9345 static int
9346 test_AES_GCM_authenticated_decryption_test_case_4(void)
9347 {
9348         return test_authenticated_decryption(&gcm_test_case_4);
9349 }
9350
9351 static int
9352 test_AES_GCM_authenticated_decryption_test_case_5(void)
9353 {
9354         return test_authenticated_decryption(&gcm_test_case_5);
9355 }
9356
9357 static int
9358 test_AES_GCM_authenticated_decryption_test_case_6(void)
9359 {
9360         return test_authenticated_decryption(&gcm_test_case_6);
9361 }
9362
9363 static int
9364 test_AES_GCM_authenticated_decryption_test_case_7(void)
9365 {
9366         return test_authenticated_decryption(&gcm_test_case_7);
9367 }
9368
9369 static int
9370 test_AES_GCM_authenticated_decryption_test_case_8(void)
9371 {
9372         return test_authenticated_decryption(&gcm_test_case_8);
9373 }
9374
9375 static int
9376 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
9377 {
9378         return test_authenticated_decryption(&gcm_J0_test_case_1);
9379 }
9380
9381 static int
9382 test_AES_GCM_auth_decryption_test_case_192_1(void)
9383 {
9384         return test_authenticated_decryption(&gcm_test_case_192_1);
9385 }
9386
9387 static int
9388 test_AES_GCM_auth_decryption_test_case_192_2(void)
9389 {
9390         return test_authenticated_decryption(&gcm_test_case_192_2);
9391 }
9392
9393 static int
9394 test_AES_GCM_auth_decryption_test_case_192_3(void)
9395 {
9396         return test_authenticated_decryption(&gcm_test_case_192_3);
9397 }
9398
9399 static int
9400 test_AES_GCM_auth_decryption_test_case_192_4(void)
9401 {
9402         return test_authenticated_decryption(&gcm_test_case_192_4);
9403 }
9404
9405 static int
9406 test_AES_GCM_auth_decryption_test_case_192_5(void)
9407 {
9408         return test_authenticated_decryption(&gcm_test_case_192_5);
9409 }
9410
9411 static int
9412 test_AES_GCM_auth_decryption_test_case_192_6(void)
9413 {
9414         return test_authenticated_decryption(&gcm_test_case_192_6);
9415 }
9416
9417 static int
9418 test_AES_GCM_auth_decryption_test_case_192_7(void)
9419 {
9420         return test_authenticated_decryption(&gcm_test_case_192_7);
9421 }
9422
9423 static int
9424 test_AES_GCM_auth_decryption_test_case_256_1(void)
9425 {
9426         return test_authenticated_decryption(&gcm_test_case_256_1);
9427 }
9428
9429 static int
9430 test_AES_GCM_auth_decryption_test_case_256_2(void)
9431 {
9432         return test_authenticated_decryption(&gcm_test_case_256_2);
9433 }
9434
9435 static int
9436 test_AES_GCM_auth_decryption_test_case_256_3(void)
9437 {
9438         return test_authenticated_decryption(&gcm_test_case_256_3);
9439 }
9440
9441 static int
9442 test_AES_GCM_auth_decryption_test_case_256_4(void)
9443 {
9444         return test_authenticated_decryption(&gcm_test_case_256_4);
9445 }
9446
9447 static int
9448 test_AES_GCM_auth_decryption_test_case_256_5(void)
9449 {
9450         return test_authenticated_decryption(&gcm_test_case_256_5);
9451 }
9452
9453 static int
9454 test_AES_GCM_auth_decryption_test_case_256_6(void)
9455 {
9456         return test_authenticated_decryption(&gcm_test_case_256_6);
9457 }
9458
9459 static int
9460 test_AES_GCM_auth_decryption_test_case_256_7(void)
9461 {
9462         return test_authenticated_decryption(&gcm_test_case_256_7);
9463 }
9464
9465 static int
9466 test_AES_GCM_auth_decryption_test_case_aad_1(void)
9467 {
9468         return test_authenticated_decryption(&gcm_test_case_aad_1);
9469 }
9470
9471 static int
9472 test_AES_GCM_auth_decryption_test_case_aad_2(void)
9473 {
9474         return test_authenticated_decryption(&gcm_test_case_aad_2);
9475 }
9476
9477 static int
9478 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
9479 {
9480         struct aead_test_data tdata;
9481         int res;
9482
9483         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9484         tdata.iv.data[0] += 1;
9485         res = test_authenticated_decryption(&tdata);
9486         if (res == -ENOTSUP)
9487                 return res;
9488         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9489         return TEST_SUCCESS;
9490 }
9491
9492 static int
9493 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
9494 {
9495         struct aead_test_data tdata;
9496         int res;
9497
9498         RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9499         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9500         tdata.plaintext.data[0] += 1;
9501         res = test_authenticated_decryption(&tdata);
9502         if (res == -ENOTSUP)
9503                 return res;
9504         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9505         return TEST_SUCCESS;
9506 }
9507
9508 static int
9509 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
9510 {
9511         struct aead_test_data tdata;
9512         int res;
9513
9514         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9515         tdata.ciphertext.data[0] += 1;
9516         res = test_authenticated_decryption(&tdata);
9517         if (res == -ENOTSUP)
9518                 return res;
9519         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9520         return TEST_SUCCESS;
9521 }
9522
9523 static int
9524 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
9525 {
9526         struct aead_test_data tdata;
9527         int res;
9528
9529         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9530         tdata.aad.len += 1;
9531         res = test_authenticated_decryption(&tdata);
9532         if (res == -ENOTSUP)
9533                 return res;
9534         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9535         return TEST_SUCCESS;
9536 }
9537
9538 static int
9539 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
9540 {
9541         struct aead_test_data tdata;
9542         uint8_t aad[gcm_test_case_7.aad.len];
9543         int res;
9544
9545         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9546         memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9547         aad[0] += 1;
9548         tdata.aad.data = aad;
9549         res = test_authenticated_decryption(&tdata);
9550         if (res == -ENOTSUP)
9551                 return res;
9552         TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9553         return TEST_SUCCESS;
9554 }
9555
9556 static int
9557 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
9558 {
9559         struct aead_test_data tdata;
9560         int res;
9561
9562         memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9563         tdata.auth_tag.data[0] += 1;
9564         res = test_authenticated_decryption(&tdata);
9565         if (res == -ENOTSUP)
9566                 return res;
9567         TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
9568         return TEST_SUCCESS;
9569 }
9570
9571 static int
9572 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
9573 {
9574         struct crypto_testsuite_params *ts_params = &testsuite_params;
9575         struct crypto_unittest_params *ut_params = &unittest_params;
9576
9577         int retval;
9578         uint8_t *ciphertext, *auth_tag;
9579         uint16_t plaintext_pad_len;
9580
9581         /* Verify the capabilities */
9582         struct rte_cryptodev_sym_capability_idx cap_idx;
9583         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9584         cap_idx.algo.aead = tdata->algo;
9585         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9586                         &cap_idx) == NULL)
9587                 return -ENOTSUP;
9588
9589         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9590                 return -ENOTSUP;
9591
9592         /* not supported with CPU crypto */
9593         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9594                 return -ENOTSUP;
9595
9596         /* Create AEAD session */
9597         retval = create_aead_session(ts_params->valid_devs[0],
9598                         tdata->algo,
9599                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
9600                         tdata->key.data, tdata->key.len,
9601                         tdata->aad.len, tdata->auth_tag.len,
9602                         tdata->iv.len);
9603         if (retval < 0)
9604                 return retval;
9605
9606         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9607         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9608
9609         /* clear mbuf payload */
9610         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9611                         rte_pktmbuf_tailroom(ut_params->ibuf));
9612         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9613                         rte_pktmbuf_tailroom(ut_params->obuf));
9614
9615         /* Create AEAD operation */
9616         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9617         if (retval < 0)
9618                 return retval;
9619
9620         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9621
9622         ut_params->op->sym->m_src = ut_params->ibuf;
9623         ut_params->op->sym->m_dst = ut_params->obuf;
9624
9625         /* Process crypto operation */
9626         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9627                         ut_params->op), "failed to process sym crypto op");
9628
9629         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9630                         "crypto op processing failed");
9631
9632         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9633
9634         ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9635                         ut_params->op->sym->cipher.data.offset);
9636         auth_tag = ciphertext + plaintext_pad_len;
9637
9638         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9639         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9640
9641         /* Validate obuf */
9642         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9643                         ciphertext,
9644                         tdata->ciphertext.data,
9645                         tdata->ciphertext.len,
9646                         "Ciphertext data not as expected");
9647
9648         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9649                         auth_tag,
9650                         tdata->auth_tag.data,
9651                         tdata->auth_tag.len,
9652                         "Generated auth tag not as expected");
9653
9654         return 0;
9655
9656 }
9657
9658 static int
9659 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
9660 {
9661         return test_authenticated_encryption_oop(&gcm_test_case_5);
9662 }
9663
9664 static int
9665 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
9666 {
9667         struct crypto_testsuite_params *ts_params = &testsuite_params;
9668         struct crypto_unittest_params *ut_params = &unittest_params;
9669
9670         int retval;
9671         uint8_t *plaintext;
9672
9673         /* Verify the capabilities */
9674         struct rte_cryptodev_sym_capability_idx cap_idx;
9675         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9676         cap_idx.algo.aead = tdata->algo;
9677         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9678                         &cap_idx) == NULL)
9679                 return -ENOTSUP;
9680
9681         /* not supported with CPU crypto and raw data-path APIs*/
9682         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
9683                         global_api_test_type == CRYPTODEV_RAW_API_TEST)
9684                 return -ENOTSUP;
9685
9686         /* Create AEAD session */
9687         retval = create_aead_session(ts_params->valid_devs[0],
9688                         tdata->algo,
9689                         RTE_CRYPTO_AEAD_OP_DECRYPT,
9690                         tdata->key.data, tdata->key.len,
9691                         tdata->aad.len, tdata->auth_tag.len,
9692                         tdata->iv.len);
9693         if (retval < 0)
9694                 return retval;
9695
9696         /* alloc mbuf and set payload */
9697         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9698         ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9699
9700         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9701                         rte_pktmbuf_tailroom(ut_params->ibuf));
9702         memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9703                         rte_pktmbuf_tailroom(ut_params->obuf));
9704
9705         /* Create AEAD operation */
9706         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9707         if (retval < 0)
9708                 return retval;
9709
9710         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9711
9712         ut_params->op->sym->m_src = ut_params->ibuf;
9713         ut_params->op->sym->m_dst = ut_params->obuf;
9714
9715         /* Process crypto operation */
9716         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9717                         ut_params->op), "failed to process sym crypto op");
9718
9719         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9720                         "crypto op processing failed");
9721
9722         plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9723                         ut_params->op->sym->cipher.data.offset);
9724
9725         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9726
9727         /* Validate obuf */
9728         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9729                         plaintext,
9730                         tdata->plaintext.data,
9731                         tdata->plaintext.len,
9732                         "Plaintext data not as expected");
9733
9734         TEST_ASSERT_EQUAL(ut_params->op->status,
9735                         RTE_CRYPTO_OP_STATUS_SUCCESS,
9736                         "Authentication failed");
9737         return 0;
9738 }
9739
9740 static int
9741 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
9742 {
9743         return test_authenticated_decryption_oop(&gcm_test_case_5);
9744 }
9745
9746 static int
9747 test_authenticated_encryption_sessionless(
9748                 const struct aead_test_data *tdata)
9749 {
9750         struct crypto_testsuite_params *ts_params = &testsuite_params;
9751         struct crypto_unittest_params *ut_params = &unittest_params;
9752
9753         int retval;
9754         uint8_t *ciphertext, *auth_tag;
9755         uint16_t plaintext_pad_len;
9756         uint8_t key[tdata->key.len + 1];
9757         struct rte_cryptodev_info dev_info;
9758
9759         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9760         uint64_t feat_flags = dev_info.feature_flags;
9761
9762         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9763                 printf("Device doesn't support Sessionless ops.\n");
9764                 return -ENOTSUP;
9765         }
9766
9767         /* not supported with CPU crypto */
9768         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9769                 return -ENOTSUP;
9770
9771         /* Verify the capabilities */
9772         struct rte_cryptodev_sym_capability_idx cap_idx;
9773         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9774         cap_idx.algo.aead = tdata->algo;
9775         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9776                         &cap_idx) == NULL)
9777                 return -ENOTSUP;
9778
9779         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9780
9781         /* clear mbuf payload */
9782         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9783                         rte_pktmbuf_tailroom(ut_params->ibuf));
9784
9785         /* Create AEAD operation */
9786         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9787         if (retval < 0)
9788                 return retval;
9789
9790         /* Create GCM xform */
9791         memcpy(key, tdata->key.data, tdata->key.len);
9792         retval = create_aead_xform(ut_params->op,
9793                         tdata->algo,
9794                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
9795                         key, tdata->key.len,
9796                         tdata->aad.len, tdata->auth_tag.len,
9797                         tdata->iv.len);
9798         if (retval < 0)
9799                 return retval;
9800
9801         ut_params->op->sym->m_src = ut_params->ibuf;
9802
9803         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9804                         RTE_CRYPTO_OP_SESSIONLESS,
9805                         "crypto op session type not sessionless");
9806
9807         /* Process crypto operation */
9808         TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9809                         ut_params->op), "failed to process sym crypto op");
9810
9811         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9812
9813         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9814                         "crypto op status not success");
9815
9816         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9817
9818         ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9819                         ut_params->op->sym->cipher.data.offset);
9820         auth_tag = ciphertext + plaintext_pad_len;
9821
9822         debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9823         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9824
9825         /* Validate obuf */
9826         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9827                         ciphertext,
9828                         tdata->ciphertext.data,
9829                         tdata->ciphertext.len,
9830                         "Ciphertext data not as expected");
9831
9832         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9833                         auth_tag,
9834                         tdata->auth_tag.data,
9835                         tdata->auth_tag.len,
9836                         "Generated auth tag not as expected");
9837
9838         return 0;
9839
9840 }
9841
9842 static int
9843 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
9844 {
9845         return test_authenticated_encryption_sessionless(
9846                         &gcm_test_case_5);
9847 }
9848
9849 static int
9850 test_authenticated_decryption_sessionless(
9851                 const struct aead_test_data *tdata)
9852 {
9853         struct crypto_testsuite_params *ts_params = &testsuite_params;
9854         struct crypto_unittest_params *ut_params = &unittest_params;
9855
9856         int retval;
9857         uint8_t *plaintext;
9858         uint8_t key[tdata->key.len + 1];
9859         struct rte_cryptodev_info dev_info;
9860
9861         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9862         uint64_t feat_flags = dev_info.feature_flags;
9863
9864         if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9865                 printf("Device doesn't support Sessionless ops.\n");
9866                 return -ENOTSUP;
9867         }
9868
9869         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9870                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9871                 printf("Device doesn't support RAW data-path APIs.\n");
9872                 return -ENOTSUP;
9873         }
9874
9875         /* not supported with CPU crypto */
9876         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9877                 return -ENOTSUP;
9878
9879         /* Verify the capabilities */
9880         struct rte_cryptodev_sym_capability_idx cap_idx;
9881         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9882         cap_idx.algo.aead = tdata->algo;
9883         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9884                         &cap_idx) == NULL)
9885                 return -ENOTSUP;
9886
9887         /* alloc mbuf and set payload */
9888         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9889
9890         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9891                         rte_pktmbuf_tailroom(ut_params->ibuf));
9892
9893         /* Create AEAD operation */
9894         retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9895         if (retval < 0)
9896                 return retval;
9897
9898         /* Create AEAD xform */
9899         memcpy(key, tdata->key.data, tdata->key.len);
9900         retval = create_aead_xform(ut_params->op,
9901                         tdata->algo,
9902                         RTE_CRYPTO_AEAD_OP_DECRYPT,
9903                         key, tdata->key.len,
9904                         tdata->aad.len, tdata->auth_tag.len,
9905                         tdata->iv.len);
9906         if (retval < 0)
9907                 return retval;
9908
9909         ut_params->op->sym->m_src = ut_params->ibuf;
9910
9911         TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9912                         RTE_CRYPTO_OP_SESSIONLESS,
9913                         "crypto op session type not sessionless");
9914
9915         /* Process crypto operation */
9916         if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9917                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9918                                 ut_params->op, 0, 0, 0, 0);
9919         else
9920                 TEST_ASSERT_NOT_NULL(process_crypto_request(
9921                         ts_params->valid_devs[0], ut_params->op),
9922                                 "failed to process sym crypto op");
9923
9924         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9925
9926         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9927                         "crypto op status not success");
9928
9929         plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9930                         ut_params->op->sym->cipher.data.offset);
9931
9932         debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9933
9934         /* Validate obuf */
9935         TEST_ASSERT_BUFFERS_ARE_EQUAL(
9936                         plaintext,
9937                         tdata->plaintext.data,
9938                         tdata->plaintext.len,
9939                         "Plaintext data not as expected");
9940
9941         TEST_ASSERT_EQUAL(ut_params->op->status,
9942                         RTE_CRYPTO_OP_STATUS_SUCCESS,
9943                         "Authentication failed");
9944         return 0;
9945 }
9946
9947 static int
9948 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
9949 {
9950         return test_authenticated_decryption_sessionless(
9951                         &gcm_test_case_5);
9952 }
9953
9954 static int
9955 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
9956 {
9957         return test_authenticated_encryption(&ccm_test_case_128_1);
9958 }
9959
9960 static int
9961 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
9962 {
9963         return test_authenticated_encryption(&ccm_test_case_128_2);
9964 }
9965
9966 static int
9967 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
9968 {
9969         return test_authenticated_encryption(&ccm_test_case_128_3);
9970 }
9971
9972 static int
9973 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
9974 {
9975         return test_authenticated_decryption(&ccm_test_case_128_1);
9976 }
9977
9978 static int
9979 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
9980 {
9981         return test_authenticated_decryption(&ccm_test_case_128_2);
9982 }
9983
9984 static int
9985 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
9986 {
9987         return test_authenticated_decryption(&ccm_test_case_128_3);
9988 }
9989
9990 static int
9991 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
9992 {
9993         return test_authenticated_encryption(&ccm_test_case_192_1);
9994 }
9995
9996 static int
9997 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
9998 {
9999         return test_authenticated_encryption(&ccm_test_case_192_2);
10000 }
10001
10002 static int
10003 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10004 {
10005         return test_authenticated_encryption(&ccm_test_case_192_3);
10006 }
10007
10008 static int
10009 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10010 {
10011         return test_authenticated_decryption(&ccm_test_case_192_1);
10012 }
10013
10014 static int
10015 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10016 {
10017         return test_authenticated_decryption(&ccm_test_case_192_2);
10018 }
10019
10020 static int
10021 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10022 {
10023         return test_authenticated_decryption(&ccm_test_case_192_3);
10024 }
10025
10026 static int
10027 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
10028 {
10029         return test_authenticated_encryption(&ccm_test_case_256_1);
10030 }
10031
10032 static int
10033 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
10034 {
10035         return test_authenticated_encryption(&ccm_test_case_256_2);
10036 }
10037
10038 static int
10039 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
10040 {
10041         return test_authenticated_encryption(&ccm_test_case_256_3);
10042 }
10043
10044 static int
10045 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
10046 {
10047         return test_authenticated_decryption(&ccm_test_case_256_1);
10048 }
10049
10050 static int
10051 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
10052 {
10053         return test_authenticated_decryption(&ccm_test_case_256_2);
10054 }
10055
10056 static int
10057 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
10058 {
10059         return test_authenticated_decryption(&ccm_test_case_256_3);
10060 }
10061
10062 static int
10063 test_stats(void)
10064 {
10065         struct crypto_testsuite_params *ts_params = &testsuite_params;
10066         struct rte_cryptodev_stats stats;
10067
10068         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10069                 return -ENOTSUP;
10070
10071         /* Verify the capabilities */
10072         struct rte_cryptodev_sym_capability_idx cap_idx;
10073         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10074         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
10075         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10076                         &cap_idx) == NULL)
10077                 return -ENOTSUP;
10078         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10079         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10080         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10081                         &cap_idx) == NULL)
10082                 return -ENOTSUP;
10083
10084         if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
10085                         == -ENOTSUP)
10086                 return -ENOTSUP;
10087
10088         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10089         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
10090                         &stats) == -ENODEV),
10091                 "rte_cryptodev_stats_get invalid dev failed");
10092         TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
10093                 "rte_cryptodev_stats_get invalid Param failed");
10094
10095         /* Test expected values */
10096         test_AES_CBC_HMAC_SHA1_encrypt_digest();
10097         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10098                         &stats),
10099                 "rte_cryptodev_stats_get failed");
10100         TEST_ASSERT((stats.enqueued_count == 1),
10101                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10102         TEST_ASSERT((stats.dequeued_count == 1),
10103                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10104         TEST_ASSERT((stats.enqueue_err_count == 0),
10105                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10106         TEST_ASSERT((stats.dequeue_err_count == 0),
10107                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10108
10109         /* invalid device but should ignore and not reset device stats*/
10110         rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
10111         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10112                         &stats),
10113                 "rte_cryptodev_stats_get failed");
10114         TEST_ASSERT((stats.enqueued_count == 1),
10115                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10116
10117         /* check that a valid reset clears stats */
10118         rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10119         TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10120                         &stats),
10121                                           "rte_cryptodev_stats_get failed");
10122         TEST_ASSERT((stats.enqueued_count == 0),
10123                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10124         TEST_ASSERT((stats.dequeued_count == 0),
10125                 "rte_cryptodev_stats_get returned unexpected enqueued stat");
10126
10127         return TEST_SUCCESS;
10128 }
10129
10130 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
10131                                    struct crypto_unittest_params *ut_params,
10132                                    enum rte_crypto_auth_operation op,
10133                                    const struct HMAC_MD5_vector *test_case)
10134 {
10135         uint8_t key[64];
10136
10137         memcpy(key, test_case->key.data, test_case->key.len);
10138
10139         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10140         ut_params->auth_xform.next = NULL;
10141         ut_params->auth_xform.auth.op = op;
10142
10143         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
10144
10145         ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
10146         ut_params->auth_xform.auth.key.length = test_case->key.len;
10147         ut_params->auth_xform.auth.key.data = key;
10148
10149         ut_params->sess = rte_cryptodev_sym_session_create(
10150                         ts_params->session_mpool);
10151
10152         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10153                         ut_params->sess, &ut_params->auth_xform,
10154                         ts_params->session_priv_mpool);
10155
10156         if (ut_params->sess == NULL)
10157                 return TEST_FAILED;
10158
10159         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10160
10161         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10162                         rte_pktmbuf_tailroom(ut_params->ibuf));
10163
10164         return 0;
10165 }
10166
10167 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
10168                               const struct HMAC_MD5_vector *test_case,
10169                               uint8_t **plaintext)
10170 {
10171         uint16_t plaintext_pad_len;
10172
10173         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10174
10175         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10176                                 16);
10177
10178         *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10179                         plaintext_pad_len);
10180         memcpy(*plaintext, test_case->plaintext.data,
10181                         test_case->plaintext.len);
10182
10183         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10184                         ut_params->ibuf, MD5_DIGEST_LEN);
10185         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10186                         "no room to append digest");
10187         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10188                         ut_params->ibuf, plaintext_pad_len);
10189
10190         if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10191                 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
10192                            test_case->auth_tag.len);
10193         }
10194
10195         sym_op->auth.data.offset = 0;
10196         sym_op->auth.data.length = test_case->plaintext.len;
10197
10198         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10199         ut_params->op->sym->m_src = ut_params->ibuf;
10200
10201         return 0;
10202 }
10203
10204 static int
10205 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
10206 {
10207         uint16_t plaintext_pad_len;
10208         uint8_t *plaintext, *auth_tag;
10209
10210         struct crypto_testsuite_params *ts_params = &testsuite_params;
10211         struct crypto_unittest_params *ut_params = &unittest_params;
10212         struct rte_cryptodev_info dev_info;
10213
10214         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10215         uint64_t feat_flags = dev_info.feature_flags;
10216
10217         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10218                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10219                 printf("Device doesn't support RAW data-path APIs.\n");
10220                 return -ENOTSUP;
10221         }
10222
10223         /* Verify the capabilities */
10224         struct rte_cryptodev_sym_capability_idx cap_idx;
10225         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10226         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10227         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10228                         &cap_idx) == NULL)
10229                 return -ENOTSUP;
10230
10231         if (MD5_HMAC_create_session(ts_params, ut_params,
10232                         RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
10233                 return TEST_FAILED;
10234
10235         /* Generate Crypto op data structure */
10236         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10237                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10238         TEST_ASSERT_NOT_NULL(ut_params->op,
10239                         "Failed to allocate symmetric crypto operation struct");
10240
10241         plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10242                                 16);
10243
10244         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10245                 return TEST_FAILED;
10246
10247         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10248                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10249                         ut_params->op);
10250         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10251                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10252                                 ut_params->op, 0, 1, 0, 0);
10253         else
10254                 TEST_ASSERT_NOT_NULL(
10255                         process_crypto_request(ts_params->valid_devs[0],
10256                                 ut_params->op),
10257                                 "failed to process sym crypto op");
10258
10259         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10260                         "crypto op processing failed");
10261
10262         if (ut_params->op->sym->m_dst) {
10263                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
10264                                 uint8_t *, plaintext_pad_len);
10265         } else {
10266                 auth_tag = plaintext + plaintext_pad_len;
10267         }
10268
10269         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10270                         auth_tag,
10271                         test_case->auth_tag.data,
10272                         test_case->auth_tag.len,
10273                         "HMAC_MD5 generated tag not as expected");
10274
10275         return TEST_SUCCESS;
10276 }
10277
10278 static int
10279 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
10280 {
10281         uint8_t *plaintext;
10282
10283         struct crypto_testsuite_params *ts_params = &testsuite_params;
10284         struct crypto_unittest_params *ut_params = &unittest_params;
10285         struct rte_cryptodev_info dev_info;
10286
10287         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10288         uint64_t feat_flags = dev_info.feature_flags;
10289
10290         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10291                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10292                 printf("Device doesn't support RAW data-path APIs.\n");
10293                 return -ENOTSUP;
10294         }
10295
10296         /* Verify the capabilities */
10297         struct rte_cryptodev_sym_capability_idx cap_idx;
10298         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10299         cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10300         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10301                         &cap_idx) == NULL)
10302                 return -ENOTSUP;
10303
10304         if (MD5_HMAC_create_session(ts_params, ut_params,
10305                         RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
10306                 return TEST_FAILED;
10307         }
10308
10309         /* Generate Crypto op data structure */
10310         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10311                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10312         TEST_ASSERT_NOT_NULL(ut_params->op,
10313                         "Failed to allocate symmetric crypto operation struct");
10314
10315         if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10316                 return TEST_FAILED;
10317
10318         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10319                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10320                         ut_params->op);
10321         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10322                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10323                                 ut_params->op, 0, 1, 0, 0);
10324         else
10325                 TEST_ASSERT_NOT_NULL(
10326                         process_crypto_request(ts_params->valid_devs[0],
10327                                 ut_params->op),
10328                                 "failed to process sym crypto op");
10329
10330         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10331                         "HMAC_MD5 crypto op processing failed");
10332
10333         return TEST_SUCCESS;
10334 }
10335
10336 static int
10337 test_MD5_HMAC_generate_case_1(void)
10338 {
10339         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
10340 }
10341
10342 static int
10343 test_MD5_HMAC_verify_case_1(void)
10344 {
10345         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
10346 }
10347
10348 static int
10349 test_MD5_HMAC_generate_case_2(void)
10350 {
10351         return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
10352 }
10353
10354 static int
10355 test_MD5_HMAC_verify_case_2(void)
10356 {
10357         return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
10358 }
10359
10360 static int
10361 test_multi_session(void)
10362 {
10363         struct crypto_testsuite_params *ts_params = &testsuite_params;
10364         struct crypto_unittest_params *ut_params = &unittest_params;
10365
10366         struct rte_cryptodev_info dev_info;
10367         struct rte_cryptodev_sym_session **sessions;
10368
10369         uint16_t i;
10370
10371         /* Verify the capabilities */
10372         struct rte_cryptodev_sym_capability_idx cap_idx;
10373         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10374         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10375         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10376                         &cap_idx) == NULL)
10377                 return -ENOTSUP;
10378         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10379         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10380         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10381                         &cap_idx) == NULL)
10382                 return -ENOTSUP;
10383
10384         test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
10385                         aes_cbc_key, hmac_sha512_key);
10386
10387
10388         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10389
10390         sessions = rte_malloc(NULL,
10391                         (sizeof(struct rte_cryptodev_sym_session *) *
10392                         MAX_NB_SESSIONS) + 1, 0);
10393
10394         /* Create multiple crypto sessions*/
10395         for (i = 0; i < MAX_NB_SESSIONS; i++) {
10396
10397                 sessions[i] = rte_cryptodev_sym_session_create(
10398                                 ts_params->session_mpool);
10399
10400                 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10401                                 sessions[i], &ut_params->auth_xform,
10402                                 ts_params->session_priv_mpool);
10403                 TEST_ASSERT_NOT_NULL(sessions[i],
10404                                 "Session creation failed at session number %u",
10405                                 i);
10406
10407                 /* Attempt to send a request on each session */
10408                 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
10409                         sessions[i],
10410                         ut_params,
10411                         ts_params,
10412                         catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
10413                         catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
10414                         aes_cbc_iv),
10415                         "Failed to perform decrypt on request number %u.", i);
10416                 /* free crypto operation structure */
10417                 if (ut_params->op)
10418                         rte_crypto_op_free(ut_params->op);
10419
10420                 /*
10421                  * free mbuf - both obuf and ibuf are usually the same,
10422                  * so check if they point at the same address is necessary,
10423                  * to avoid freeing the mbuf twice.
10424                  */
10425                 if (ut_params->obuf) {
10426                         rte_pktmbuf_free(ut_params->obuf);
10427                         if (ut_params->ibuf == ut_params->obuf)
10428                                 ut_params->ibuf = 0;
10429                         ut_params->obuf = 0;
10430                 }
10431                 if (ut_params->ibuf) {
10432                         rte_pktmbuf_free(ut_params->ibuf);
10433                         ut_params->ibuf = 0;
10434                 }
10435         }
10436
10437         /* Next session create should fail */
10438         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10439                         sessions[i], &ut_params->auth_xform,
10440                         ts_params->session_priv_mpool);
10441         TEST_ASSERT_NULL(sessions[i],
10442                         "Session creation succeeded unexpectedly!");
10443
10444         for (i = 0; i < MAX_NB_SESSIONS; i++) {
10445                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10446                                 sessions[i]);
10447                 rte_cryptodev_sym_session_free(sessions[i]);
10448         }
10449
10450         rte_free(sessions);
10451
10452         return TEST_SUCCESS;
10453 }
10454
10455 struct multi_session_params {
10456         struct crypto_unittest_params ut_params;
10457         uint8_t *cipher_key;
10458         uint8_t *hmac_key;
10459         const uint8_t *cipher;
10460         const uint8_t *digest;
10461         uint8_t *iv;
10462 };
10463
10464 #define MB_SESSION_NUMBER 3
10465
10466 static int
10467 test_multi_session_random_usage(void)
10468 {
10469         struct crypto_testsuite_params *ts_params = &testsuite_params;
10470         struct rte_cryptodev_info dev_info;
10471         struct rte_cryptodev_sym_session **sessions;
10472         uint32_t i, j;
10473         struct multi_session_params ut_paramz[] = {
10474
10475                 {
10476                         .cipher_key = ms_aes_cbc_key0,
10477                         .hmac_key = ms_hmac_key0,
10478                         .cipher = ms_aes_cbc_cipher0,
10479                         .digest = ms_hmac_digest0,
10480                         .iv = ms_aes_cbc_iv0
10481                 },
10482                 {
10483                         .cipher_key = ms_aes_cbc_key1,
10484                         .hmac_key = ms_hmac_key1,
10485                         .cipher = ms_aes_cbc_cipher1,
10486                         .digest = ms_hmac_digest1,
10487                         .iv = ms_aes_cbc_iv1
10488                 },
10489                 {
10490                         .cipher_key = ms_aes_cbc_key2,
10491                         .hmac_key = ms_hmac_key2,
10492                         .cipher = ms_aes_cbc_cipher2,
10493                         .digest = ms_hmac_digest2,
10494                         .iv = ms_aes_cbc_iv2
10495                 },
10496
10497         };
10498
10499         /* Verify the capabilities */
10500         struct rte_cryptodev_sym_capability_idx cap_idx;
10501         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10502         cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10503         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10504                         &cap_idx) == NULL)
10505                 return -ENOTSUP;
10506         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10507         cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10508         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10509                         &cap_idx) == NULL)
10510                 return -ENOTSUP;
10511
10512         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10513
10514         sessions = rte_malloc(NULL,
10515                         (sizeof(struct rte_cryptodev_sym_session *)
10516                                         * MAX_NB_SESSIONS) + 1, 0);
10517
10518         for (i = 0; i < MB_SESSION_NUMBER; i++) {
10519                 sessions[i] = rte_cryptodev_sym_session_create(
10520                                 ts_params->session_mpool);
10521
10522                 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
10523                                 sizeof(struct crypto_unittest_params));
10524
10525                 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
10526                                 &ut_paramz[i].ut_params,
10527                                 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
10528
10529                 /* Create multiple crypto sessions*/
10530                 rte_cryptodev_sym_session_init(
10531                                 ts_params->valid_devs[0],
10532                                 sessions[i],
10533                                 &ut_paramz[i].ut_params.auth_xform,
10534                                 ts_params->session_priv_mpool);
10535
10536                 TEST_ASSERT_NOT_NULL(sessions[i],
10537                                 "Session creation failed at session number %u",
10538                                 i);
10539
10540         }
10541
10542         srand(time(NULL));
10543         for (i = 0; i < 40000; i++) {
10544
10545                 j = rand() % MB_SESSION_NUMBER;
10546
10547                 TEST_ASSERT_SUCCESS(
10548                         test_AES_CBC_HMAC_SHA512_decrypt_perform(
10549                                         sessions[j],
10550                                         &ut_paramz[j].ut_params,
10551                                         ts_params, ut_paramz[j].cipher,
10552                                         ut_paramz[j].digest,
10553                                         ut_paramz[j].iv),
10554                         "Failed to perform decrypt on request number %u.", i);
10555
10556                 if (ut_paramz[j].ut_params.op)
10557                         rte_crypto_op_free(ut_paramz[j].ut_params.op);
10558
10559                 /*
10560                  * free mbuf - both obuf and ibuf are usually the same,
10561                  * so check if they point at the same address is necessary,
10562                  * to avoid freeing the mbuf twice.
10563                  */
10564                 if (ut_paramz[j].ut_params.obuf) {
10565                         rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
10566                         if (ut_paramz[j].ut_params.ibuf
10567                                         == ut_paramz[j].ut_params.obuf)
10568                                 ut_paramz[j].ut_params.ibuf = 0;
10569                         ut_paramz[j].ut_params.obuf = 0;
10570                 }
10571                 if (ut_paramz[j].ut_params.ibuf) {
10572                         rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
10573                         ut_paramz[j].ut_params.ibuf = 0;
10574                 }
10575         }
10576
10577         for (i = 0; i < MB_SESSION_NUMBER; i++) {
10578                 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10579                                 sessions[i]);
10580                 rte_cryptodev_sym_session_free(sessions[i]);
10581         }
10582
10583         rte_free(sessions);
10584
10585         return TEST_SUCCESS;
10586 }
10587
10588 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
10589                         0xab, 0xab, 0xab, 0xab,
10590                         0xab, 0xab, 0xab, 0xab,
10591                         0xab, 0xab, 0xab, 0xab};
10592
10593 static int
10594 test_null_invalid_operation(void)
10595 {
10596         struct crypto_testsuite_params *ts_params = &testsuite_params;
10597         struct crypto_unittest_params *ut_params = &unittest_params;
10598         int ret;
10599
10600         /* This test is for NULL PMD only */
10601         if (gbl_driver_id != rte_cryptodev_driver_id_get(
10602                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10603                 return -ENOTSUP;
10604
10605         /* Setup Cipher Parameters */
10606         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10607         ut_params->cipher_xform.next = NULL;
10608
10609         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
10610         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10611
10612         ut_params->sess = rte_cryptodev_sym_session_create(
10613                         ts_params->session_mpool);
10614
10615         /* Create Crypto session*/
10616         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10617                         ut_params->sess, &ut_params->cipher_xform,
10618                         ts_params->session_priv_mpool);
10619         TEST_ASSERT(ret < 0,
10620                         "Session creation succeeded unexpectedly");
10621
10622
10623         /* Setup HMAC Parameters */
10624         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10625         ut_params->auth_xform.next = NULL;
10626
10627         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
10628         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10629
10630         ut_params->sess = rte_cryptodev_sym_session_create(
10631                         ts_params->session_mpool);
10632
10633         /* Create Crypto session*/
10634         ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10635                         ut_params->sess, &ut_params->auth_xform,
10636                         ts_params->session_priv_mpool);
10637         TEST_ASSERT(ret < 0,
10638                         "Session creation succeeded unexpectedly");
10639
10640         return TEST_SUCCESS;
10641 }
10642
10643
10644 #define NULL_BURST_LENGTH (32)
10645
10646 static int
10647 test_null_burst_operation(void)
10648 {
10649         struct crypto_testsuite_params *ts_params = &testsuite_params;
10650         struct crypto_unittest_params *ut_params = &unittest_params;
10651
10652         unsigned i, burst_len = NULL_BURST_LENGTH;
10653
10654         struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
10655         struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
10656
10657         /* This test is for NULL PMD only */
10658         if (gbl_driver_id != rte_cryptodev_driver_id_get(
10659                         RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10660                 return -ENOTSUP;
10661
10662         /* Setup Cipher Parameters */
10663         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10664         ut_params->cipher_xform.next = &ut_params->auth_xform;
10665
10666         ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
10667         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10668
10669         /* Setup HMAC Parameters */
10670         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10671         ut_params->auth_xform.next = NULL;
10672
10673         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
10674         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10675
10676         ut_params->sess = rte_cryptodev_sym_session_create(
10677                         ts_params->session_mpool);
10678
10679         /* Create Crypto session*/
10680         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10681                         ut_params->sess, &ut_params->cipher_xform,
10682                         ts_params->session_priv_mpool);
10683         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10684
10685         TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
10686                         RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
10687                         burst_len, "failed to generate burst of crypto ops");
10688
10689         /* Generate an operation for each mbuf in burst */
10690         for (i = 0; i < burst_len; i++) {
10691                 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10692
10693                 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
10694
10695                 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
10696                                 sizeof(unsigned));
10697                 *data = i;
10698
10699                 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
10700
10701                 burst[i]->sym->m_src = m;
10702         }
10703
10704         /* Process crypto operation */
10705         TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
10706                         0, burst, burst_len),
10707                         burst_len,
10708                         "Error enqueuing burst");
10709
10710         TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
10711                         0, burst_dequeued, burst_len),
10712                         burst_len,
10713                         "Error dequeuing burst");
10714
10715
10716         for (i = 0; i < burst_len; i++) {
10717                 TEST_ASSERT_EQUAL(
10718                         *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
10719                         *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
10720                                         uint32_t *),
10721                         "data not as expected");
10722
10723                 rte_pktmbuf_free(burst[i]->sym->m_src);
10724                 rte_crypto_op_free(burst[i]);
10725         }
10726
10727         return TEST_SUCCESS;
10728 }
10729
10730 static uint16_t
10731 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
10732                   uint16_t nb_ops, void *user_param)
10733 {
10734         RTE_SET_USED(dev_id);
10735         RTE_SET_USED(qp_id);
10736         RTE_SET_USED(ops);
10737         RTE_SET_USED(user_param);
10738
10739         printf("crypto enqueue callback called\n");
10740         return nb_ops;
10741 }
10742
10743 static uint16_t
10744 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
10745                   uint16_t nb_ops, void *user_param)
10746 {
10747         RTE_SET_USED(dev_id);
10748         RTE_SET_USED(qp_id);
10749         RTE_SET_USED(ops);
10750         RTE_SET_USED(user_param);
10751
10752         printf("crypto dequeue callback called\n");
10753         return nb_ops;
10754 }
10755
10756 /*
10757  * Thread using enqueue/dequeue callback with RCU.
10758  */
10759 static int
10760 test_enqdeq_callback_thread(void *arg)
10761 {
10762         RTE_SET_USED(arg);
10763         /* DP thread calls rte_cryptodev_enqueue_burst()/
10764          * rte_cryptodev_dequeue_burst() and invokes callback.
10765          */
10766         test_null_burst_operation();
10767         return 0;
10768 }
10769
10770 static int
10771 test_enq_callback_setup(void)
10772 {
10773         struct crypto_testsuite_params *ts_params = &testsuite_params;
10774         struct rte_cryptodev_info dev_info;
10775         struct rte_cryptodev_qp_conf qp_conf = {
10776                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
10777         };
10778
10779         struct rte_cryptodev_cb *cb;
10780         uint16_t qp_id = 0;
10781
10782         /* Stop the device in case it's started so it can be configured */
10783         rte_cryptodev_stop(ts_params->valid_devs[0]);
10784
10785         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10786
10787         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
10788                         &ts_params->conf),
10789                         "Failed to configure cryptodev %u",
10790                         ts_params->valid_devs[0]);
10791
10792         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
10793         qp_conf.mp_session = ts_params->session_mpool;
10794         qp_conf.mp_session_private = ts_params->session_priv_mpool;
10795
10796         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
10797                         ts_params->valid_devs[0], qp_id, &qp_conf,
10798                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
10799                         "Failed test for "
10800                         "rte_cryptodev_queue_pair_setup: num_inflights "
10801                         "%u on qp %u on cryptodev %u",
10802                         qp_conf.nb_descriptors, qp_id,
10803                         ts_params->valid_devs[0]);
10804
10805         /* Test with invalid crypto device */
10806         cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
10807                         qp_id, test_enq_callback, NULL);
10808         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10809                         "cryptodev %u did not fail",
10810                         qp_id, RTE_CRYPTO_MAX_DEVS);
10811
10812         /* Test with invalid queue pair */
10813         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10814                         dev_info.max_nb_queue_pairs + 1,
10815                         test_enq_callback, NULL);
10816         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10817                         "cryptodev %u did not fail",
10818                         dev_info.max_nb_queue_pairs + 1,
10819                         ts_params->valid_devs[0]);
10820
10821         /* Test with NULL callback */
10822         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10823                         qp_id, NULL, NULL);
10824         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10825                         "cryptodev %u did not fail",
10826                         qp_id, ts_params->valid_devs[0]);
10827
10828         /* Test with valid configuration */
10829         cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10830                         qp_id, test_enq_callback, NULL);
10831         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
10832                         "qp %u on cryptodev %u",
10833                         qp_id, ts_params->valid_devs[0]);
10834
10835         rte_cryptodev_start(ts_params->valid_devs[0]);
10836
10837         /* Launch a thread */
10838         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
10839                                 rte_get_next_lcore(-1, 1, 0));
10840
10841         /* Wait until reader exited. */
10842         rte_eal_mp_wait_lcore();
10843
10844         /* Test with invalid crypto device */
10845         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10846                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
10847                         "Expected call to fail as crypto device is invalid");
10848
10849         /* Test with invalid queue pair */
10850         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10851                         ts_params->valid_devs[0],
10852                         dev_info.max_nb_queue_pairs + 1, cb),
10853                         "Expected call to fail as queue pair is invalid");
10854
10855         /* Test with NULL callback */
10856         TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10857                         ts_params->valid_devs[0], qp_id, NULL),
10858                         "Expected call to fail as callback is NULL");
10859
10860         /* Test with valid configuration */
10861         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
10862                         ts_params->valid_devs[0], qp_id, cb),
10863                         "Failed test to remove callback on "
10864                         "qp %u on cryptodev %u",
10865                         qp_id, ts_params->valid_devs[0]);
10866
10867         return TEST_SUCCESS;
10868 }
10869
10870 static int
10871 test_deq_callback_setup(void)
10872 {
10873         struct crypto_testsuite_params *ts_params = &testsuite_params;
10874         struct rte_cryptodev_info dev_info;
10875         struct rte_cryptodev_qp_conf qp_conf = {
10876                 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
10877         };
10878
10879         struct rte_cryptodev_cb *cb;
10880         uint16_t qp_id = 0;
10881
10882         /* Stop the device in case it's started so it can be configured */
10883         rte_cryptodev_stop(ts_params->valid_devs[0]);
10884
10885         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10886
10887         TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
10888                         &ts_params->conf),
10889                         "Failed to configure cryptodev %u",
10890                         ts_params->valid_devs[0]);
10891
10892         qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
10893         qp_conf.mp_session = ts_params->session_mpool;
10894         qp_conf.mp_session_private = ts_params->session_priv_mpool;
10895
10896         TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
10897                         ts_params->valid_devs[0], qp_id, &qp_conf,
10898                         rte_cryptodev_socket_id(ts_params->valid_devs[0])),
10899                         "Failed test for "
10900                         "rte_cryptodev_queue_pair_setup: num_inflights "
10901                         "%u on qp %u on cryptodev %u",
10902                         qp_conf.nb_descriptors, qp_id,
10903                         ts_params->valid_devs[0]);
10904
10905         /* Test with invalid crypto device */
10906         cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
10907                         qp_id, test_deq_callback, NULL);
10908         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10909                         "cryptodev %u did not fail",
10910                         qp_id, RTE_CRYPTO_MAX_DEVS);
10911
10912         /* Test with invalid queue pair */
10913         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10914                         dev_info.max_nb_queue_pairs + 1,
10915                         test_deq_callback, NULL);
10916         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10917                         "cryptodev %u did not fail",
10918                         dev_info.max_nb_queue_pairs + 1,
10919                         ts_params->valid_devs[0]);
10920
10921         /* Test with NULL callback */
10922         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10923                         qp_id, NULL, NULL);
10924         TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10925                         "cryptodev %u did not fail",
10926                         qp_id, ts_params->valid_devs[0]);
10927
10928         /* Test with valid configuration */
10929         cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10930                         qp_id, test_deq_callback, NULL);
10931         TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
10932                         "qp %u on cryptodev %u",
10933                         qp_id, ts_params->valid_devs[0]);
10934
10935         rte_cryptodev_start(ts_params->valid_devs[0]);
10936
10937         /* Launch a thread */
10938         rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
10939                                 rte_get_next_lcore(-1, 1, 0));
10940
10941         /* Wait until reader exited. */
10942         rte_eal_mp_wait_lcore();
10943
10944         /* Test with invalid crypto device */
10945         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10946                         RTE_CRYPTO_MAX_DEVS, qp_id, cb),
10947                         "Expected call to fail as crypto device is invalid");
10948
10949         /* Test with invalid queue pair */
10950         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10951                         ts_params->valid_devs[0],
10952                         dev_info.max_nb_queue_pairs + 1, cb),
10953                         "Expected call to fail as queue pair is invalid");
10954
10955         /* Test with NULL callback */
10956         TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10957                         ts_params->valid_devs[0], qp_id, NULL),
10958                         "Expected call to fail as callback is NULL");
10959
10960         /* Test with valid configuration */
10961         TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
10962                         ts_params->valid_devs[0], qp_id, cb),
10963                         "Failed test to remove callback on "
10964                         "qp %u on cryptodev %u",
10965                         qp_id, ts_params->valid_devs[0]);
10966
10967         return TEST_SUCCESS;
10968 }
10969
10970 static void
10971 generate_gmac_large_plaintext(uint8_t *data)
10972 {
10973         uint16_t i;
10974
10975         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
10976                 memcpy(&data[i], &data[0], 32);
10977 }
10978
10979 static int
10980 create_gmac_operation(enum rte_crypto_auth_operation op,
10981                 const struct gmac_test_data *tdata)
10982 {
10983         struct crypto_testsuite_params *ts_params = &testsuite_params;
10984         struct crypto_unittest_params *ut_params = &unittest_params;
10985         struct rte_crypto_sym_op *sym_op;
10986
10987         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10988
10989         /* Generate Crypto op data structure */
10990         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10991                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10992         TEST_ASSERT_NOT_NULL(ut_params->op,
10993                         "Failed to allocate symmetric crypto operation struct");
10994
10995         sym_op = ut_params->op->sym;
10996
10997         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10998                         ut_params->ibuf, tdata->gmac_tag.len);
10999         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11000                         "no room to append digest");
11001
11002         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11003                         ut_params->ibuf, plaintext_pad_len);
11004
11005         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11006                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11007                                 tdata->gmac_tag.len);
11008                 debug_hexdump(stdout, "digest:",
11009                                 sym_op->auth.digest.data,
11010                                 tdata->gmac_tag.len);
11011         }
11012
11013         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11014                         uint8_t *, IV_OFFSET);
11015
11016         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11017
11018         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11019
11020         sym_op->cipher.data.length = 0;
11021         sym_op->cipher.data.offset = 0;
11022
11023         sym_op->auth.data.offset = 0;
11024         sym_op->auth.data.length = tdata->plaintext.len;
11025
11026         return 0;
11027 }
11028
11029 static int
11030 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
11031                 const struct gmac_test_data *tdata,
11032                 void *digest_mem, uint64_t digest_phys)
11033 {
11034         struct crypto_testsuite_params *ts_params = &testsuite_params;
11035         struct crypto_unittest_params *ut_params = &unittest_params;
11036         struct rte_crypto_sym_op *sym_op;
11037
11038         /* Generate Crypto op data structure */
11039         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11040                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11041         TEST_ASSERT_NOT_NULL(ut_params->op,
11042                         "Failed to allocate symmetric crypto operation struct");
11043
11044         sym_op = ut_params->op->sym;
11045
11046         sym_op->auth.digest.data = digest_mem;
11047         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11048                         "no room to append digest");
11049
11050         sym_op->auth.digest.phys_addr = digest_phys;
11051
11052         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11053                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11054                                 tdata->gmac_tag.len);
11055                 debug_hexdump(stdout, "digest:",
11056                                 sym_op->auth.digest.data,
11057                                 tdata->gmac_tag.len);
11058         }
11059
11060         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11061                         uint8_t *, IV_OFFSET);
11062
11063         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11064
11065         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11066
11067         sym_op->cipher.data.length = 0;
11068         sym_op->cipher.data.offset = 0;
11069
11070         sym_op->auth.data.offset = 0;
11071         sym_op->auth.data.length = tdata->plaintext.len;
11072
11073         return 0;
11074 }
11075
11076 static int create_gmac_session(uint8_t dev_id,
11077                 const struct gmac_test_data *tdata,
11078                 enum rte_crypto_auth_operation auth_op)
11079 {
11080         uint8_t auth_key[tdata->key.len];
11081
11082         struct crypto_testsuite_params *ts_params = &testsuite_params;
11083         struct crypto_unittest_params *ut_params = &unittest_params;
11084
11085         memcpy(auth_key, tdata->key.data, tdata->key.len);
11086
11087         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11088         ut_params->auth_xform.next = NULL;
11089
11090         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
11091         ut_params->auth_xform.auth.op = auth_op;
11092         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
11093         ut_params->auth_xform.auth.key.length = tdata->key.len;
11094         ut_params->auth_xform.auth.key.data = auth_key;
11095         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11096         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
11097
11098
11099         ut_params->sess = rte_cryptodev_sym_session_create(
11100                         ts_params->session_mpool);
11101
11102         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11103                         &ut_params->auth_xform,
11104                         ts_params->session_priv_mpool);
11105
11106         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11107
11108         return 0;
11109 }
11110
11111 static int
11112 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
11113 {
11114         struct crypto_testsuite_params *ts_params = &testsuite_params;
11115         struct crypto_unittest_params *ut_params = &unittest_params;
11116         struct rte_cryptodev_info dev_info;
11117
11118         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11119         uint64_t feat_flags = dev_info.feature_flags;
11120
11121         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11122                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11123                 printf("Device doesn't support RAW data-path APIs.\n");
11124                 return -ENOTSUP;
11125         }
11126
11127         int retval;
11128
11129         uint8_t *auth_tag, *plaintext;
11130         uint16_t plaintext_pad_len;
11131
11132         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11133                               "No GMAC length in the source data");
11134
11135         /* Verify the capabilities */
11136         struct rte_cryptodev_sym_capability_idx cap_idx;
11137         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11138         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11139         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11140                         &cap_idx) == NULL)
11141                 return -ENOTSUP;
11142
11143         retval = create_gmac_session(ts_params->valid_devs[0],
11144                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11145
11146         if (retval < 0)
11147                 return retval;
11148
11149         if (tdata->plaintext.len > MBUF_SIZE)
11150                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11151         else
11152                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11153         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11154                         "Failed to allocate input buffer in mempool");
11155
11156         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11157                         rte_pktmbuf_tailroom(ut_params->ibuf));
11158
11159         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11160         /*
11161          * Runtime generate the large plain text instead of use hard code
11162          * plain text vector. It is done to avoid create huge source file
11163          * with the test vector.
11164          */
11165         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11166                 generate_gmac_large_plaintext(tdata->plaintext.data);
11167
11168         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11169                                 plaintext_pad_len);
11170         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11171
11172         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11173         debug_hexdump(stdout, "plaintext:", plaintext,
11174                         tdata->plaintext.len);
11175
11176         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
11177                         tdata);
11178
11179         if (retval < 0)
11180                 return retval;
11181
11182         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11183
11184         ut_params->op->sym->m_src = ut_params->ibuf;
11185
11186         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11187                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11188                         ut_params->op);
11189         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11190                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11191                                 ut_params->op, 0, 1, 0, 0);
11192         else
11193                 TEST_ASSERT_NOT_NULL(
11194                         process_crypto_request(ts_params->valid_devs[0],
11195                         ut_params->op), "failed to process sym crypto op");
11196
11197         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11198                         "crypto op processing failed");
11199
11200         if (ut_params->op->sym->m_dst) {
11201                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11202                                 uint8_t *, plaintext_pad_len);
11203         } else {
11204                 auth_tag = plaintext + plaintext_pad_len;
11205         }
11206
11207         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11208
11209         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11210                         auth_tag,
11211                         tdata->gmac_tag.data,
11212                         tdata->gmac_tag.len,
11213                         "GMAC Generated auth tag not as expected");
11214
11215         return 0;
11216 }
11217
11218 static int
11219 test_AES_GMAC_authentication_test_case_1(void)
11220 {
11221         return test_AES_GMAC_authentication(&gmac_test_case_1);
11222 }
11223
11224 static int
11225 test_AES_GMAC_authentication_test_case_2(void)
11226 {
11227         return test_AES_GMAC_authentication(&gmac_test_case_2);
11228 }
11229
11230 static int
11231 test_AES_GMAC_authentication_test_case_3(void)
11232 {
11233         return test_AES_GMAC_authentication(&gmac_test_case_3);
11234 }
11235
11236 static int
11237 test_AES_GMAC_authentication_test_case_4(void)
11238 {
11239         return test_AES_GMAC_authentication(&gmac_test_case_4);
11240 }
11241
11242 static int
11243 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
11244 {
11245         struct crypto_testsuite_params *ts_params = &testsuite_params;
11246         struct crypto_unittest_params *ut_params = &unittest_params;
11247         int retval;
11248         uint32_t plaintext_pad_len;
11249         uint8_t *plaintext;
11250         struct rte_cryptodev_info dev_info;
11251
11252         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11253         uint64_t feat_flags = dev_info.feature_flags;
11254
11255         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11256                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11257                 printf("Device doesn't support RAW data-path APIs.\n");
11258                 return -ENOTSUP;
11259         }
11260
11261         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11262                               "No GMAC length in the source data");
11263
11264         /* Verify the capabilities */
11265         struct rte_cryptodev_sym_capability_idx cap_idx;
11266         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11267         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11268         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11269                         &cap_idx) == NULL)
11270                 return -ENOTSUP;
11271
11272         retval = create_gmac_session(ts_params->valid_devs[0],
11273                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
11274
11275         if (retval < 0)
11276                 return retval;
11277
11278         if (tdata->plaintext.len > MBUF_SIZE)
11279                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11280         else
11281                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11282         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11283                         "Failed to allocate input buffer in mempool");
11284
11285         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11286                         rte_pktmbuf_tailroom(ut_params->ibuf));
11287
11288         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11289
11290         /*
11291          * Runtime generate the large plain text instead of use hard code
11292          * plain text vector. It is done to avoid create huge source file
11293          * with the test vector.
11294          */
11295         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11296                 generate_gmac_large_plaintext(tdata->plaintext.data);
11297
11298         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11299                                 plaintext_pad_len);
11300         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11301
11302         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11303         debug_hexdump(stdout, "plaintext:", plaintext,
11304                         tdata->plaintext.len);
11305
11306         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
11307                         tdata);
11308
11309         if (retval < 0)
11310                 return retval;
11311
11312         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11313
11314         ut_params->op->sym->m_src = ut_params->ibuf;
11315
11316         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11317                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11318                         ut_params->op);
11319         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11320                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11321                                 ut_params->op, 0, 1, 0, 0);
11322         else
11323                 TEST_ASSERT_NOT_NULL(
11324                         process_crypto_request(ts_params->valid_devs[0],
11325                         ut_params->op), "failed to process sym crypto op");
11326
11327         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11328                         "crypto op processing failed");
11329
11330         return 0;
11331
11332 }
11333
11334 static int
11335 test_AES_GMAC_authentication_verify_test_case_1(void)
11336 {
11337         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
11338 }
11339
11340 static int
11341 test_AES_GMAC_authentication_verify_test_case_2(void)
11342 {
11343         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
11344 }
11345
11346 static int
11347 test_AES_GMAC_authentication_verify_test_case_3(void)
11348 {
11349         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
11350 }
11351
11352 static int
11353 test_AES_GMAC_authentication_verify_test_case_4(void)
11354 {
11355         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
11356 }
11357
11358 static int
11359 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
11360                                 uint32_t fragsz)
11361 {
11362         struct crypto_testsuite_params *ts_params = &testsuite_params;
11363         struct crypto_unittest_params *ut_params = &unittest_params;
11364         struct rte_cryptodev_info dev_info;
11365         uint64_t feature_flags;
11366         unsigned int trn_data = 0;
11367         void *digest_mem = NULL;
11368         uint32_t segs = 1;
11369         unsigned int to_trn = 0;
11370         struct rte_mbuf *buf = NULL;
11371         uint8_t *auth_tag, *plaintext;
11372         int retval;
11373
11374         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11375                               "No GMAC length in the source data");
11376
11377         /* Verify the capabilities */
11378         struct rte_cryptodev_sym_capability_idx cap_idx;
11379         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11380         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11381         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11382                         &cap_idx) == NULL)
11383                 return -ENOTSUP;
11384
11385         /* Check for any input SGL support */
11386         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11387         feature_flags = dev_info.feature_flags;
11388
11389         if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
11390                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
11391                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
11392                 return -ENOTSUP;
11393
11394         if (fragsz > tdata->plaintext.len)
11395                 fragsz = tdata->plaintext.len;
11396
11397         uint16_t plaintext_len = fragsz;
11398
11399         retval = create_gmac_session(ts_params->valid_devs[0],
11400                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11401
11402         if (retval < 0)
11403                 return retval;
11404
11405         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11406         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11407                         "Failed to allocate input buffer in mempool");
11408
11409         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11410                         rte_pktmbuf_tailroom(ut_params->ibuf));
11411
11412         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11413                                 plaintext_len);
11414         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11415
11416         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
11417
11418         trn_data += plaintext_len;
11419
11420         buf = ut_params->ibuf;
11421
11422         /*
11423          * Loop until no more fragments
11424          */
11425
11426         while (trn_data < tdata->plaintext.len) {
11427                 ++segs;
11428                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
11429                                 (tdata->plaintext.len - trn_data) : fragsz;
11430
11431                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11432                 buf = buf->next;
11433
11434                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
11435                                 rte_pktmbuf_tailroom(buf));
11436
11437                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
11438                                 to_trn);
11439
11440                 memcpy(plaintext, tdata->plaintext.data + trn_data,
11441                                 to_trn);
11442                 trn_data += to_trn;
11443                 if (trn_data  == tdata->plaintext.len)
11444                         digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
11445                                         tdata->gmac_tag.len);
11446         }
11447         ut_params->ibuf->nb_segs = segs;
11448
11449         /*
11450          * Place digest at the end of the last buffer
11451          */
11452         uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
11453
11454         if (!digest_mem) {
11455                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11456                                 + tdata->gmac_tag.len);
11457                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
11458                                 tdata->plaintext.len);
11459         }
11460
11461         retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
11462                         tdata, digest_mem, digest_phys);
11463
11464         if (retval < 0)
11465                 return retval;
11466
11467         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11468
11469         ut_params->op->sym->m_src = ut_params->ibuf;
11470
11471         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11472                 return -ENOTSUP;
11473
11474         TEST_ASSERT_NOT_NULL(
11475                 process_crypto_request(ts_params->valid_devs[0],
11476                 ut_params->op), "failed to process sym crypto op");
11477
11478         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11479                         "crypto op processing failed");
11480
11481         auth_tag = digest_mem;
11482         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11483         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11484                         auth_tag,
11485                         tdata->gmac_tag.data,
11486                         tdata->gmac_tag.len,
11487                         "GMAC Generated auth tag not as expected");
11488
11489         return 0;
11490 }
11491
11492 /* Segment size not multiple of block size (16B) */
11493 static int
11494 test_AES_GMAC_authentication_SGL_40B(void)
11495 {
11496         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
11497 }
11498
11499 static int
11500 test_AES_GMAC_authentication_SGL_80B(void)
11501 {
11502         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
11503 }
11504
11505 static int
11506 test_AES_GMAC_authentication_SGL_2048B(void)
11507 {
11508         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
11509 }
11510
11511 /* Segment size not multiple of block size (16B) */
11512 static int
11513 test_AES_GMAC_authentication_SGL_2047B(void)
11514 {
11515         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
11516 }
11517
11518 struct test_crypto_vector {
11519         enum rte_crypto_cipher_algorithm crypto_algo;
11520         unsigned int cipher_offset;
11521         unsigned int cipher_len;
11522
11523         struct {
11524                 uint8_t data[64];
11525                 unsigned int len;
11526         } cipher_key;
11527
11528         struct {
11529                 uint8_t data[64];
11530                 unsigned int len;
11531         } iv;
11532
11533         struct {
11534                 const uint8_t *data;
11535                 unsigned int len;
11536         } plaintext;
11537
11538         struct {
11539                 const uint8_t *data;
11540                 unsigned int len;
11541         } ciphertext;
11542
11543         enum rte_crypto_auth_algorithm auth_algo;
11544         unsigned int auth_offset;
11545
11546         struct {
11547                 uint8_t data[128];
11548                 unsigned int len;
11549         } auth_key;
11550
11551         struct {
11552                 const uint8_t *data;
11553                 unsigned int len;
11554         } aad;
11555
11556         struct {
11557                 uint8_t data[128];
11558                 unsigned int len;
11559         } digest;
11560 };
11561
11562 static const struct test_crypto_vector
11563 hmac_sha1_test_crypto_vector = {
11564         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11565         .plaintext = {
11566                 .data = plaintext_hash,
11567                 .len = 512
11568         },
11569         .auth_key = {
11570                 .data = {
11571                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11572                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11573                         0xDE, 0xF4, 0xDE, 0xAD
11574                 },
11575                 .len = 20
11576         },
11577         .digest = {
11578                 .data = {
11579                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
11580                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
11581                         0x3F, 0x91, 0x64, 0x59
11582                 },
11583                 .len = 20
11584         }
11585 };
11586
11587 static const struct test_crypto_vector
11588 aes128_gmac_test_vector = {
11589         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
11590         .plaintext = {
11591                 .data = plaintext_hash,
11592                 .len = 512
11593         },
11594         .iv = {
11595                 .data = {
11596                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11597                         0x08, 0x09, 0x0A, 0x0B
11598                 },
11599                 .len = 12
11600         },
11601         .auth_key = {
11602                 .data = {
11603                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11604                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
11605                 },
11606                 .len = 16
11607         },
11608         .digest = {
11609                 .data = {
11610                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
11611                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
11612                 },
11613                 .len = 16
11614         }
11615 };
11616
11617 static const struct test_crypto_vector
11618 aes128cbc_hmac_sha1_test_vector = {
11619         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11620         .cipher_offset = 0,
11621         .cipher_len = 512,
11622         .cipher_key = {
11623                 .data = {
11624                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11625                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11626                 },
11627                 .len = 16
11628         },
11629         .iv = {
11630                 .data = {
11631                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11632                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11633                 },
11634                 .len = 16
11635         },
11636         .plaintext = {
11637                 .data = plaintext_hash,
11638                 .len = 512
11639         },
11640         .ciphertext = {
11641                 .data = ciphertext512_aes128cbc,
11642                 .len = 512
11643         },
11644         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11645         .auth_offset = 0,
11646         .auth_key = {
11647                 .data = {
11648                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11649                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11650                         0xDE, 0xF4, 0xDE, 0xAD
11651                 },
11652                 .len = 20
11653         },
11654         .digest = {
11655                 .data = {
11656                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
11657                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11658                         0x18, 0x8C, 0x1D, 0x32
11659                 },
11660                 .len = 20
11661         }
11662 };
11663
11664 static const struct test_crypto_vector
11665 aes128cbc_hmac_sha1_aad_test_vector = {
11666         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11667         .cipher_offset = 8,
11668         .cipher_len = 496,
11669         .cipher_key = {
11670                 .data = {
11671                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11672                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11673                 },
11674                 .len = 16
11675         },
11676         .iv = {
11677                 .data = {
11678                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11679                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11680                 },
11681                 .len = 16
11682         },
11683         .plaintext = {
11684                 .data = plaintext_hash,
11685                 .len = 512
11686         },
11687         .ciphertext = {
11688                 .data = ciphertext512_aes128cbc_aad,
11689                 .len = 512
11690         },
11691         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11692         .auth_offset = 0,
11693         .auth_key = {
11694                 .data = {
11695                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11696                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11697                         0xDE, 0xF4, 0xDE, 0xAD
11698                 },
11699                 .len = 20
11700         },
11701         .digest = {
11702                 .data = {
11703                         0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
11704                         0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
11705                         0x62, 0x0F, 0xFB, 0x10
11706                 },
11707                 .len = 20
11708         }
11709 };
11710
11711 static void
11712 data_corruption(uint8_t *data)
11713 {
11714         data[0] += 1;
11715 }
11716
11717 static void
11718 tag_corruption(uint8_t *data, unsigned int tag_offset)
11719 {
11720         data[tag_offset] += 1;
11721 }
11722
11723 static int
11724 create_auth_session(struct crypto_unittest_params *ut_params,
11725                 uint8_t dev_id,
11726                 const struct test_crypto_vector *reference,
11727                 enum rte_crypto_auth_operation auth_op)
11728 {
11729         struct crypto_testsuite_params *ts_params = &testsuite_params;
11730         uint8_t auth_key[reference->auth_key.len + 1];
11731
11732         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11733
11734         /* Setup Authentication Parameters */
11735         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11736         ut_params->auth_xform.auth.op = auth_op;
11737         ut_params->auth_xform.next = NULL;
11738         ut_params->auth_xform.auth.algo = reference->auth_algo;
11739         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11740         ut_params->auth_xform.auth.key.data = auth_key;
11741         ut_params->auth_xform.auth.digest_length = reference->digest.len;
11742
11743         /* Create Crypto session*/
11744         ut_params->sess = rte_cryptodev_sym_session_create(
11745                         ts_params->session_mpool);
11746
11747         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11748                                 &ut_params->auth_xform,
11749                                 ts_params->session_priv_mpool);
11750
11751         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11752
11753         return 0;
11754 }
11755
11756 static int
11757 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
11758                 uint8_t dev_id,
11759                 const struct test_crypto_vector *reference,
11760                 enum rte_crypto_auth_operation auth_op,
11761                 enum rte_crypto_cipher_operation cipher_op)
11762 {
11763         struct crypto_testsuite_params *ts_params = &testsuite_params;
11764         uint8_t cipher_key[reference->cipher_key.len + 1];
11765         uint8_t auth_key[reference->auth_key.len + 1];
11766
11767         memcpy(cipher_key, reference->cipher_key.data,
11768                         reference->cipher_key.len);
11769         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11770
11771         /* Setup Authentication Parameters */
11772         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11773         ut_params->auth_xform.auth.op = auth_op;
11774         ut_params->auth_xform.auth.algo = reference->auth_algo;
11775         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11776         ut_params->auth_xform.auth.key.data = auth_key;
11777         ut_params->auth_xform.auth.digest_length = reference->digest.len;
11778
11779         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
11780                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11781                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
11782         } else {
11783                 ut_params->auth_xform.next = &ut_params->cipher_xform;
11784
11785                 /* Setup Cipher Parameters */
11786                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11787                 ut_params->cipher_xform.next = NULL;
11788                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
11789                 ut_params->cipher_xform.cipher.op = cipher_op;
11790                 ut_params->cipher_xform.cipher.key.data = cipher_key;
11791                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
11792                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
11793                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
11794         }
11795
11796         /* Create Crypto session*/
11797         ut_params->sess = rte_cryptodev_sym_session_create(
11798                         ts_params->session_mpool);
11799
11800         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11801                                 &ut_params->auth_xform,
11802                                 ts_params->session_priv_mpool);
11803
11804         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11805
11806         return 0;
11807 }
11808
11809 static int
11810 create_auth_operation(struct crypto_testsuite_params *ts_params,
11811                 struct crypto_unittest_params *ut_params,
11812                 const struct test_crypto_vector *reference,
11813                 unsigned int auth_generate)
11814 {
11815         /* Generate Crypto op data structure */
11816         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11817                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11818         TEST_ASSERT_NOT_NULL(ut_params->op,
11819                         "Failed to allocate pktmbuf offload");
11820
11821         /* Set crypto operation data parameters */
11822         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11823
11824         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11825
11826         /* set crypto operation source mbuf */
11827         sym_op->m_src = ut_params->ibuf;
11828
11829         /* digest */
11830         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11831                         ut_params->ibuf, reference->digest.len);
11832
11833         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11834                         "no room to append auth tag");
11835
11836         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11837                         ut_params->ibuf, reference->plaintext.len);
11838
11839         if (auth_generate)
11840                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11841         else
11842                 memcpy(sym_op->auth.digest.data,
11843                                 reference->digest.data,
11844                                 reference->digest.len);
11845
11846         debug_hexdump(stdout, "digest:",
11847                         sym_op->auth.digest.data,
11848                         reference->digest.len);
11849
11850         sym_op->auth.data.length = reference->plaintext.len;
11851         sym_op->auth.data.offset = 0;
11852
11853         return 0;
11854 }
11855
11856 static int
11857 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
11858                 struct crypto_unittest_params *ut_params,
11859                 const struct test_crypto_vector *reference,
11860                 unsigned int auth_generate)
11861 {
11862         /* Generate Crypto op data structure */
11863         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11864                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11865         TEST_ASSERT_NOT_NULL(ut_params->op,
11866                         "Failed to allocate pktmbuf offload");
11867
11868         /* Set crypto operation data parameters */
11869         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11870
11871         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11872
11873         /* set crypto operation source mbuf */
11874         sym_op->m_src = ut_params->ibuf;
11875
11876         /* digest */
11877         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11878                         ut_params->ibuf, reference->digest.len);
11879
11880         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11881                         "no room to append auth tag");
11882
11883         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11884                         ut_params->ibuf, reference->ciphertext.len);
11885
11886         if (auth_generate)
11887                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11888         else
11889                 memcpy(sym_op->auth.digest.data,
11890                                 reference->digest.data,
11891                                 reference->digest.len);
11892
11893         debug_hexdump(stdout, "digest:",
11894                         sym_op->auth.digest.data,
11895                         reference->digest.len);
11896
11897         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11898                         reference->iv.data, reference->iv.len);
11899
11900         sym_op->cipher.data.length = 0;
11901         sym_op->cipher.data.offset = 0;
11902
11903         sym_op->auth.data.length = reference->plaintext.len;
11904         sym_op->auth.data.offset = 0;
11905
11906         return 0;
11907 }
11908
11909 static int
11910 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
11911                 struct crypto_unittest_params *ut_params,
11912                 const struct test_crypto_vector *reference,
11913                 unsigned int auth_generate)
11914 {
11915         /* Generate Crypto op data structure */
11916         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11917                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11918         TEST_ASSERT_NOT_NULL(ut_params->op,
11919                         "Failed to allocate pktmbuf offload");
11920
11921         /* Set crypto operation data parameters */
11922         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11923
11924         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11925
11926         /* set crypto operation source mbuf */
11927         sym_op->m_src = ut_params->ibuf;
11928
11929         /* digest */
11930         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11931                         ut_params->ibuf, reference->digest.len);
11932
11933         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11934                         "no room to append auth tag");
11935
11936         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11937                         ut_params->ibuf, reference->ciphertext.len);
11938
11939         if (auth_generate)
11940                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11941         else
11942                 memcpy(sym_op->auth.digest.data,
11943                                 reference->digest.data,
11944                                 reference->digest.len);
11945
11946         debug_hexdump(stdout, "digest:",
11947                         sym_op->auth.digest.data,
11948                         reference->digest.len);
11949
11950         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11951                         reference->iv.data, reference->iv.len);
11952
11953         sym_op->cipher.data.length = reference->cipher_len;
11954         sym_op->cipher.data.offset = reference->cipher_offset;
11955
11956         sym_op->auth.data.length = reference->plaintext.len;
11957         sym_op->auth.data.offset = reference->auth_offset;
11958
11959         return 0;
11960 }
11961
11962 static int
11963 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11964                 struct crypto_unittest_params *ut_params,
11965                 const struct test_crypto_vector *reference)
11966 {
11967         return create_auth_operation(ts_params, ut_params, reference, 0);
11968 }
11969
11970 static int
11971 create_auth_verify_GMAC_operation(
11972                 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_GMAC_operation(ts_params, ut_params, reference, 0);
11977 }
11978
11979 static int
11980 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11981                 struct crypto_unittest_params *ut_params,
11982                 const struct test_crypto_vector *reference)
11983 {
11984         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
11985 }
11986
11987 static int
11988 test_authentication_verify_fail_when_data_corruption(
11989                 struct crypto_testsuite_params *ts_params,
11990                 struct crypto_unittest_params *ut_params,
11991                 const struct test_crypto_vector *reference,
11992                 unsigned int data_corrupted)
11993 {
11994         int retval;
11995
11996         uint8_t *plaintext;
11997         struct rte_cryptodev_info dev_info;
11998
11999         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12000         uint64_t feat_flags = dev_info.feature_flags;
12001
12002         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12003                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12004                 printf("Device doesn't support RAW data-path APIs.\n");
12005                 return -ENOTSUP;
12006         }
12007
12008         /* Verify the capabilities */
12009         struct rte_cryptodev_sym_capability_idx cap_idx;
12010         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12011         cap_idx.algo.auth = reference->auth_algo;
12012         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12013                         &cap_idx) == NULL)
12014                 return -ENOTSUP;
12015
12016
12017         /* Create session */
12018         retval = create_auth_session(ut_params,
12019                         ts_params->valid_devs[0],
12020                         reference,
12021                         RTE_CRYPTO_AUTH_OP_VERIFY);
12022         if (retval < 0)
12023                 return retval;
12024
12025         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12026         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12027                         "Failed to allocate input buffer in mempool");
12028
12029         /* clear mbuf payload */
12030         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12031                         rte_pktmbuf_tailroom(ut_params->ibuf));
12032
12033         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12034                         reference->plaintext.len);
12035         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12036         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12037
12038         debug_hexdump(stdout, "plaintext:", plaintext,
12039                 reference->plaintext.len);
12040
12041         /* Create operation */
12042         retval = create_auth_verify_operation(ts_params, ut_params, reference);
12043
12044         if (retval < 0)
12045                 return retval;
12046
12047         if (data_corrupted)
12048                 data_corruption(plaintext);
12049         else
12050                 tag_corruption(plaintext, reference->plaintext.len);
12051
12052         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12053                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12054                         ut_params->op);
12055                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12056                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12057                         "authentication not failed");
12058         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12059                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12060                                 ut_params->op, 0, 1, 0, 0);
12061         else {
12062                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12063                         ut_params->op);
12064                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12065         }
12066
12067         return 0;
12068 }
12069
12070 static int
12071 test_authentication_verify_GMAC_fail_when_corruption(
12072                 struct crypto_testsuite_params *ts_params,
12073                 struct crypto_unittest_params *ut_params,
12074                 const struct test_crypto_vector *reference,
12075                 unsigned int data_corrupted)
12076 {
12077         int retval;
12078         uint8_t *plaintext;
12079         struct rte_cryptodev_info dev_info;
12080
12081         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12082         uint64_t feat_flags = dev_info.feature_flags;
12083
12084         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12085                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12086                 printf("Device doesn't support RAW data-path APIs.\n");
12087                 return -ENOTSUP;
12088         }
12089
12090         /* Verify the capabilities */
12091         struct rte_cryptodev_sym_capability_idx cap_idx;
12092         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12093         cap_idx.algo.auth = reference->auth_algo;
12094         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12095                         &cap_idx) == NULL)
12096                 return -ENOTSUP;
12097
12098         /* Create session */
12099         retval = create_auth_cipher_session(ut_params,
12100                         ts_params->valid_devs[0],
12101                         reference,
12102                         RTE_CRYPTO_AUTH_OP_VERIFY,
12103                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
12104         if (retval < 0)
12105                 return retval;
12106
12107         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12108         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12109                         "Failed to allocate input buffer in mempool");
12110
12111         /* clear mbuf payload */
12112         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12113                         rte_pktmbuf_tailroom(ut_params->ibuf));
12114
12115         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12116                         reference->plaintext.len);
12117         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12118         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12119
12120         debug_hexdump(stdout, "plaintext:", plaintext,
12121                 reference->plaintext.len);
12122
12123         /* Create operation */
12124         retval = create_auth_verify_GMAC_operation(ts_params,
12125                         ut_params,
12126                         reference);
12127
12128         if (retval < 0)
12129                 return retval;
12130
12131         if (data_corrupted)
12132                 data_corruption(plaintext);
12133         else
12134                 tag_corruption(plaintext, reference->aad.len);
12135
12136         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12137                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12138                         ut_params->op);
12139                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12140                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12141                         "authentication not failed");
12142         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12143                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12144                                 ut_params->op, 0, 1, 0, 0);
12145         else {
12146                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12147                         ut_params->op);
12148                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12149         }
12150
12151         return 0;
12152 }
12153
12154 static int
12155 test_authenticated_decryption_fail_when_corruption(
12156                 struct crypto_testsuite_params *ts_params,
12157                 struct crypto_unittest_params *ut_params,
12158                 const struct test_crypto_vector *reference,
12159                 unsigned int data_corrupted)
12160 {
12161         int retval;
12162
12163         uint8_t *ciphertext;
12164         struct rte_cryptodev_info dev_info;
12165
12166         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12167         uint64_t feat_flags = dev_info.feature_flags;
12168
12169         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12170                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12171                 printf("Device doesn't support RAW data-path APIs.\n");
12172                 return -ENOTSUP;
12173         }
12174
12175         /* Verify the capabilities */
12176         struct rte_cryptodev_sym_capability_idx cap_idx;
12177         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12178         cap_idx.algo.auth = reference->auth_algo;
12179         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12180                         &cap_idx) == NULL)
12181                 return -ENOTSUP;
12182         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12183         cap_idx.algo.cipher = reference->crypto_algo;
12184         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12185                         &cap_idx) == NULL)
12186                 return -ENOTSUP;
12187
12188         /* Create session */
12189         retval = create_auth_cipher_session(ut_params,
12190                         ts_params->valid_devs[0],
12191                         reference,
12192                         RTE_CRYPTO_AUTH_OP_VERIFY,
12193                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
12194         if (retval < 0)
12195                 return retval;
12196
12197         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12198         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12199                         "Failed to allocate input buffer in mempool");
12200
12201         /* clear mbuf payload */
12202         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12203                         rte_pktmbuf_tailroom(ut_params->ibuf));
12204
12205         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12206                         reference->ciphertext.len);
12207         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12208         memcpy(ciphertext, reference->ciphertext.data,
12209                         reference->ciphertext.len);
12210
12211         /* Create operation */
12212         retval = create_cipher_auth_verify_operation(ts_params,
12213                         ut_params,
12214                         reference);
12215
12216         if (retval < 0)
12217                 return retval;
12218
12219         if (data_corrupted)
12220                 data_corruption(ciphertext);
12221         else
12222                 tag_corruption(ciphertext, reference->ciphertext.len);
12223
12224         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12225                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12226                         ut_params->op);
12227                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12228                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12229                         "authentication not failed");
12230         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12231                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12232                                 ut_params->op, 1, 1, 0, 0);
12233         else {
12234                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12235                         ut_params->op);
12236                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12237         }
12238
12239         return 0;
12240 }
12241
12242 static int
12243 test_authenticated_encryt_with_esn(
12244                 struct crypto_testsuite_params *ts_params,
12245                 struct crypto_unittest_params *ut_params,
12246                 const struct test_crypto_vector *reference)
12247 {
12248         int retval;
12249
12250         uint8_t *authciphertext, *plaintext, *auth_tag;
12251         uint16_t plaintext_pad_len;
12252         uint8_t cipher_key[reference->cipher_key.len + 1];
12253         uint8_t auth_key[reference->auth_key.len + 1];
12254         struct rte_cryptodev_info dev_info;
12255
12256         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12257         uint64_t feat_flags = dev_info.feature_flags;
12258
12259         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12260                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12261                 printf("Device doesn't support RAW data-path APIs.\n");
12262                 return -ENOTSUP;
12263         }
12264
12265         /* Verify the capabilities */
12266         struct rte_cryptodev_sym_capability_idx cap_idx;
12267         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12268         cap_idx.algo.auth = reference->auth_algo;
12269         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12270                         &cap_idx) == NULL)
12271                 return -ENOTSUP;
12272         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12273         cap_idx.algo.cipher = reference->crypto_algo;
12274         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12275                         &cap_idx) == NULL)
12276                 return -ENOTSUP;
12277
12278         /* Create session */
12279         memcpy(cipher_key, reference->cipher_key.data,
12280                         reference->cipher_key.len);
12281         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12282
12283         /* Setup Cipher Parameters */
12284         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12285         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12286         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12287         ut_params->cipher_xform.cipher.key.data = cipher_key;
12288         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12289         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12290         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12291
12292         ut_params->cipher_xform.next = &ut_params->auth_xform;
12293
12294         /* Setup Authentication Parameters */
12295         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12296         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12297         ut_params->auth_xform.auth.algo = reference->auth_algo;
12298         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12299         ut_params->auth_xform.auth.key.data = auth_key;
12300         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12301         ut_params->auth_xform.next = NULL;
12302
12303         /* Create Crypto session*/
12304         ut_params->sess = rte_cryptodev_sym_session_create(
12305                         ts_params->session_mpool);
12306
12307         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12308                                 ut_params->sess,
12309                                 &ut_params->cipher_xform,
12310                                 ts_params->session_priv_mpool);
12311
12312         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12313
12314         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12315         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12316                         "Failed to allocate input buffer in mempool");
12317
12318         /* clear mbuf payload */
12319         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12320                         rte_pktmbuf_tailroom(ut_params->ibuf));
12321
12322         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12323                         reference->plaintext.len);
12324         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12325         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12326
12327         /* Create operation */
12328         retval = create_cipher_auth_operation(ts_params,
12329                         ut_params,
12330                         reference, 0);
12331
12332         if (retval < 0)
12333                 return retval;
12334
12335         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12336                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12337                         ut_params->op);
12338         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12339                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12340                                 ut_params->op, 1, 1, 0, 0);
12341         else
12342                 ut_params->op = process_crypto_request(
12343                         ts_params->valid_devs[0], ut_params->op);
12344
12345         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
12346
12347         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12348                         "crypto op processing failed");
12349
12350         plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
12351
12352         authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
12353                         ut_params->op->sym->auth.data.offset);
12354         auth_tag = authciphertext + plaintext_pad_len;
12355         debug_hexdump(stdout, "ciphertext:", authciphertext,
12356                         reference->ciphertext.len);
12357         debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
12358
12359         /* Validate obuf */
12360         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12361                         authciphertext,
12362                         reference->ciphertext.data,
12363                         reference->ciphertext.len,
12364                         "Ciphertext data not as expected");
12365
12366         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12367                         auth_tag,
12368                         reference->digest.data,
12369                         reference->digest.len,
12370                         "Generated digest not as expected");
12371
12372         return TEST_SUCCESS;
12373
12374 }
12375
12376 static int
12377 test_authenticated_decrypt_with_esn(
12378                 struct crypto_testsuite_params *ts_params,
12379                 struct crypto_unittest_params *ut_params,
12380                 const struct test_crypto_vector *reference)
12381 {
12382         int retval;
12383
12384         uint8_t *ciphertext;
12385         uint8_t cipher_key[reference->cipher_key.len + 1];
12386         uint8_t auth_key[reference->auth_key.len + 1];
12387         struct rte_cryptodev_info dev_info;
12388
12389         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12390         uint64_t feat_flags = dev_info.feature_flags;
12391
12392         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12393                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12394                 printf("Device doesn't support RAW data-path APIs.\n");
12395                 return -ENOTSUP;
12396         }
12397
12398         /* Verify the capabilities */
12399         struct rte_cryptodev_sym_capability_idx cap_idx;
12400         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12401         cap_idx.algo.auth = reference->auth_algo;
12402         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12403                         &cap_idx) == NULL)
12404                 return -ENOTSUP;
12405         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12406         cap_idx.algo.cipher = reference->crypto_algo;
12407         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12408                         &cap_idx) == NULL)
12409                 return -ENOTSUP;
12410
12411         /* Create session */
12412         memcpy(cipher_key, reference->cipher_key.data,
12413                         reference->cipher_key.len);
12414         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12415
12416         /* Setup Authentication Parameters */
12417         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12418         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
12419         ut_params->auth_xform.auth.algo = reference->auth_algo;
12420         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12421         ut_params->auth_xform.auth.key.data = auth_key;
12422         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12423         ut_params->auth_xform.next = &ut_params->cipher_xform;
12424
12425         /* Setup Cipher Parameters */
12426         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12427         ut_params->cipher_xform.next = NULL;
12428         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12429         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
12430         ut_params->cipher_xform.cipher.key.data = cipher_key;
12431         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12432         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12433         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12434
12435         /* Create Crypto session*/
12436         ut_params->sess = rte_cryptodev_sym_session_create(
12437                         ts_params->session_mpool);
12438
12439         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12440                                 ut_params->sess,
12441                                 &ut_params->auth_xform,
12442                                 ts_params->session_priv_mpool);
12443
12444         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12445
12446         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12447         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12448                         "Failed to allocate input buffer in mempool");
12449
12450         /* clear mbuf payload */
12451         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12452                         rte_pktmbuf_tailroom(ut_params->ibuf));
12453
12454         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12455                         reference->ciphertext.len);
12456         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12457         memcpy(ciphertext, reference->ciphertext.data,
12458                         reference->ciphertext.len);
12459
12460         /* Create operation */
12461         retval = create_cipher_auth_verify_operation(ts_params,
12462                         ut_params,
12463                         reference);
12464
12465         if (retval < 0)
12466                 return retval;
12467
12468         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12469                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12470                         ut_params->op);
12471         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12472                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12473                                 ut_params->op, 1, 1, 0, 0);
12474         else
12475                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12476                         ut_params->op);
12477
12478         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
12479         TEST_ASSERT_EQUAL(ut_params->op->status,
12480                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12481                         "crypto op processing passed");
12482
12483         ut_params->obuf = ut_params->op->sym->m_src;
12484         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
12485
12486         return 0;
12487 }
12488
12489 static int
12490 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
12491                 const struct aead_test_data *tdata,
12492                 void *digest_mem, uint64_t digest_phys)
12493 {
12494         struct crypto_testsuite_params *ts_params = &testsuite_params;
12495         struct crypto_unittest_params *ut_params = &unittest_params;
12496
12497         const unsigned int auth_tag_len = tdata->auth_tag.len;
12498         const unsigned int iv_len = tdata->iv.len;
12499         unsigned int aad_len = tdata->aad.len;
12500         unsigned int aad_len_pad = 0;
12501
12502         /* Generate Crypto op data structure */
12503         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12504                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12505         TEST_ASSERT_NOT_NULL(ut_params->op,
12506                 "Failed to allocate symmetric crypto operation struct");
12507
12508         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12509
12510         sym_op->aead.digest.data = digest_mem;
12511
12512         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
12513                         "no room to append digest");
12514
12515         sym_op->aead.digest.phys_addr = digest_phys;
12516
12517         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
12518                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
12519                                 auth_tag_len);
12520                 debug_hexdump(stdout, "digest:",
12521                                 sym_op->aead.digest.data,
12522                                 auth_tag_len);
12523         }
12524
12525         /* Append aad data */
12526         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
12527                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12528                                 uint8_t *, IV_OFFSET);
12529
12530                 /* Copy IV 1 byte after the IV pointer, according to the API */
12531                 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
12532
12533                 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
12534
12535                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12536                                 ut_params->ibuf, aad_len);
12537                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12538                                 "no room to prepend aad");
12539                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12540                                 ut_params->ibuf);
12541
12542                 memset(sym_op->aead.aad.data, 0, aad_len);
12543                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
12544                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12545
12546                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12547                 debug_hexdump(stdout, "aad:",
12548                                 sym_op->aead.aad.data, aad_len);
12549         } else {
12550                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12551                                 uint8_t *, IV_OFFSET);
12552
12553                 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
12554
12555                 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
12556
12557                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12558                                 ut_params->ibuf, aad_len_pad);
12559                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12560                                 "no room to prepend aad");
12561                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12562                                 ut_params->ibuf);
12563
12564                 memset(sym_op->aead.aad.data, 0, aad_len);
12565                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12566
12567                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12568                 debug_hexdump(stdout, "aad:",
12569                                 sym_op->aead.aad.data, aad_len);
12570         }
12571
12572         sym_op->aead.data.length = tdata->plaintext.len;
12573         sym_op->aead.data.offset = aad_len_pad;
12574
12575         return 0;
12576 }
12577
12578 #define SGL_MAX_NO      16
12579
12580 static int
12581 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
12582                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
12583 {
12584         struct crypto_testsuite_params *ts_params = &testsuite_params;
12585         struct crypto_unittest_params *ut_params = &unittest_params;
12586         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
12587         int retval;
12588         int to_trn = 0;
12589         int to_trn_tbl[SGL_MAX_NO];
12590         int segs = 1;
12591         unsigned int trn_data = 0;
12592         uint8_t *plaintext, *ciphertext, *auth_tag;
12593         struct rte_cryptodev_info dev_info;
12594
12595         /* Verify the capabilities */
12596         struct rte_cryptodev_sym_capability_idx cap_idx;
12597         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12598         cap_idx.algo.aead = tdata->algo;
12599         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12600                         &cap_idx) == NULL)
12601                 return -ENOTSUP;
12602
12603         /* OOP not supported with CPU crypto */
12604         if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12605                 return -ENOTSUP;
12606
12607         /* Detailed check for the particular SGL support flag */
12608         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12609         if (!oop) {
12610                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
12611                 if (sgl_in && (!(dev_info.feature_flags &
12612                                 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
12613                         return -ENOTSUP;
12614
12615                 uint64_t feat_flags = dev_info.feature_flags;
12616
12617                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12618                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12619                         printf("Device doesn't support RAW data-path APIs.\n");
12620                         return -ENOTSUP;
12621                 }
12622         } else {
12623                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
12624                 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
12625                                 tdata->plaintext.len;
12626                 /* Raw data path API does not support OOP */
12627                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12628                         return -ENOTSUP;
12629                 if (sgl_in && !sgl_out) {
12630                         if (!(dev_info.feature_flags &
12631                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
12632                                 return -ENOTSUP;
12633                 } else if (!sgl_in && sgl_out) {
12634                         if (!(dev_info.feature_flags &
12635                                         RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
12636                                 return -ENOTSUP;
12637                 } else if (sgl_in && sgl_out) {
12638                         if (!(dev_info.feature_flags &
12639                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
12640                                 return -ENOTSUP;
12641                 }
12642         }
12643
12644         if (fragsz > tdata->plaintext.len)
12645                 fragsz = tdata->plaintext.len;
12646
12647         uint16_t plaintext_len = fragsz;
12648         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
12649
12650         if (fragsz_oop > tdata->plaintext.len)
12651                 frag_size_oop = tdata->plaintext.len;
12652
12653         int ecx = 0;
12654         void *digest_mem = NULL;
12655
12656         uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
12657
12658         if (tdata->plaintext.len % fragsz != 0) {
12659                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
12660                         return 1;
12661         }       else {
12662                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
12663                         return 1;
12664         }
12665
12666         /*
12667          * For out-op-place we need to alloc another mbuf
12668          */
12669         if (oop) {
12670                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12671                 rte_pktmbuf_append(ut_params->obuf,
12672                                 frag_size_oop + prepend_len);
12673                 buf_oop = ut_params->obuf;
12674         }
12675
12676         /* Create AEAD session */
12677         retval = create_aead_session(ts_params->valid_devs[0],
12678                         tdata->algo,
12679                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
12680                         tdata->key.data, tdata->key.len,
12681                         tdata->aad.len, tdata->auth_tag.len,
12682                         tdata->iv.len);
12683         if (retval < 0)
12684                 return retval;
12685
12686         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12687
12688         /* clear mbuf payload */
12689         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12690                         rte_pktmbuf_tailroom(ut_params->ibuf));
12691
12692         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12693                         plaintext_len);
12694
12695         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12696
12697         trn_data += plaintext_len;
12698
12699         buf = ut_params->ibuf;
12700
12701         /*
12702          * Loop until no more fragments
12703          */
12704
12705         while (trn_data < tdata->plaintext.len) {
12706                 ++segs;
12707                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12708                                 (tdata->plaintext.len - trn_data) : fragsz;
12709
12710                 to_trn_tbl[ecx++] = to_trn;
12711
12712                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12713                 buf = buf->next;
12714
12715                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12716                                 rte_pktmbuf_tailroom(buf));
12717
12718                 /* OOP */
12719                 if (oop && !fragsz_oop) {
12720                         buf_last_oop = buf_oop->next =
12721                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
12722                         buf_oop = buf_oop->next;
12723                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12724                                         0, rte_pktmbuf_tailroom(buf_oop));
12725                         rte_pktmbuf_append(buf_oop, to_trn);
12726                 }
12727
12728                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12729                                 to_trn);
12730
12731                 memcpy(plaintext, tdata->plaintext.data + trn_data,
12732                                 to_trn);
12733                 trn_data += to_trn;
12734                 if (trn_data  == tdata->plaintext.len) {
12735                         if (oop) {
12736                                 if (!fragsz_oop)
12737                                         digest_mem = rte_pktmbuf_append(buf_oop,
12738                                                 tdata->auth_tag.len);
12739                         } else
12740                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12741                                         tdata->auth_tag.len);
12742                 }
12743         }
12744
12745         uint64_t digest_phys = 0;
12746
12747         ut_params->ibuf->nb_segs = segs;
12748
12749         segs = 1;
12750         if (fragsz_oop && oop) {
12751                 to_trn = 0;
12752                 ecx = 0;
12753
12754                 if (frag_size_oop == tdata->plaintext.len) {
12755                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
12756                                 tdata->auth_tag.len);
12757
12758                         digest_phys = rte_pktmbuf_iova_offset(
12759                                         ut_params->obuf,
12760                                         tdata->plaintext.len + prepend_len);
12761                 }
12762
12763                 trn_data = frag_size_oop;
12764                 while (trn_data < tdata->plaintext.len) {
12765                         ++segs;
12766                         to_trn =
12767                                 (tdata->plaintext.len - trn_data <
12768                                                 frag_size_oop) ?
12769                                 (tdata->plaintext.len - trn_data) :
12770                                                 frag_size_oop;
12771
12772                         to_trn_tbl[ecx++] = to_trn;
12773
12774                         buf_last_oop = buf_oop->next =
12775                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
12776                         buf_oop = buf_oop->next;
12777                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12778                                         0, rte_pktmbuf_tailroom(buf_oop));
12779                         rte_pktmbuf_append(buf_oop, to_trn);
12780
12781                         trn_data += to_trn;
12782
12783                         if (trn_data  == tdata->plaintext.len) {
12784                                 digest_mem = rte_pktmbuf_append(buf_oop,
12785                                         tdata->auth_tag.len);
12786                         }
12787                 }
12788
12789                 ut_params->obuf->nb_segs = segs;
12790         }
12791
12792         /*
12793          * Place digest at the end of the last buffer
12794          */
12795         if (!digest_phys)
12796                 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12797         if (oop && buf_last_oop)
12798                 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
12799
12800         if (!digest_mem && !oop) {
12801                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12802                                 + tdata->auth_tag.len);
12803                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12804                                 tdata->plaintext.len);
12805         }
12806
12807         /* Create AEAD operation */
12808         retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
12809                         tdata, digest_mem, digest_phys);
12810
12811         if (retval < 0)
12812                 return retval;
12813
12814         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12815
12816         ut_params->op->sym->m_src = ut_params->ibuf;
12817         if (oop)
12818                 ut_params->op->sym->m_dst = ut_params->obuf;
12819
12820         /* Process crypto operation */
12821         if (oop == IN_PLACE &&
12822                         gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12823                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
12824         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12825                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12826                                 ut_params->op, 0, 0, 0, 0);
12827         else
12828                 TEST_ASSERT_NOT_NULL(
12829                         process_crypto_request(ts_params->valid_devs[0],
12830                         ut_params->op), "failed to process sym crypto op");
12831
12832         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12833                         "crypto op processing failed");
12834
12835
12836         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
12837                         uint8_t *, prepend_len);
12838         if (oop) {
12839                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12840                                 uint8_t *, prepend_len);
12841         }
12842
12843         if (fragsz_oop)
12844                 fragsz = fragsz_oop;
12845
12846         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12847                         ciphertext,
12848                         tdata->ciphertext.data,
12849                         fragsz,
12850                         "Ciphertext data not as expected");
12851
12852         buf = ut_params->op->sym->m_src->next;
12853         if (oop)
12854                 buf = ut_params->op->sym->m_dst->next;
12855
12856         unsigned int off = fragsz;
12857
12858         ecx = 0;
12859         while (buf) {
12860                 ciphertext = rte_pktmbuf_mtod(buf,
12861                                 uint8_t *);
12862
12863                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
12864                                 ciphertext,
12865                                 tdata->ciphertext.data + off,
12866                                 to_trn_tbl[ecx],
12867                                 "Ciphertext data not as expected");
12868
12869                 off += to_trn_tbl[ecx++];
12870                 buf = buf->next;
12871         }
12872
12873         auth_tag = digest_mem;
12874         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12875                         auth_tag,
12876                         tdata->auth_tag.data,
12877                         tdata->auth_tag.len,
12878                         "Generated auth tag not as expected");
12879
12880         return 0;
12881 }
12882
12883 static int
12884 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
12885 {
12886         return test_authenticated_encryption_SGL(
12887                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
12888 }
12889
12890 static int
12891 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
12892 {
12893         return test_authenticated_encryption_SGL(
12894                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
12895 }
12896
12897 static int
12898 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
12899 {
12900         return test_authenticated_encryption_SGL(
12901                         &gcm_test_case_8, OUT_OF_PLACE, 400,
12902                         gcm_test_case_8.plaintext.len);
12903 }
12904
12905 static int
12906 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
12907 {
12908         /* This test is not for OPENSSL PMD */
12909         if (gbl_driver_id == rte_cryptodev_driver_id_get(
12910                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
12911                 return -ENOTSUP;
12912
12913         return test_authenticated_encryption_SGL(
12914                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
12915 }
12916
12917 static int
12918 test_authentication_verify_fail_when_data_corrupted(
12919                 struct crypto_testsuite_params *ts_params,
12920                 struct crypto_unittest_params *ut_params,
12921                 const struct test_crypto_vector *reference)
12922 {
12923         return test_authentication_verify_fail_when_data_corruption(
12924                         ts_params, ut_params, reference, 1);
12925 }
12926
12927 static int
12928 test_authentication_verify_fail_when_tag_corrupted(
12929                 struct crypto_testsuite_params *ts_params,
12930                 struct crypto_unittest_params *ut_params,
12931                 const struct test_crypto_vector *reference)
12932 {
12933         return test_authentication_verify_fail_when_data_corruption(
12934                         ts_params, ut_params, reference, 0);
12935 }
12936
12937 static int
12938 test_authentication_verify_GMAC_fail_when_data_corrupted(
12939                 struct crypto_testsuite_params *ts_params,
12940                 struct crypto_unittest_params *ut_params,
12941                 const struct test_crypto_vector *reference)
12942 {
12943         return test_authentication_verify_GMAC_fail_when_corruption(
12944                         ts_params, ut_params, reference, 1);
12945 }
12946
12947 static int
12948 test_authentication_verify_GMAC_fail_when_tag_corrupted(
12949                 struct crypto_testsuite_params *ts_params,
12950                 struct crypto_unittest_params *ut_params,
12951                 const struct test_crypto_vector *reference)
12952 {
12953         return test_authentication_verify_GMAC_fail_when_corruption(
12954                         ts_params, ut_params, reference, 0);
12955 }
12956
12957 static int
12958 test_authenticated_decryption_fail_when_data_corrupted(
12959                 struct crypto_testsuite_params *ts_params,
12960                 struct crypto_unittest_params *ut_params,
12961                 const struct test_crypto_vector *reference)
12962 {
12963         return test_authenticated_decryption_fail_when_corruption(
12964                         ts_params, ut_params, reference, 1);
12965 }
12966
12967 static int
12968 test_authenticated_decryption_fail_when_tag_corrupted(
12969                 struct crypto_testsuite_params *ts_params,
12970                 struct crypto_unittest_params *ut_params,
12971                 const struct test_crypto_vector *reference)
12972 {
12973         return test_authenticated_decryption_fail_when_corruption(
12974                         ts_params, ut_params, reference, 0);
12975 }
12976
12977 static int
12978 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
12979 {
12980         return test_authentication_verify_fail_when_data_corrupted(
12981                         &testsuite_params, &unittest_params,
12982                         &hmac_sha1_test_crypto_vector);
12983 }
12984
12985 static int
12986 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
12987 {
12988         return test_authentication_verify_fail_when_tag_corrupted(
12989                         &testsuite_params, &unittest_params,
12990                         &hmac_sha1_test_crypto_vector);
12991 }
12992
12993 static int
12994 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
12995 {
12996         return test_authentication_verify_GMAC_fail_when_data_corrupted(
12997                         &testsuite_params, &unittest_params,
12998                         &aes128_gmac_test_vector);
12999 }
13000
13001 static int
13002 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13003 {
13004         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13005                         &testsuite_params, &unittest_params,
13006                         &aes128_gmac_test_vector);
13007 }
13008
13009 static int
13010 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13011 {
13012         return test_authenticated_decryption_fail_when_data_corrupted(
13013                         &testsuite_params,
13014                         &unittest_params,
13015                         &aes128cbc_hmac_sha1_test_vector);
13016 }
13017
13018 static int
13019 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
13020 {
13021         return test_authenticated_decryption_fail_when_tag_corrupted(
13022                         &testsuite_params,
13023                         &unittest_params,
13024                         &aes128cbc_hmac_sha1_test_vector);
13025 }
13026
13027 static int
13028 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13029 {
13030         return test_authenticated_encryt_with_esn(
13031                         &testsuite_params,
13032                         &unittest_params,
13033                         &aes128cbc_hmac_sha1_aad_test_vector);
13034 }
13035
13036 static int
13037 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13038 {
13039         return test_authenticated_decrypt_with_esn(
13040                         &testsuite_params,
13041                         &unittest_params,
13042                         &aes128cbc_hmac_sha1_aad_test_vector);
13043 }
13044
13045 static int
13046 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
13047 {
13048         return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
13049 }
13050
13051 static int
13052 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
13053 {
13054         return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
13055 }
13056
13057 #ifdef RTE_CRYPTO_SCHEDULER
13058
13059 /* global AESNI worker IDs for the scheduler test */
13060 uint8_t aesni_ids[2];
13061
13062 static int
13063 test_scheduler_attach_slave_op(void)
13064 {
13065         struct crypto_testsuite_params *ts_params = &testsuite_params;
13066         uint8_t sched_id = ts_params->valid_devs[0];
13067         uint32_t nb_devs, i, nb_devs_attached = 0;
13068         int ret;
13069         char vdev_name[32];
13070
13071         /* create 2 AESNI_MB if necessary */
13072         nb_devs = rte_cryptodev_device_count_by_driver(
13073                         rte_cryptodev_driver_id_get(
13074                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
13075         if (nb_devs < 2) {
13076                 for (i = nb_devs; i < 2; i++) {
13077                         snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
13078                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
13079                                         i);
13080                         ret = rte_vdev_init(vdev_name, NULL);
13081
13082                         TEST_ASSERT(ret == 0,
13083                                 "Failed to create instance %u of"
13084                                 " pmd : %s",
13085                                 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13086                 }
13087         }
13088
13089         /* attach 2 AESNI_MB cdevs */
13090         for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
13091                         i++) {
13092                 struct rte_cryptodev_info info;
13093                 unsigned int session_size;
13094
13095                 rte_cryptodev_info_get(i, &info);
13096                 if (info.driver_id != rte_cryptodev_driver_id_get(
13097                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
13098                         continue;
13099
13100                 session_size = rte_cryptodev_sym_get_private_session_size(i);
13101                 /*
13102                  * Create the session mempool again, since now there are new devices
13103                  * to use the mempool.
13104                  */
13105                 if (ts_params->session_mpool) {
13106                         rte_mempool_free(ts_params->session_mpool);
13107                         ts_params->session_mpool = NULL;
13108                 }
13109                 if (ts_params->session_priv_mpool) {
13110                         rte_mempool_free(ts_params->session_priv_mpool);
13111                         ts_params->session_priv_mpool = NULL;
13112                 }
13113
13114                 if (info.sym.max_nb_sessions != 0 &&
13115                                 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
13116                         RTE_LOG(ERR, USER1,
13117                                         "Device does not support "
13118                                         "at least %u sessions\n",
13119                                         MAX_NB_SESSIONS);
13120                         return TEST_FAILED;
13121                 }
13122                 /*
13123                  * Create mempool with maximum number of sessions,
13124                  * to include the session headers
13125                  */
13126                 if (ts_params->session_mpool == NULL) {
13127                         ts_params->session_mpool =
13128                                 rte_cryptodev_sym_session_pool_create(
13129                                                 "test_sess_mp",
13130                                                 MAX_NB_SESSIONS, 0, 0, 0,
13131                                                 SOCKET_ID_ANY);
13132                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
13133                                         "session mempool allocation failed");
13134                 }
13135
13136                 /*
13137                  * Create mempool with maximum number of sessions,
13138                  * to include device specific session private data
13139                  */
13140                 if (ts_params->session_priv_mpool == NULL) {
13141                         ts_params->session_priv_mpool = rte_mempool_create(
13142                                         "test_sess_mp_priv",
13143                                         MAX_NB_SESSIONS,
13144                                         session_size,
13145                                         0, 0, NULL, NULL, NULL,
13146                                         NULL, SOCKET_ID_ANY,
13147                                         0);
13148
13149                         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
13150                                         "session mempool allocation failed");
13151                 }
13152
13153                 ts_params->qp_conf.mp_session = ts_params->session_mpool;
13154                 ts_params->qp_conf.mp_session_private =
13155                                 ts_params->session_priv_mpool;
13156
13157                 ret = rte_cryptodev_scheduler_worker_attach(sched_id,
13158                                 (uint8_t)i);
13159
13160                 TEST_ASSERT(ret == 0,
13161                         "Failed to attach device %u of pmd : %s", i,
13162                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13163
13164                 aesni_ids[nb_devs_attached] = (uint8_t)i;
13165
13166                 nb_devs_attached++;
13167         }
13168
13169         return 0;
13170 }
13171
13172 static int
13173 test_scheduler_detach_slave_op(void)
13174 {
13175         struct crypto_testsuite_params *ts_params = &testsuite_params;
13176         uint8_t sched_id = ts_params->valid_devs[0];
13177         uint32_t i;
13178         int ret;
13179
13180         for (i = 0; i < 2; i++) {
13181                 ret = rte_cryptodev_scheduler_worker_detach(sched_id,
13182                                 aesni_ids[i]);
13183                 TEST_ASSERT(ret == 0,
13184                         "Failed to detach device %u", aesni_ids[i]);
13185         }
13186
13187         return 0;
13188 }
13189
13190 static int
13191 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
13192 {
13193         struct crypto_testsuite_params *ts_params = &testsuite_params;
13194         uint8_t sched_id = ts_params->valid_devs[0];
13195         /* set mode */
13196         return rte_cryptodev_scheduler_mode_set(sched_id,
13197                 scheduler_mode);
13198 }
13199
13200 static int
13201 test_scheduler_mode_roundrobin_op(void)
13202 {
13203         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
13204                         0, "Failed to set roundrobin mode");
13205         return 0;
13206
13207 }
13208
13209 static int
13210 test_scheduler_mode_multicore_op(void)
13211 {
13212         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
13213                         0, "Failed to set multicore mode");
13214
13215         return 0;
13216 }
13217
13218 static int
13219 test_scheduler_mode_failover_op(void)
13220 {
13221         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
13222                         0, "Failed to set failover mode");
13223
13224         return 0;
13225 }
13226
13227 static int
13228 test_scheduler_mode_pkt_size_distr_op(void)
13229 {
13230         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
13231                         0, "Failed to set pktsize mode");
13232
13233         return 0;
13234 }
13235
13236 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
13237         .suite_name = "Crypto Device Scheduler Unit Test Suite",
13238         .setup = testsuite_setup,
13239         .teardown = testsuite_teardown,
13240         .unit_test_cases = {
13241                 /* Multi Core */
13242                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13243                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),
13244                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13245                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13246                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13247                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13248
13249                 /* Round Robin */
13250                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13251                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),
13252                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13253                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13254                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13255                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13256
13257                 /* Fail over */
13258                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13259                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),
13260                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13261                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13262                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13263                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13264
13265                 /* PKT SIZE */
13266                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13267                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),
13268                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13269                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13270                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13271                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13272
13273                 TEST_CASES_END() /**< NULL terminate unit test array */
13274         }
13275 };
13276
13277 #endif /* RTE_CRYPTO_SCHEDULER */
13278
13279 static struct unit_test_suite cryptodev_testsuite  = {
13280         .suite_name = "Crypto Unit Test Suite",
13281         .setup = testsuite_setup,
13282         .teardown = testsuite_teardown,
13283         .unit_test_cases = {
13284                 TEST_CASE_ST(ut_setup, ut_teardown,
13285                                 test_device_configure_invalid_dev_id),
13286                 TEST_CASE_ST(ut_setup, ut_teardown,
13287                                 test_queue_pair_descriptor_setup),
13288                 TEST_CASE_ST(ut_setup, ut_teardown,
13289                                 test_device_configure_invalid_queue_pair_ids),
13290                 TEST_CASE_ST(ut_setup, ut_teardown,
13291                                 test_multi_session),
13292                 TEST_CASE_ST(ut_setup, ut_teardown,
13293                                 test_multi_session_random_usage),
13294
13295                 TEST_CASE_ST(ut_setup, ut_teardown,
13296                         test_null_invalid_operation),
13297                 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
13298                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13299                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13300                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13301                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13302                 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all),
13303                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all),
13304                 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all),
13305                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13306                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
13307
13308                 /** AES CCM Authenticated Encryption 128 bits key */
13309                 TEST_CASE_ST(ut_setup, ut_teardown,
13310                         test_AES_CCM_authenticated_encryption_test_case_128_1),
13311                 TEST_CASE_ST(ut_setup, ut_teardown,
13312                         test_AES_CCM_authenticated_encryption_test_case_128_2),
13313                 TEST_CASE_ST(ut_setup, ut_teardown,
13314                         test_AES_CCM_authenticated_encryption_test_case_128_3),
13315
13316                 /** AES CCM Authenticated Decryption 128 bits key*/
13317                 TEST_CASE_ST(ut_setup, ut_teardown,
13318                         test_AES_CCM_authenticated_decryption_test_case_128_1),
13319                 TEST_CASE_ST(ut_setup, ut_teardown,
13320                         test_AES_CCM_authenticated_decryption_test_case_128_2),
13321                 TEST_CASE_ST(ut_setup, ut_teardown,
13322                         test_AES_CCM_authenticated_decryption_test_case_128_3),
13323
13324                 /** AES CCM Authenticated Encryption 192 bits key */
13325                 TEST_CASE_ST(ut_setup, ut_teardown,
13326                         test_AES_CCM_authenticated_encryption_test_case_192_1),
13327                 TEST_CASE_ST(ut_setup, ut_teardown,
13328                         test_AES_CCM_authenticated_encryption_test_case_192_2),
13329                 TEST_CASE_ST(ut_setup, ut_teardown,
13330                         test_AES_CCM_authenticated_encryption_test_case_192_3),
13331
13332                 /** AES CCM Authenticated Decryption 192 bits key*/
13333                 TEST_CASE_ST(ut_setup, ut_teardown,
13334                         test_AES_CCM_authenticated_decryption_test_case_192_1),
13335                 TEST_CASE_ST(ut_setup, ut_teardown,
13336                         test_AES_CCM_authenticated_decryption_test_case_192_2),
13337                 TEST_CASE_ST(ut_setup, ut_teardown,
13338                         test_AES_CCM_authenticated_decryption_test_case_192_3),
13339
13340                 /** AES CCM Authenticated Encryption 256 bits key */
13341                 TEST_CASE_ST(ut_setup, ut_teardown,
13342                         test_AES_CCM_authenticated_encryption_test_case_256_1),
13343                 TEST_CASE_ST(ut_setup, ut_teardown,
13344                         test_AES_CCM_authenticated_encryption_test_case_256_2),
13345                 TEST_CASE_ST(ut_setup, ut_teardown,
13346                         test_AES_CCM_authenticated_encryption_test_case_256_3),
13347
13348                 /** AES CCM Authenticated Decryption 256 bits key*/
13349                 TEST_CASE_ST(ut_setup, ut_teardown,
13350                         test_AES_CCM_authenticated_decryption_test_case_256_1),
13351                 TEST_CASE_ST(ut_setup, ut_teardown,
13352                         test_AES_CCM_authenticated_decryption_test_case_256_2),
13353                 TEST_CASE_ST(ut_setup, ut_teardown,
13354                         test_AES_CCM_authenticated_decryption_test_case_256_3),
13355
13356                 /** AES GCM Authenticated Encryption */
13357                 TEST_CASE_ST(ut_setup, ut_teardown,
13358                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
13359                 TEST_CASE_ST(ut_setup, ut_teardown,
13360                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
13361                 TEST_CASE_ST(ut_setup, ut_teardown,
13362                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
13363                 TEST_CASE_ST(ut_setup, ut_teardown,
13364                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
13365                 TEST_CASE_ST(ut_setup, ut_teardown,
13366                         test_AES_GCM_authenticated_encryption_test_case_1),
13367                 TEST_CASE_ST(ut_setup, ut_teardown,
13368                         test_AES_GCM_authenticated_encryption_test_case_2),
13369                 TEST_CASE_ST(ut_setup, ut_teardown,
13370                         test_AES_GCM_authenticated_encryption_test_case_3),
13371                 TEST_CASE_ST(ut_setup, ut_teardown,
13372                         test_AES_GCM_authenticated_encryption_test_case_4),
13373                 TEST_CASE_ST(ut_setup, ut_teardown,
13374                         test_AES_GCM_authenticated_encryption_test_case_5),
13375                 TEST_CASE_ST(ut_setup, ut_teardown,
13376                         test_AES_GCM_authenticated_encryption_test_case_6),
13377                 TEST_CASE_ST(ut_setup, ut_teardown,
13378                         test_AES_GCM_authenticated_encryption_test_case_7),
13379                 TEST_CASE_ST(ut_setup, ut_teardown,
13380                         test_AES_GCM_authenticated_encryption_test_case_8),
13381                 TEST_CASE_ST(ut_setup, ut_teardown,
13382                         test_AES_GCM_J0_authenticated_encryption_test_case_1),
13383
13384                 /** AES GCM Authenticated Decryption */
13385                 TEST_CASE_ST(ut_setup, ut_teardown,
13386                         test_AES_GCM_authenticated_decryption_test_case_1),
13387                 TEST_CASE_ST(ut_setup, ut_teardown,
13388                         test_AES_GCM_authenticated_decryption_test_case_2),
13389                 TEST_CASE_ST(ut_setup, ut_teardown,
13390                         test_AES_GCM_authenticated_decryption_test_case_3),
13391                 TEST_CASE_ST(ut_setup, ut_teardown,
13392                         test_AES_GCM_authenticated_decryption_test_case_4),
13393                 TEST_CASE_ST(ut_setup, ut_teardown,
13394                         test_AES_GCM_authenticated_decryption_test_case_5),
13395                 TEST_CASE_ST(ut_setup, ut_teardown,
13396                         test_AES_GCM_authenticated_decryption_test_case_6),
13397                 TEST_CASE_ST(ut_setup, ut_teardown,
13398                         test_AES_GCM_authenticated_decryption_test_case_7),
13399                 TEST_CASE_ST(ut_setup, ut_teardown,
13400                         test_AES_GCM_authenticated_decryption_test_case_8),
13401                 TEST_CASE_ST(ut_setup, ut_teardown,
13402                         test_AES_GCM_J0_authenticated_decryption_test_case_1),
13403
13404                 /** AES GCM Authenticated Encryption 192 bits key */
13405                 TEST_CASE_ST(ut_setup, ut_teardown,
13406                         test_AES_GCM_auth_encryption_test_case_192_1),
13407                 TEST_CASE_ST(ut_setup, ut_teardown,
13408                         test_AES_GCM_auth_encryption_test_case_192_2),
13409                 TEST_CASE_ST(ut_setup, ut_teardown,
13410                         test_AES_GCM_auth_encryption_test_case_192_3),
13411                 TEST_CASE_ST(ut_setup, ut_teardown,
13412                         test_AES_GCM_auth_encryption_test_case_192_4),
13413                 TEST_CASE_ST(ut_setup, ut_teardown,
13414                         test_AES_GCM_auth_encryption_test_case_192_5),
13415                 TEST_CASE_ST(ut_setup, ut_teardown,
13416                         test_AES_GCM_auth_encryption_test_case_192_6),
13417                 TEST_CASE_ST(ut_setup, ut_teardown,
13418                         test_AES_GCM_auth_encryption_test_case_192_7),
13419
13420                 /** AES GCM Authenticated Decryption 192 bits key */
13421                 TEST_CASE_ST(ut_setup, ut_teardown,
13422                         test_AES_GCM_auth_decryption_test_case_192_1),
13423                 TEST_CASE_ST(ut_setup, ut_teardown,
13424                         test_AES_GCM_auth_decryption_test_case_192_2),
13425                 TEST_CASE_ST(ut_setup, ut_teardown,
13426                         test_AES_GCM_auth_decryption_test_case_192_3),
13427                 TEST_CASE_ST(ut_setup, ut_teardown,
13428                         test_AES_GCM_auth_decryption_test_case_192_4),
13429                 TEST_CASE_ST(ut_setup, ut_teardown,
13430                         test_AES_GCM_auth_decryption_test_case_192_5),
13431                 TEST_CASE_ST(ut_setup, ut_teardown,
13432                         test_AES_GCM_auth_decryption_test_case_192_6),
13433                 TEST_CASE_ST(ut_setup, ut_teardown,
13434                         test_AES_GCM_auth_decryption_test_case_192_7),
13435
13436                 /** AES GCM Authenticated Encryption 256 bits key */
13437                 TEST_CASE_ST(ut_setup, ut_teardown,
13438                         test_AES_GCM_auth_encryption_test_case_256_1),
13439                 TEST_CASE_ST(ut_setup, ut_teardown,
13440                         test_AES_GCM_auth_encryption_test_case_256_2),
13441                 TEST_CASE_ST(ut_setup, ut_teardown,
13442                         test_AES_GCM_auth_encryption_test_case_256_3),
13443                 TEST_CASE_ST(ut_setup, ut_teardown,
13444                         test_AES_GCM_auth_encryption_test_case_256_4),
13445                 TEST_CASE_ST(ut_setup, ut_teardown,
13446                         test_AES_GCM_auth_encryption_test_case_256_5),
13447                 TEST_CASE_ST(ut_setup, ut_teardown,
13448                         test_AES_GCM_auth_encryption_test_case_256_6),
13449                 TEST_CASE_ST(ut_setup, ut_teardown,
13450                         test_AES_GCM_auth_encryption_test_case_256_7),
13451
13452                 /** AES GCM Authenticated Decryption 256 bits key */
13453                 TEST_CASE_ST(ut_setup, ut_teardown,
13454                         test_AES_GCM_auth_decryption_test_case_256_1),
13455                 TEST_CASE_ST(ut_setup, ut_teardown,
13456                         test_AES_GCM_auth_decryption_test_case_256_2),
13457                 TEST_CASE_ST(ut_setup, ut_teardown,
13458                         test_AES_GCM_auth_decryption_test_case_256_3),
13459                 TEST_CASE_ST(ut_setup, ut_teardown,
13460                         test_AES_GCM_auth_decryption_test_case_256_4),
13461                 TEST_CASE_ST(ut_setup, ut_teardown,
13462                         test_AES_GCM_auth_decryption_test_case_256_5),
13463                 TEST_CASE_ST(ut_setup, ut_teardown,
13464                         test_AES_GCM_auth_decryption_test_case_256_6),
13465                 TEST_CASE_ST(ut_setup, ut_teardown,
13466                         test_AES_GCM_auth_decryption_test_case_256_7),
13467
13468                 /** AES GCM Authenticated Encryption big aad size */
13469                 TEST_CASE_ST(ut_setup, ut_teardown,
13470                         test_AES_GCM_auth_encryption_test_case_aad_1),
13471                 TEST_CASE_ST(ut_setup, ut_teardown,
13472                         test_AES_GCM_auth_encryption_test_case_aad_2),
13473
13474                 /** AES GCM Authenticated Decryption big aad size */
13475                 TEST_CASE_ST(ut_setup, ut_teardown,
13476                         test_AES_GCM_auth_decryption_test_case_aad_1),
13477                 TEST_CASE_ST(ut_setup, ut_teardown,
13478                         test_AES_GCM_auth_decryption_test_case_aad_2),
13479
13480                 /** Out of place tests */
13481                 TEST_CASE_ST(ut_setup, ut_teardown,
13482                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
13483                 TEST_CASE_ST(ut_setup, ut_teardown,
13484                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
13485
13486                 /** Session-less tests */
13487                 TEST_CASE_ST(ut_setup, ut_teardown,
13488                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
13489                 TEST_CASE_ST(ut_setup, ut_teardown,
13490                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
13491
13492                 /** AES GMAC Authentication */
13493                 TEST_CASE_ST(ut_setup, ut_teardown,
13494                         test_AES_GMAC_authentication_test_case_1),
13495                 TEST_CASE_ST(ut_setup, ut_teardown,
13496                         test_AES_GMAC_authentication_verify_test_case_1),
13497                 TEST_CASE_ST(ut_setup, ut_teardown,
13498                         test_AES_GMAC_authentication_test_case_2),
13499                 TEST_CASE_ST(ut_setup, ut_teardown,
13500                         test_AES_GMAC_authentication_verify_test_case_2),
13501                 TEST_CASE_ST(ut_setup, ut_teardown,
13502                         test_AES_GMAC_authentication_test_case_3),
13503                 TEST_CASE_ST(ut_setup, ut_teardown,
13504                         test_AES_GMAC_authentication_verify_test_case_3),
13505                 TEST_CASE_ST(ut_setup, ut_teardown,
13506                         test_AES_GMAC_authentication_test_case_4),
13507                 TEST_CASE_ST(ut_setup, ut_teardown,
13508                         test_AES_GMAC_authentication_verify_test_case_4),
13509                 TEST_CASE_ST(ut_setup, ut_teardown,
13510                         test_AES_GMAC_authentication_SGL_40B),
13511                 TEST_CASE_ST(ut_setup, ut_teardown,
13512                         test_AES_GMAC_authentication_SGL_80B),
13513                 TEST_CASE_ST(ut_setup, ut_teardown,
13514                         test_AES_GMAC_authentication_SGL_2048B),
13515                 TEST_CASE_ST(ut_setup, ut_teardown,
13516                         test_AES_GMAC_authentication_SGL_2047B),
13517
13518                 /** Chacha20-Poly1305 */
13519                 TEST_CASE_ST(ut_setup, ut_teardown,
13520                         test_chacha20_poly1305_encrypt_test_case_rfc8439),
13521                 TEST_CASE_ST(ut_setup, ut_teardown,
13522                         test_chacha20_poly1305_decrypt_test_case_rfc8439),
13523                 /** SNOW 3G encrypt only (UEA2) */
13524                 TEST_CASE_ST(ut_setup, ut_teardown,
13525                         test_snow3g_encryption_test_case_1),
13526                 TEST_CASE_ST(ut_setup, ut_teardown,
13527                         test_snow3g_encryption_test_case_2),
13528                 TEST_CASE_ST(ut_setup, ut_teardown,
13529                         test_snow3g_encryption_test_case_3),
13530                 TEST_CASE_ST(ut_setup, ut_teardown,
13531                         test_snow3g_encryption_test_case_4),
13532                 TEST_CASE_ST(ut_setup, ut_teardown,
13533                         test_snow3g_encryption_test_case_5),
13534
13535                 TEST_CASE_ST(ut_setup, ut_teardown,
13536                         test_snow3g_encryption_test_case_1_oop),
13537                 TEST_CASE_ST(ut_setup, ut_teardown,
13538                         test_snow3g_encryption_test_case_1_oop_sgl),
13539                 TEST_CASE_ST(ut_setup, ut_teardown,
13540                         test_snow3g_encryption_test_case_1_offset_oop),
13541                 TEST_CASE_ST(ut_setup, ut_teardown,
13542                         test_snow3g_decryption_test_case_1_oop),
13543
13544                 /** SNOW 3G generate auth, then encrypt (UEA2) */
13545                 TEST_CASE_ST(ut_setup, ut_teardown,
13546                         test_snow3g_auth_cipher_test_case_1),
13547                 TEST_CASE_ST(ut_setup, ut_teardown,
13548                         test_snow3g_auth_cipher_test_case_2),
13549                 TEST_CASE_ST(ut_setup, ut_teardown,
13550                         test_snow3g_auth_cipher_test_case_2_oop),
13551                 TEST_CASE_ST(ut_setup, ut_teardown,
13552                         test_snow3g_auth_cipher_part_digest_enc),
13553                 TEST_CASE_ST(ut_setup, ut_teardown,
13554                         test_snow3g_auth_cipher_part_digest_enc_oop),
13555                 TEST_CASE_ST(ut_setup, ut_teardown,
13556                         test_snow3g_auth_cipher_test_case_3_sgl),
13557                 TEST_CASE_ST(ut_setup, ut_teardown,
13558                         test_snow3g_auth_cipher_test_case_3_oop_sgl),
13559                 TEST_CASE_ST(ut_setup, ut_teardown,
13560                         test_snow3g_auth_cipher_part_digest_enc_sgl),
13561                 TEST_CASE_ST(ut_setup, ut_teardown,
13562                         test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
13563
13564                 /** SNOW 3G decrypt (UEA2), then verify auth */
13565                 TEST_CASE_ST(ut_setup, ut_teardown,
13566                         test_snow3g_auth_cipher_verify_test_case_1),
13567                 TEST_CASE_ST(ut_setup, ut_teardown,
13568                         test_snow3g_auth_cipher_verify_test_case_2),
13569                 TEST_CASE_ST(ut_setup, ut_teardown,
13570                         test_snow3g_auth_cipher_verify_test_case_2_oop),
13571                 TEST_CASE_ST(ut_setup, ut_teardown,
13572                         test_snow3g_auth_cipher_verify_part_digest_enc),
13573                 TEST_CASE_ST(ut_setup, ut_teardown,
13574                         test_snow3g_auth_cipher_verify_part_digest_enc_oop),
13575                 TEST_CASE_ST(ut_setup, ut_teardown,
13576                         test_snow3g_auth_cipher_verify_test_case_3_sgl),
13577                 TEST_CASE_ST(ut_setup, ut_teardown,
13578                         test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
13579                 TEST_CASE_ST(ut_setup, ut_teardown,
13580                         test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
13581                 TEST_CASE_ST(ut_setup, ut_teardown,
13582                         test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
13583
13584                 /** SNOW 3G decrypt only (UEA2) */
13585                 TEST_CASE_ST(ut_setup, ut_teardown,
13586                         test_snow3g_decryption_test_case_1),
13587                 TEST_CASE_ST(ut_setup, ut_teardown,
13588                         test_snow3g_decryption_test_case_2),
13589                 TEST_CASE_ST(ut_setup, ut_teardown,
13590                         test_snow3g_decryption_test_case_3),
13591                 TEST_CASE_ST(ut_setup, ut_teardown,
13592                         test_snow3g_decryption_test_case_4),
13593                 TEST_CASE_ST(ut_setup, ut_teardown,
13594                         test_snow3g_decryption_test_case_5),
13595                 TEST_CASE_ST(ut_setup, ut_teardown,
13596                         test_snow3g_decryption_with_digest_test_case_1),
13597                 TEST_CASE_ST(ut_setup, ut_teardown,
13598                         test_snow3g_hash_generate_test_case_1),
13599                 TEST_CASE_ST(ut_setup, ut_teardown,
13600                         test_snow3g_hash_generate_test_case_2),
13601                 TEST_CASE_ST(ut_setup, ut_teardown,
13602                         test_snow3g_hash_generate_test_case_3),
13603                 /* Tests with buffers which length is not byte-aligned */
13604                 TEST_CASE_ST(ut_setup, ut_teardown,
13605                         test_snow3g_hash_generate_test_case_4),
13606                 TEST_CASE_ST(ut_setup, ut_teardown,
13607                         test_snow3g_hash_generate_test_case_5),
13608                 TEST_CASE_ST(ut_setup, ut_teardown,
13609                         test_snow3g_hash_generate_test_case_6),
13610                 TEST_CASE_ST(ut_setup, ut_teardown,
13611                         test_snow3g_hash_verify_test_case_1),
13612                 TEST_CASE_ST(ut_setup, ut_teardown,
13613                         test_snow3g_hash_verify_test_case_2),
13614                 TEST_CASE_ST(ut_setup, ut_teardown,
13615                         test_snow3g_hash_verify_test_case_3),
13616                 /* Tests with buffers which length is not byte-aligned */
13617                 TEST_CASE_ST(ut_setup, ut_teardown,
13618                         test_snow3g_hash_verify_test_case_4),
13619                 TEST_CASE_ST(ut_setup, ut_teardown,
13620                         test_snow3g_hash_verify_test_case_5),
13621                 TEST_CASE_ST(ut_setup, ut_teardown,
13622                         test_snow3g_hash_verify_test_case_6),
13623                 TEST_CASE_ST(ut_setup, ut_teardown,
13624                         test_snow3g_cipher_auth_test_case_1),
13625                 TEST_CASE_ST(ut_setup, ut_teardown,
13626                         test_snow3g_auth_cipher_with_digest_test_case_1),
13627
13628                 /** ZUC encrypt only (EEA3) */
13629                 TEST_CASE_ST(ut_setup, ut_teardown,
13630                         test_zuc_encryption_test_case_1),
13631                 TEST_CASE_ST(ut_setup, ut_teardown,
13632                         test_zuc_encryption_test_case_2),
13633                 TEST_CASE_ST(ut_setup, ut_teardown,
13634                         test_zuc_encryption_test_case_3),
13635                 TEST_CASE_ST(ut_setup, ut_teardown,
13636                         test_zuc_encryption_test_case_4),
13637                 TEST_CASE_ST(ut_setup, ut_teardown,
13638                         test_zuc_encryption_test_case_5),
13639                 TEST_CASE_ST(ut_setup, ut_teardown,
13640                         test_zuc_encryption_test_case_6_sgl),
13641
13642                 /** ZUC authenticate (EIA3) */
13643                 TEST_CASE_ST(ut_setup, ut_teardown,
13644                         test_zuc_hash_generate_test_case_1),
13645                 TEST_CASE_ST(ut_setup, ut_teardown,
13646                         test_zuc_hash_generate_test_case_2),
13647                 TEST_CASE_ST(ut_setup, ut_teardown,
13648                         test_zuc_hash_generate_test_case_3),
13649                 TEST_CASE_ST(ut_setup, ut_teardown,
13650                         test_zuc_hash_generate_test_case_4),
13651                 TEST_CASE_ST(ut_setup, ut_teardown,
13652                         test_zuc_hash_generate_test_case_5),
13653                 TEST_CASE_ST(ut_setup, ut_teardown,
13654                         test_zuc_hash_generate_test_case_6),
13655                 TEST_CASE_ST(ut_setup, ut_teardown,
13656                         test_zuc_hash_generate_test_case_7),
13657                 TEST_CASE_ST(ut_setup, ut_teardown,
13658                         test_zuc_hash_generate_test_case_8),
13659
13660                 /** ZUC alg-chain (EEA3/EIA3) */
13661                 TEST_CASE_ST(ut_setup, ut_teardown,
13662                         test_zuc_cipher_auth_test_case_1),
13663                 TEST_CASE_ST(ut_setup, ut_teardown,
13664                         test_zuc_cipher_auth_test_case_2),
13665
13666                 /** ZUC generate auth, then encrypt (EEA3) */
13667                 TEST_CASE_ST(ut_setup, ut_teardown,
13668                         test_zuc_auth_cipher_test_case_1),
13669                 TEST_CASE_ST(ut_setup, ut_teardown,
13670                         test_zuc_auth_cipher_test_case_1_oop),
13671                 TEST_CASE_ST(ut_setup, ut_teardown,
13672                         test_zuc_auth_cipher_test_case_1_sgl),
13673                 TEST_CASE_ST(ut_setup, ut_teardown,
13674                         test_zuc_auth_cipher_test_case_1_oop_sgl),
13675
13676                 /** ZUC decrypt (EEA3), then verify auth */
13677                 TEST_CASE_ST(ut_setup, ut_teardown,
13678                         test_zuc_auth_cipher_verify_test_case_1),
13679                 TEST_CASE_ST(ut_setup, ut_teardown,
13680                         test_zuc_auth_cipher_verify_test_case_1_oop),
13681                 TEST_CASE_ST(ut_setup, ut_teardown,
13682                         test_zuc_auth_cipher_verify_test_case_1_sgl),
13683                 TEST_CASE_ST(ut_setup, ut_teardown,
13684                         test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
13685
13686                 /** HMAC_MD5 Authentication */
13687                 TEST_CASE_ST(ut_setup, ut_teardown,
13688                         test_MD5_HMAC_generate_case_1),
13689                 TEST_CASE_ST(ut_setup, ut_teardown,
13690                         test_MD5_HMAC_verify_case_1),
13691                 TEST_CASE_ST(ut_setup, ut_teardown,
13692                         test_MD5_HMAC_generate_case_2),
13693                 TEST_CASE_ST(ut_setup, ut_teardown,
13694                         test_MD5_HMAC_verify_case_2),
13695
13696                 /** KASUMI hash only (UIA1) */
13697                 TEST_CASE_ST(ut_setup, ut_teardown,
13698                         test_kasumi_hash_generate_test_case_1),
13699                 TEST_CASE_ST(ut_setup, ut_teardown,
13700                         test_kasumi_hash_generate_test_case_2),
13701                 TEST_CASE_ST(ut_setup, ut_teardown,
13702                         test_kasumi_hash_generate_test_case_3),
13703                 TEST_CASE_ST(ut_setup, ut_teardown,
13704                         test_kasumi_hash_generate_test_case_4),
13705                 TEST_CASE_ST(ut_setup, ut_teardown,
13706                         test_kasumi_hash_generate_test_case_5),
13707                 TEST_CASE_ST(ut_setup, ut_teardown,
13708                         test_kasumi_hash_generate_test_case_6),
13709
13710                 TEST_CASE_ST(ut_setup, ut_teardown,
13711                         test_kasumi_hash_verify_test_case_1),
13712                 TEST_CASE_ST(ut_setup, ut_teardown,
13713                         test_kasumi_hash_verify_test_case_2),
13714                 TEST_CASE_ST(ut_setup, ut_teardown,
13715                         test_kasumi_hash_verify_test_case_3),
13716                 TEST_CASE_ST(ut_setup, ut_teardown,
13717                         test_kasumi_hash_verify_test_case_4),
13718                 TEST_CASE_ST(ut_setup, ut_teardown,
13719                         test_kasumi_hash_verify_test_case_5),
13720
13721                 /** KASUMI encrypt only (UEA1) */
13722                 TEST_CASE_ST(ut_setup, ut_teardown,
13723                         test_kasumi_encryption_test_case_1),
13724                 TEST_CASE_ST(ut_setup, ut_teardown,
13725                         test_kasumi_encryption_test_case_1_sgl),
13726                 TEST_CASE_ST(ut_setup, ut_teardown,
13727                         test_kasumi_encryption_test_case_1_oop),
13728                 TEST_CASE_ST(ut_setup, ut_teardown,
13729                         test_kasumi_encryption_test_case_1_oop_sgl),
13730                 TEST_CASE_ST(ut_setup, ut_teardown,
13731                         test_kasumi_encryption_test_case_2),
13732                 TEST_CASE_ST(ut_setup, ut_teardown,
13733                         test_kasumi_encryption_test_case_3),
13734                 TEST_CASE_ST(ut_setup, ut_teardown,
13735                         test_kasumi_encryption_test_case_4),
13736                 TEST_CASE_ST(ut_setup, ut_teardown,
13737                         test_kasumi_encryption_test_case_5),
13738
13739                 /** KASUMI decrypt only (UEA1) */
13740                 TEST_CASE_ST(ut_setup, ut_teardown,
13741                         test_kasumi_decryption_test_case_1),
13742                 TEST_CASE_ST(ut_setup, ut_teardown,
13743                         test_kasumi_decryption_test_case_2),
13744                 TEST_CASE_ST(ut_setup, ut_teardown,
13745                         test_kasumi_decryption_test_case_3),
13746                 TEST_CASE_ST(ut_setup, ut_teardown,
13747                         test_kasumi_decryption_test_case_4),
13748                 TEST_CASE_ST(ut_setup, ut_teardown,
13749                         test_kasumi_decryption_test_case_5),
13750                 TEST_CASE_ST(ut_setup, ut_teardown,
13751                         test_kasumi_decryption_test_case_1_oop),
13752
13753                 TEST_CASE_ST(ut_setup, ut_teardown,
13754                         test_kasumi_cipher_auth_test_case_1),
13755
13756                 /** KASUMI generate auth, then encrypt (F8) */
13757                 TEST_CASE_ST(ut_setup, ut_teardown,
13758                         test_kasumi_auth_cipher_test_case_1),
13759                 TEST_CASE_ST(ut_setup, ut_teardown,
13760                         test_kasumi_auth_cipher_test_case_2),
13761                 TEST_CASE_ST(ut_setup, ut_teardown,
13762                         test_kasumi_auth_cipher_test_case_2_oop),
13763                 TEST_CASE_ST(ut_setup, ut_teardown,
13764                         test_kasumi_auth_cipher_test_case_2_sgl),
13765                 TEST_CASE_ST(ut_setup, ut_teardown,
13766                         test_kasumi_auth_cipher_test_case_2_oop_sgl),
13767
13768                 /** KASUMI decrypt (F8), then verify auth */
13769                 TEST_CASE_ST(ut_setup, ut_teardown,
13770                         test_kasumi_auth_cipher_verify_test_case_1),
13771                 TEST_CASE_ST(ut_setup, ut_teardown,
13772                         test_kasumi_auth_cipher_verify_test_case_2),
13773                 TEST_CASE_ST(ut_setup, ut_teardown,
13774                         test_kasumi_auth_cipher_verify_test_case_2_oop),
13775                 TEST_CASE_ST(ut_setup, ut_teardown,
13776                         test_kasumi_auth_cipher_verify_test_case_2_sgl),
13777                 TEST_CASE_ST(ut_setup, ut_teardown,
13778                         test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
13779
13780                 /** ESN Testcase */
13781                 TEST_CASE_ST(ut_setup, ut_teardown,
13782                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
13783                 TEST_CASE_ST(ut_setup, ut_teardown,
13784                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
13785
13786                 /** Negative tests */
13787                 TEST_CASE_ST(ut_setup, ut_teardown,
13788                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13789                 TEST_CASE_ST(ut_setup, ut_teardown,
13790                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13791                 TEST_CASE_ST(ut_setup, ut_teardown,
13792                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
13793                 TEST_CASE_ST(ut_setup, ut_teardown,
13794                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
13795                 TEST_CASE_ST(ut_setup, ut_teardown,
13796                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
13797                 TEST_CASE_ST(ut_setup, ut_teardown,
13798                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
13799                 TEST_CASE_ST(ut_setup, ut_teardown,
13800                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
13801                 TEST_CASE_ST(ut_setup, ut_teardown,
13802                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
13803                 TEST_CASE_ST(ut_setup, ut_teardown,
13804                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
13805                 TEST_CASE_ST(ut_setup, ut_teardown,
13806                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
13807                 TEST_CASE_ST(ut_setup, ut_teardown,
13808                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
13809                 TEST_CASE_ST(ut_setup, ut_teardown,
13810                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
13811                 TEST_CASE_ST(ut_setup, ut_teardown,
13812                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
13813                 TEST_CASE_ST(ut_setup, ut_teardown,
13814                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
13815                 TEST_CASE_ST(ut_setup, ut_teardown,
13816                         authentication_verify_AES128_GMAC_fail_data_corrupt),
13817                 TEST_CASE_ST(ut_setup, ut_teardown,
13818                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
13819                 TEST_CASE_ST(ut_setup, ut_teardown,
13820                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13821                 TEST_CASE_ST(ut_setup, ut_teardown,
13822                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13823
13824                 /** Mixed CIPHER + HASH algorithms */
13825                 /** AUTH AES CMAC + CIPHER AES CTR */
13826                 TEST_CASE_ST(ut_setup, ut_teardown,
13827                         test_aes_cmac_aes_ctr_digest_enc_test_case_1),
13828                 TEST_CASE_ST(ut_setup, ut_teardown,
13829                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13830                 TEST_CASE_ST(ut_setup, ut_teardown,
13831                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13832                 TEST_CASE_ST(ut_setup, ut_teardown,
13833                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13834                 TEST_CASE_ST(ut_setup, ut_teardown,
13835                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
13836                 TEST_CASE_ST(ut_setup, ut_teardown,
13837                        test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13838                 TEST_CASE_ST(ut_setup, ut_teardown,
13839                        test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13840                 TEST_CASE_ST(ut_setup, ut_teardown,
13841                    test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13842
13843                 /** AUTH ZUC + CIPHER SNOW3G */
13844                 TEST_CASE_ST(ut_setup, ut_teardown,
13845                         test_auth_zuc_cipher_snow_test_case_1),
13846                 TEST_CASE_ST(ut_setup, ut_teardown,
13847                         test_verify_auth_zuc_cipher_snow_test_case_1),
13848                 /** AUTH AES CMAC + CIPHER SNOW3G */
13849                 TEST_CASE_ST(ut_setup, ut_teardown,
13850                         test_auth_aes_cmac_cipher_snow_test_case_1),
13851                 TEST_CASE_ST(ut_setup, ut_teardown,
13852                         test_verify_auth_aes_cmac_cipher_snow_test_case_1),
13853                 /** AUTH ZUC + CIPHER AES CTR */
13854                 TEST_CASE_ST(ut_setup, ut_teardown,
13855                         test_auth_zuc_cipher_aes_ctr_test_case_1),
13856                 TEST_CASE_ST(ut_setup, ut_teardown,
13857                         test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
13858                 /** AUTH SNOW3G + CIPHER AES CTR */
13859                 TEST_CASE_ST(ut_setup, ut_teardown,
13860                         test_auth_snow_cipher_aes_ctr_test_case_1),
13861                 TEST_CASE_ST(ut_setup, ut_teardown,
13862                         test_verify_auth_snow_cipher_aes_ctr_test_case_1),
13863                 /** AUTH SNOW3G + CIPHER ZUC */
13864                 TEST_CASE_ST(ut_setup, ut_teardown,
13865                         test_auth_snow_cipher_zuc_test_case_1),
13866                 TEST_CASE_ST(ut_setup, ut_teardown,
13867                         test_verify_auth_snow_cipher_zuc_test_case_1),
13868                 /** AUTH AES CMAC + CIPHER ZUC */
13869                 TEST_CASE_ST(ut_setup, ut_teardown,
13870                         test_auth_aes_cmac_cipher_zuc_test_case_1),
13871                 TEST_CASE_ST(ut_setup, ut_teardown,
13872                         test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
13873
13874                 /** AUTH NULL + CIPHER SNOW3G */
13875                 TEST_CASE_ST(ut_setup, ut_teardown,
13876                         test_auth_null_cipher_snow_test_case_1),
13877                 TEST_CASE_ST(ut_setup, ut_teardown,
13878                         test_verify_auth_null_cipher_snow_test_case_1),
13879                 /** AUTH NULL + CIPHER ZUC */
13880                 TEST_CASE_ST(ut_setup, ut_teardown,
13881                         test_auth_null_cipher_zuc_test_case_1),
13882                 TEST_CASE_ST(ut_setup, ut_teardown,
13883                         test_verify_auth_null_cipher_zuc_test_case_1),
13884                 /** AUTH SNOW3G + CIPHER NULL */
13885                 TEST_CASE_ST(ut_setup, ut_teardown,
13886                         test_auth_snow_cipher_null_test_case_1),
13887                 TEST_CASE_ST(ut_setup, ut_teardown,
13888                         test_verify_auth_snow_cipher_null_test_case_1),
13889                 /** AUTH ZUC + CIPHER NULL */
13890                 TEST_CASE_ST(ut_setup, ut_teardown,
13891                         test_auth_zuc_cipher_null_test_case_1),
13892                 TEST_CASE_ST(ut_setup, ut_teardown,
13893                         test_verify_auth_zuc_cipher_null_test_case_1),
13894                 /** AUTH NULL + CIPHER AES CTR */
13895                 TEST_CASE_ST(ut_setup, ut_teardown,
13896                         test_auth_null_cipher_aes_ctr_test_case_1),
13897                 TEST_CASE_ST(ut_setup, ut_teardown,
13898                         test_verify_auth_null_cipher_aes_ctr_test_case_1),
13899                 /** AUTH AES CMAC + CIPHER NULL */
13900                 TEST_CASE_ST(ut_setup, ut_teardown,
13901                         test_auth_aes_cmac_cipher_null_test_case_1),
13902                 TEST_CASE_ST(ut_setup, ut_teardown,
13903                         test_verify_auth_aes_cmac_cipher_null_test_case_1),
13904
13905 #ifdef RTE_LIB_SECURITY
13906                 TEST_CASE_ST(ut_setup_security, ut_teardown,
13907                         test_PDCP_PROTO_all),
13908                 TEST_CASE_ST(ut_setup_security, ut_teardown,
13909                         test_DOCSIS_PROTO_all),
13910 #endif
13911                 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
13912                 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
13913                 TEST_CASES_END() /**< NULL terminate unit test array */
13914         }
13915 };
13916
13917 static struct unit_test_suite cryptodev_virtio_testsuite = {
13918         .suite_name = "Crypto VIRTIO Unit Test Suite",
13919         .setup = testsuite_setup,
13920         .teardown = testsuite_teardown,
13921         .unit_test_cases = {
13922                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13923
13924                 TEST_CASES_END() /**< NULL terminate unit test array */
13925         }
13926 };
13927
13928 static struct unit_test_suite cryptodev_caam_jr_testsuite  = {
13929         .suite_name = "Crypto CAAM JR Unit Test Suite",
13930         .setup = testsuite_setup,
13931         .teardown = testsuite_teardown,
13932         .unit_test_cases = {
13933                 TEST_CASE_ST(ut_setup, ut_teardown,
13934                              test_device_configure_invalid_dev_id),
13935                 TEST_CASE_ST(ut_setup, ut_teardown,
13936                              test_multi_session),
13937
13938                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13939                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13940                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13941                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13942                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13943
13944                 TEST_CASES_END() /**< NULL terminate unit test array */
13945         }
13946 };
13947
13948 static struct unit_test_suite cryptodev_mrvl_testsuite  = {
13949         .suite_name = "Crypto Device Marvell Component Test Suite",
13950         .setup = testsuite_setup,
13951         .teardown = testsuite_teardown,
13952         .unit_test_cases = {
13953                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13954                 TEST_CASE_ST(ut_setup, ut_teardown,
13955                                 test_multi_session_random_usage),
13956                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13957                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13958                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13959                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13960                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13961
13962                 /** Negative tests */
13963                 TEST_CASE_ST(ut_setup, ut_teardown,
13964                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13965                 TEST_CASE_ST(ut_setup, ut_teardown,
13966                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13967                 TEST_CASE_ST(ut_setup, ut_teardown,
13968                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13969                 TEST_CASE_ST(ut_setup, ut_teardown,
13970                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13971
13972                 TEST_CASES_END() /**< NULL terminate unit test array */
13973         }
13974 };
13975
13976 static struct unit_test_suite cryptodev_ccp_testsuite  = {
13977         .suite_name = "Crypto Device CCP Unit Test Suite",
13978         .setup = testsuite_setup,
13979         .teardown = testsuite_teardown,
13980         .unit_test_cases = {
13981                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13982                 TEST_CASE_ST(ut_setup, ut_teardown,
13983                                 test_multi_session_random_usage),
13984                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13985                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13986                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13987                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13988                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13989
13990                 /** Negative tests */
13991                 TEST_CASE_ST(ut_setup, ut_teardown,
13992                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13993                 TEST_CASE_ST(ut_setup, ut_teardown,
13994                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13995                 TEST_CASE_ST(ut_setup, ut_teardown,
13996                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13997                 TEST_CASE_ST(ut_setup, ut_teardown,
13998                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13999
14000                 TEST_CASES_END() /**< NULL terminate unit test array */
14001         }
14002 };
14003
14004 static int
14005 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
14006 {
14007         gbl_driver_id = rte_cryptodev_driver_id_get(
14008                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14009
14010         if (gbl_driver_id == -1) {
14011                 RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14012                 return TEST_SKIPPED;
14013         }
14014
14015         return unit_test_suite_runner(&cryptodev_testsuite);
14016 }
14017
14018 static int
14019 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)
14020 {
14021         gbl_driver_id = rte_cryptodev_driver_id_get(
14022                         RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
14023
14024         if (gbl_driver_id == -1) {
14025                 RTE_LOG(ERR, USER1, "VIRTIO PMD must be loaded.\n");
14026                 return TEST_FAILED;
14027         }
14028
14029         return unit_test_suite_runner(&cryptodev_virtio_testsuite);
14030 }
14031
14032 static int
14033 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
14034 {
14035         gbl_driver_id = rte_cryptodev_driver_id_get(
14036                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14037
14038         if (gbl_driver_id == -1) {
14039                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14040                 return TEST_SKIPPED;
14041         }
14042
14043         return unit_test_suite_runner(&cryptodev_testsuite);
14044 }
14045
14046 static int
14047 test_cryptodev_cpu_aesni_mb(void)
14048 {
14049         int32_t rc;
14050         enum rte_security_session_action_type at;
14051
14052         gbl_driver_id = rte_cryptodev_driver_id_get(
14053                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14054
14055         if (gbl_driver_id == -1) {
14056                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14057                 return TEST_SKIPPED;
14058         }
14059
14060         at = gbl_action_type;
14061         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14062         rc = unit_test_suite_runner(&cryptodev_testsuite);
14063         gbl_action_type = at;
14064         return rc;
14065 }
14066
14067 static int
14068 test_cryptodev_openssl(void)
14069 {
14070         gbl_driver_id = rte_cryptodev_driver_id_get(
14071                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
14072
14073         if (gbl_driver_id == -1) {
14074                 RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded.\n");
14075                 return TEST_SKIPPED;
14076         }
14077
14078         return unit_test_suite_runner(&cryptodev_testsuite);
14079 }
14080
14081 static int
14082 test_cryptodev_aesni_gcm(void)
14083 {
14084         gbl_driver_id = rte_cryptodev_driver_id_get(
14085                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14086
14087         if (gbl_driver_id == -1) {
14088                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
14089                 return TEST_SKIPPED;
14090         }
14091
14092         return unit_test_suite_runner(&cryptodev_testsuite);
14093 }
14094
14095 static int
14096 test_cryptodev_cpu_aesni_gcm(void)
14097 {
14098         int32_t rc;
14099         enum rte_security_session_action_type at;
14100
14101         gbl_driver_id = rte_cryptodev_driver_id_get(
14102                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14103
14104         if (gbl_driver_id == -1) {
14105                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
14106                 return TEST_SKIPPED;
14107         }
14108
14109         at = gbl_action_type;
14110         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14111         rc = unit_test_suite_runner(&cryptodev_testsuite);
14112         gbl_action_type = at;
14113         return rc;
14114 }
14115
14116 static int
14117 test_cryptodev_null(void)
14118 {
14119         gbl_driver_id = rte_cryptodev_driver_id_get(
14120                         RTE_STR(CRYPTODEV_NAME_NULL_PMD));
14121
14122         if (gbl_driver_id == -1) {
14123                 RTE_LOG(ERR, USER1, "NULL PMD must be loaded.\n");
14124                 return TEST_SKIPPED;
14125         }
14126
14127         return unit_test_suite_runner(&cryptodev_testsuite);
14128 }
14129
14130 static int
14131 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
14132 {
14133         gbl_driver_id = rte_cryptodev_driver_id_get(
14134                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
14135
14136         if (gbl_driver_id == -1) {
14137                 RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded.\n");
14138                 return TEST_SKIPPED;
14139         }
14140
14141         return unit_test_suite_runner(&cryptodev_testsuite);
14142 }
14143
14144 static int
14145 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
14146 {
14147         gbl_driver_id = rte_cryptodev_driver_id_get(
14148                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
14149
14150         if (gbl_driver_id == -1) {
14151                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
14152                 return TEST_SKIPPED;
14153         }
14154
14155         return unit_test_suite_runner(&cryptodev_testsuite);
14156 }
14157
14158 static int
14159 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
14160 {
14161         gbl_driver_id = rte_cryptodev_driver_id_get(
14162                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
14163
14164         if (gbl_driver_id == -1) {
14165                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
14166                 return TEST_SKIPPED;
14167         }
14168
14169         return unit_test_suite_runner(&cryptodev_testsuite);
14170 }
14171
14172 static int
14173 test_cryptodev_armv8(void)
14174 {
14175         gbl_driver_id = rte_cryptodev_driver_id_get(
14176                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
14177
14178         if (gbl_driver_id == -1) {
14179                 RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded.\n");
14180                 return TEST_SKIPPED;
14181         }
14182
14183         return unit_test_suite_runner(&cryptodev_testsuite);
14184 }
14185
14186 static int
14187 test_cryptodev_mrvl(void)
14188 {
14189         gbl_driver_id = rte_cryptodev_driver_id_get(
14190                         RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
14191
14192         if (gbl_driver_id == -1) {
14193                 RTE_LOG(ERR, USER1, "MVSAM PMD must be loaded.\n");
14194                 return TEST_SKIPPED;
14195         }
14196
14197         return unit_test_suite_runner(&cryptodev_mrvl_testsuite);
14198 }
14199
14200 #ifdef RTE_CRYPTO_SCHEDULER
14201
14202 static int
14203 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
14204 {
14205         gbl_driver_id = rte_cryptodev_driver_id_get(
14206                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14207
14208         if (gbl_driver_id == -1) {
14209                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
14210                 return TEST_SKIPPED;
14211         }
14212
14213         if (rte_cryptodev_driver_id_get(
14214                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
14215                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14216                 return TEST_SKIPPED;
14217 }
14218         return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
14219 }
14220
14221 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
14222
14223 #endif
14224
14225 static int
14226 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14227 {
14228         gbl_driver_id = rte_cryptodev_driver_id_get(
14229                         RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
14230
14231         if (gbl_driver_id == -1) {
14232                 RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded.\n");
14233                 return TEST_SKIPPED;
14234         }
14235
14236         return unit_test_suite_runner(&cryptodev_testsuite);
14237 }
14238
14239 static int
14240 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14241 {
14242         gbl_driver_id = rte_cryptodev_driver_id_get(
14243                         RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
14244
14245         if (gbl_driver_id == -1) {
14246                 RTE_LOG(ERR, USER1, "DPAA SEC PMD must be loaded.\n");
14247                 return TEST_SKIPPED;
14248         }
14249
14250         return unit_test_suite_runner(&cryptodev_testsuite);
14251 }
14252
14253 static int
14254 test_cryptodev_ccp(void)
14255 {
14256         gbl_driver_id = rte_cryptodev_driver_id_get(
14257                         RTE_STR(CRYPTODEV_NAME_CCP_PMD));
14258
14259         if (gbl_driver_id == -1) {
14260                 RTE_LOG(ERR, USER1, "CCP PMD must be loaded.\n");
14261                 return TEST_FAILED;
14262         }
14263
14264         return unit_test_suite_runner(&cryptodev_ccp_testsuite);
14265 }
14266
14267 static int
14268 test_cryptodev_octeontx(void)
14269 {
14270         gbl_driver_id = rte_cryptodev_driver_id_get(
14271                         RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
14272         if (gbl_driver_id == -1) {
14273                 RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded.\n");
14274                 return TEST_FAILED;
14275         }
14276         return unit_test_suite_runner(&cryptodev_testsuite);
14277 }
14278
14279 static int
14280 test_cryptodev_octeontx2(void)
14281 {
14282         gbl_driver_id = rte_cryptodev_driver_id_get(
14283                         RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
14284         if (gbl_driver_id == -1) {
14285                 RTE_LOG(ERR, USER1, "OCTEON TX2 PMD must be loaded.\n");
14286                 return TEST_FAILED;
14287         }
14288         return unit_test_suite_runner(&cryptodev_testsuite);
14289 }
14290
14291 static int
14292 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)
14293 {
14294         gbl_driver_id = rte_cryptodev_driver_id_get(
14295                         RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
14296
14297         if (gbl_driver_id == -1) {
14298                 RTE_LOG(ERR, USER1, "CAAM_JR PMD must be loaded.\n");
14299                 return TEST_FAILED;
14300         }
14301
14302         return unit_test_suite_runner(&cryptodev_caam_jr_testsuite);
14303 }
14304
14305 static int
14306 test_cryptodev_nitrox(void)
14307 {
14308         gbl_driver_id = rte_cryptodev_driver_id_get(
14309                         RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
14310
14311         if (gbl_driver_id == -1) {
14312                 RTE_LOG(ERR, USER1, "NITROX PMD must be loaded.\n");
14313                 return TEST_FAILED;
14314         }
14315
14316         return unit_test_suite_runner(&cryptodev_testsuite);
14317 }
14318
14319 static int
14320 test_cryptodev_bcmfs(void)
14321 {
14322         gbl_driver_id = rte_cryptodev_driver_id_get(
14323                         RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
14324
14325         if (gbl_driver_id == -1) {
14326                 RTE_LOG(ERR, USER1, "BCMFS PMD must be loaded.\n");
14327                 return TEST_FAILED;
14328         }
14329
14330         return unit_test_suite_runner(&cryptodev_testsuite);
14331 }
14332
14333 static int
14334 test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/)
14335 {
14336         int ret;
14337
14338         gbl_driver_id = rte_cryptodev_driver_id_get(
14339                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14340
14341         if (gbl_driver_id == -1) {
14342                 RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14343                 return TEST_SKIPPED;
14344         }
14345
14346         global_api_test_type = CRYPTODEV_RAW_API_TEST;
14347         ret = unit_test_suite_runner(&cryptodev_testsuite);
14348         global_api_test_type = CRYPTODEV_API_TEST;
14349
14350         return ret;
14351 }
14352
14353 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
14354                 test_cryptodev_qat_raw_api);
14355 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
14356 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
14357 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
14358         test_cryptodev_cpu_aesni_mb);
14359 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
14360 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
14361 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
14362         test_cryptodev_cpu_aesni_gcm);
14363 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
14364 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
14365 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
14366 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
14367 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
14368 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
14369 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
14370 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
14371 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
14372 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
14373 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
14374 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
14375 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
14376 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
14377 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);