8189053c13cb4d89f5514eeac82fedd61a8409f3
[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 void
10731 generate_gmac_large_plaintext(uint8_t *data)
10732 {
10733         uint16_t i;
10734
10735         for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
10736                 memcpy(&data[i], &data[0], 32);
10737 }
10738
10739 static int
10740 create_gmac_operation(enum rte_crypto_auth_operation op,
10741                 const struct gmac_test_data *tdata)
10742 {
10743         struct crypto_testsuite_params *ts_params = &testsuite_params;
10744         struct crypto_unittest_params *ut_params = &unittest_params;
10745         struct rte_crypto_sym_op *sym_op;
10746
10747         uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10748
10749         /* Generate Crypto op data structure */
10750         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10751                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10752         TEST_ASSERT_NOT_NULL(ut_params->op,
10753                         "Failed to allocate symmetric crypto operation struct");
10754
10755         sym_op = ut_params->op->sym;
10756
10757         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10758                         ut_params->ibuf, tdata->gmac_tag.len);
10759         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10760                         "no room to append digest");
10761
10762         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10763                         ut_params->ibuf, plaintext_pad_len);
10764
10765         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10766                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
10767                                 tdata->gmac_tag.len);
10768                 debug_hexdump(stdout, "digest:",
10769                                 sym_op->auth.digest.data,
10770                                 tdata->gmac_tag.len);
10771         }
10772
10773         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
10774                         uint8_t *, IV_OFFSET);
10775
10776         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
10777
10778         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
10779
10780         sym_op->cipher.data.length = 0;
10781         sym_op->cipher.data.offset = 0;
10782
10783         sym_op->auth.data.offset = 0;
10784         sym_op->auth.data.length = tdata->plaintext.len;
10785
10786         return 0;
10787 }
10788
10789 static int
10790 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
10791                 const struct gmac_test_data *tdata,
10792                 void *digest_mem, uint64_t digest_phys)
10793 {
10794         struct crypto_testsuite_params *ts_params = &testsuite_params;
10795         struct crypto_unittest_params *ut_params = &unittest_params;
10796         struct rte_crypto_sym_op *sym_op;
10797
10798         /* Generate Crypto op data structure */
10799         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10800                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10801         TEST_ASSERT_NOT_NULL(ut_params->op,
10802                         "Failed to allocate symmetric crypto operation struct");
10803
10804         sym_op = ut_params->op->sym;
10805
10806         sym_op->auth.digest.data = digest_mem;
10807         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10808                         "no room to append digest");
10809
10810         sym_op->auth.digest.phys_addr = digest_phys;
10811
10812         if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10813                 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
10814                                 tdata->gmac_tag.len);
10815                 debug_hexdump(stdout, "digest:",
10816                                 sym_op->auth.digest.data,
10817                                 tdata->gmac_tag.len);
10818         }
10819
10820         uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
10821                         uint8_t *, IV_OFFSET);
10822
10823         rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
10824
10825         debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
10826
10827         sym_op->cipher.data.length = 0;
10828         sym_op->cipher.data.offset = 0;
10829
10830         sym_op->auth.data.offset = 0;
10831         sym_op->auth.data.length = tdata->plaintext.len;
10832
10833         return 0;
10834 }
10835
10836 static int create_gmac_session(uint8_t dev_id,
10837                 const struct gmac_test_data *tdata,
10838                 enum rte_crypto_auth_operation auth_op)
10839 {
10840         uint8_t auth_key[tdata->key.len];
10841
10842         struct crypto_testsuite_params *ts_params = &testsuite_params;
10843         struct crypto_unittest_params *ut_params = &unittest_params;
10844
10845         memcpy(auth_key, tdata->key.data, tdata->key.len);
10846
10847         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10848         ut_params->auth_xform.next = NULL;
10849
10850         ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
10851         ut_params->auth_xform.auth.op = auth_op;
10852         ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
10853         ut_params->auth_xform.auth.key.length = tdata->key.len;
10854         ut_params->auth_xform.auth.key.data = auth_key;
10855         ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
10856         ut_params->auth_xform.auth.iv.length = tdata->iv.len;
10857
10858
10859         ut_params->sess = rte_cryptodev_sym_session_create(
10860                         ts_params->session_mpool);
10861
10862         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
10863                         &ut_params->auth_xform,
10864                         ts_params->session_priv_mpool);
10865
10866         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10867
10868         return 0;
10869 }
10870
10871 static int
10872 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
10873 {
10874         struct crypto_testsuite_params *ts_params = &testsuite_params;
10875         struct crypto_unittest_params *ut_params = &unittest_params;
10876         struct rte_cryptodev_info dev_info;
10877
10878         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10879         uint64_t feat_flags = dev_info.feature_flags;
10880
10881         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10882                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10883                 printf("Device doesn't support RAW data-path APIs.\n");
10884                 return -ENOTSUP;
10885         }
10886
10887         int retval;
10888
10889         uint8_t *auth_tag, *plaintext;
10890         uint16_t plaintext_pad_len;
10891
10892         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
10893                               "No GMAC length in the source data");
10894
10895         /* Verify the capabilities */
10896         struct rte_cryptodev_sym_capability_idx cap_idx;
10897         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10898         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
10899         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10900                         &cap_idx) == NULL)
10901                 return -ENOTSUP;
10902
10903         retval = create_gmac_session(ts_params->valid_devs[0],
10904                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
10905
10906         if (retval < 0)
10907                 return retval;
10908
10909         if (tdata->plaintext.len > MBUF_SIZE)
10910                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10911         else
10912                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10913         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10914                         "Failed to allocate input buffer in mempool");
10915
10916         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10917                         rte_pktmbuf_tailroom(ut_params->ibuf));
10918
10919         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10920         /*
10921          * Runtime generate the large plain text instead of use hard code
10922          * plain text vector. It is done to avoid create huge source file
10923          * with the test vector.
10924          */
10925         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
10926                 generate_gmac_large_plaintext(tdata->plaintext.data);
10927
10928         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10929                                 plaintext_pad_len);
10930         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
10931
10932         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
10933         debug_hexdump(stdout, "plaintext:", plaintext,
10934                         tdata->plaintext.len);
10935
10936         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
10937                         tdata);
10938
10939         if (retval < 0)
10940                 return retval;
10941
10942         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10943
10944         ut_params->op->sym->m_src = ut_params->ibuf;
10945
10946         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10947                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10948                         ut_params->op);
10949         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10950                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10951                                 ut_params->op, 0, 1, 0, 0);
10952         else
10953                 TEST_ASSERT_NOT_NULL(
10954                         process_crypto_request(ts_params->valid_devs[0],
10955                         ut_params->op), "failed to process sym crypto op");
10956
10957         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10958                         "crypto op processing failed");
10959
10960         if (ut_params->op->sym->m_dst) {
10961                 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
10962                                 uint8_t *, plaintext_pad_len);
10963         } else {
10964                 auth_tag = plaintext + plaintext_pad_len;
10965         }
10966
10967         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
10968
10969         TEST_ASSERT_BUFFERS_ARE_EQUAL(
10970                         auth_tag,
10971                         tdata->gmac_tag.data,
10972                         tdata->gmac_tag.len,
10973                         "GMAC Generated auth tag not as expected");
10974
10975         return 0;
10976 }
10977
10978 static int
10979 test_AES_GMAC_authentication_test_case_1(void)
10980 {
10981         return test_AES_GMAC_authentication(&gmac_test_case_1);
10982 }
10983
10984 static int
10985 test_AES_GMAC_authentication_test_case_2(void)
10986 {
10987         return test_AES_GMAC_authentication(&gmac_test_case_2);
10988 }
10989
10990 static int
10991 test_AES_GMAC_authentication_test_case_3(void)
10992 {
10993         return test_AES_GMAC_authentication(&gmac_test_case_3);
10994 }
10995
10996 static int
10997 test_AES_GMAC_authentication_test_case_4(void)
10998 {
10999         return test_AES_GMAC_authentication(&gmac_test_case_4);
11000 }
11001
11002 static int
11003 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
11004 {
11005         struct crypto_testsuite_params *ts_params = &testsuite_params;
11006         struct crypto_unittest_params *ut_params = &unittest_params;
11007         int retval;
11008         uint32_t plaintext_pad_len;
11009         uint8_t *plaintext;
11010         struct rte_cryptodev_info dev_info;
11011
11012         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11013         uint64_t feat_flags = dev_info.feature_flags;
11014
11015         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11016                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11017                 printf("Device doesn't support RAW data-path APIs.\n");
11018                 return -ENOTSUP;
11019         }
11020
11021         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11022                               "No GMAC length in the source data");
11023
11024         /* Verify the capabilities */
11025         struct rte_cryptodev_sym_capability_idx cap_idx;
11026         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11027         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11028         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11029                         &cap_idx) == NULL)
11030                 return -ENOTSUP;
11031
11032         retval = create_gmac_session(ts_params->valid_devs[0],
11033                         tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
11034
11035         if (retval < 0)
11036                 return retval;
11037
11038         if (tdata->plaintext.len > MBUF_SIZE)
11039                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11040         else
11041                 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11042         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11043                         "Failed to allocate input buffer in mempool");
11044
11045         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11046                         rte_pktmbuf_tailroom(ut_params->ibuf));
11047
11048         plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11049
11050         /*
11051          * Runtime generate the large plain text instead of use hard code
11052          * plain text vector. It is done to avoid create huge source file
11053          * with the test vector.
11054          */
11055         if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11056                 generate_gmac_large_plaintext(tdata->plaintext.data);
11057
11058         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11059                                 plaintext_pad_len);
11060         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11061
11062         memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11063         debug_hexdump(stdout, "plaintext:", plaintext,
11064                         tdata->plaintext.len);
11065
11066         retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
11067                         tdata);
11068
11069         if (retval < 0)
11070                 return retval;
11071
11072         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11073
11074         ut_params->op->sym->m_src = ut_params->ibuf;
11075
11076         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11077                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11078                         ut_params->op);
11079         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11080                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11081                                 ut_params->op, 0, 1, 0, 0);
11082         else
11083                 TEST_ASSERT_NOT_NULL(
11084                         process_crypto_request(ts_params->valid_devs[0],
11085                         ut_params->op), "failed to process sym crypto op");
11086
11087         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11088                         "crypto op processing failed");
11089
11090         return 0;
11091
11092 }
11093
11094 static int
11095 test_AES_GMAC_authentication_verify_test_case_1(void)
11096 {
11097         return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
11098 }
11099
11100 static int
11101 test_AES_GMAC_authentication_verify_test_case_2(void)
11102 {
11103         return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
11104 }
11105
11106 static int
11107 test_AES_GMAC_authentication_verify_test_case_3(void)
11108 {
11109         return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
11110 }
11111
11112 static int
11113 test_AES_GMAC_authentication_verify_test_case_4(void)
11114 {
11115         return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
11116 }
11117
11118 static int
11119 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
11120                                 uint32_t fragsz)
11121 {
11122         struct crypto_testsuite_params *ts_params = &testsuite_params;
11123         struct crypto_unittest_params *ut_params = &unittest_params;
11124         struct rte_cryptodev_info dev_info;
11125         uint64_t feature_flags;
11126         unsigned int trn_data = 0;
11127         void *digest_mem = NULL;
11128         uint32_t segs = 1;
11129         unsigned int to_trn = 0;
11130         struct rte_mbuf *buf = NULL;
11131         uint8_t *auth_tag, *plaintext;
11132         int retval;
11133
11134         TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11135                               "No GMAC length in the source data");
11136
11137         /* Verify the capabilities */
11138         struct rte_cryptodev_sym_capability_idx cap_idx;
11139         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11140         cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11141         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11142                         &cap_idx) == NULL)
11143                 return -ENOTSUP;
11144
11145         /* Check for any input SGL support */
11146         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11147         feature_flags = dev_info.feature_flags;
11148
11149         if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
11150                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
11151                         (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
11152                 return -ENOTSUP;
11153
11154         if (fragsz > tdata->plaintext.len)
11155                 fragsz = tdata->plaintext.len;
11156
11157         uint16_t plaintext_len = fragsz;
11158
11159         retval = create_gmac_session(ts_params->valid_devs[0],
11160                         tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11161
11162         if (retval < 0)
11163                 return retval;
11164
11165         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11166         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11167                         "Failed to allocate input buffer in mempool");
11168
11169         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11170                         rte_pktmbuf_tailroom(ut_params->ibuf));
11171
11172         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11173                                 plaintext_len);
11174         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11175
11176         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
11177
11178         trn_data += plaintext_len;
11179
11180         buf = ut_params->ibuf;
11181
11182         /*
11183          * Loop until no more fragments
11184          */
11185
11186         while (trn_data < tdata->plaintext.len) {
11187                 ++segs;
11188                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
11189                                 (tdata->plaintext.len - trn_data) : fragsz;
11190
11191                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11192                 buf = buf->next;
11193
11194                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
11195                                 rte_pktmbuf_tailroom(buf));
11196
11197                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
11198                                 to_trn);
11199
11200                 memcpy(plaintext, tdata->plaintext.data + trn_data,
11201                                 to_trn);
11202                 trn_data += to_trn;
11203                 if (trn_data  == tdata->plaintext.len)
11204                         digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
11205                                         tdata->gmac_tag.len);
11206         }
11207         ut_params->ibuf->nb_segs = segs;
11208
11209         /*
11210          * Place digest at the end of the last buffer
11211          */
11212         uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
11213
11214         if (!digest_mem) {
11215                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11216                                 + tdata->gmac_tag.len);
11217                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
11218                                 tdata->plaintext.len);
11219         }
11220
11221         retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
11222                         tdata, digest_mem, digest_phys);
11223
11224         if (retval < 0)
11225                 return retval;
11226
11227         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11228
11229         ut_params->op->sym->m_src = ut_params->ibuf;
11230
11231         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11232                 return -ENOTSUP;
11233
11234         TEST_ASSERT_NOT_NULL(
11235                 process_crypto_request(ts_params->valid_devs[0],
11236                 ut_params->op), "failed to process sym crypto op");
11237
11238         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11239                         "crypto op processing failed");
11240
11241         auth_tag = digest_mem;
11242         debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11243         TEST_ASSERT_BUFFERS_ARE_EQUAL(
11244                         auth_tag,
11245                         tdata->gmac_tag.data,
11246                         tdata->gmac_tag.len,
11247                         "GMAC Generated auth tag not as expected");
11248
11249         return 0;
11250 }
11251
11252 /* Segment size not multiple of block size (16B) */
11253 static int
11254 test_AES_GMAC_authentication_SGL_40B(void)
11255 {
11256         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
11257 }
11258
11259 static int
11260 test_AES_GMAC_authentication_SGL_80B(void)
11261 {
11262         return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
11263 }
11264
11265 static int
11266 test_AES_GMAC_authentication_SGL_2048B(void)
11267 {
11268         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
11269 }
11270
11271 /* Segment size not multiple of block size (16B) */
11272 static int
11273 test_AES_GMAC_authentication_SGL_2047B(void)
11274 {
11275         return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
11276 }
11277
11278 struct test_crypto_vector {
11279         enum rte_crypto_cipher_algorithm crypto_algo;
11280         unsigned int cipher_offset;
11281         unsigned int cipher_len;
11282
11283         struct {
11284                 uint8_t data[64];
11285                 unsigned int len;
11286         } cipher_key;
11287
11288         struct {
11289                 uint8_t data[64];
11290                 unsigned int len;
11291         } iv;
11292
11293         struct {
11294                 const uint8_t *data;
11295                 unsigned int len;
11296         } plaintext;
11297
11298         struct {
11299                 const uint8_t *data;
11300                 unsigned int len;
11301         } ciphertext;
11302
11303         enum rte_crypto_auth_algorithm auth_algo;
11304         unsigned int auth_offset;
11305
11306         struct {
11307                 uint8_t data[128];
11308                 unsigned int len;
11309         } auth_key;
11310
11311         struct {
11312                 const uint8_t *data;
11313                 unsigned int len;
11314         } aad;
11315
11316         struct {
11317                 uint8_t data[128];
11318                 unsigned int len;
11319         } digest;
11320 };
11321
11322 static const struct test_crypto_vector
11323 hmac_sha1_test_crypto_vector = {
11324         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11325         .plaintext = {
11326                 .data = plaintext_hash,
11327                 .len = 512
11328         },
11329         .auth_key = {
11330                 .data = {
11331                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11332                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11333                         0xDE, 0xF4, 0xDE, 0xAD
11334                 },
11335                 .len = 20
11336         },
11337         .digest = {
11338                 .data = {
11339                         0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
11340                         0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
11341                         0x3F, 0x91, 0x64, 0x59
11342                 },
11343                 .len = 20
11344         }
11345 };
11346
11347 static const struct test_crypto_vector
11348 aes128_gmac_test_vector = {
11349         .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
11350         .plaintext = {
11351                 .data = plaintext_hash,
11352                 .len = 512
11353         },
11354         .iv = {
11355                 .data = {
11356                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11357                         0x08, 0x09, 0x0A, 0x0B
11358                 },
11359                 .len = 12
11360         },
11361         .auth_key = {
11362                 .data = {
11363                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11364                         0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
11365                 },
11366                 .len = 16
11367         },
11368         .digest = {
11369                 .data = {
11370                         0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
11371                         0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
11372                 },
11373                 .len = 16
11374         }
11375 };
11376
11377 static const struct test_crypto_vector
11378 aes128cbc_hmac_sha1_test_vector = {
11379         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11380         .cipher_offset = 0,
11381         .cipher_len = 512,
11382         .cipher_key = {
11383                 .data = {
11384                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11385                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11386                 },
11387                 .len = 16
11388         },
11389         .iv = {
11390                 .data = {
11391                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11392                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11393                 },
11394                 .len = 16
11395         },
11396         .plaintext = {
11397                 .data = plaintext_hash,
11398                 .len = 512
11399         },
11400         .ciphertext = {
11401                 .data = ciphertext512_aes128cbc,
11402                 .len = 512
11403         },
11404         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11405         .auth_offset = 0,
11406         .auth_key = {
11407                 .data = {
11408                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11409                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11410                         0xDE, 0xF4, 0xDE, 0xAD
11411                 },
11412                 .len = 20
11413         },
11414         .digest = {
11415                 .data = {
11416                         0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
11417                         0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11418                         0x18, 0x8C, 0x1D, 0x32
11419                 },
11420                 .len = 20
11421         }
11422 };
11423
11424 static const struct test_crypto_vector
11425 aes128cbc_hmac_sha1_aad_test_vector = {
11426         .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11427         .cipher_offset = 8,
11428         .cipher_len = 496,
11429         .cipher_key = {
11430                 .data = {
11431                         0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11432                         0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11433                 },
11434                 .len = 16
11435         },
11436         .iv = {
11437                 .data = {
11438                         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11439                         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11440                 },
11441                 .len = 16
11442         },
11443         .plaintext = {
11444                 .data = plaintext_hash,
11445                 .len = 512
11446         },
11447         .ciphertext = {
11448                 .data = ciphertext512_aes128cbc_aad,
11449                 .len = 512
11450         },
11451         .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11452         .auth_offset = 0,
11453         .auth_key = {
11454                 .data = {
11455                         0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11456                         0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11457                         0xDE, 0xF4, 0xDE, 0xAD
11458                 },
11459                 .len = 20
11460         },
11461         .digest = {
11462                 .data = {
11463                         0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
11464                         0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
11465                         0x62, 0x0F, 0xFB, 0x10
11466                 },
11467                 .len = 20
11468         }
11469 };
11470
11471 static void
11472 data_corruption(uint8_t *data)
11473 {
11474         data[0] += 1;
11475 }
11476
11477 static void
11478 tag_corruption(uint8_t *data, unsigned int tag_offset)
11479 {
11480         data[tag_offset] += 1;
11481 }
11482
11483 static int
11484 create_auth_session(struct crypto_unittest_params *ut_params,
11485                 uint8_t dev_id,
11486                 const struct test_crypto_vector *reference,
11487                 enum rte_crypto_auth_operation auth_op)
11488 {
11489         struct crypto_testsuite_params *ts_params = &testsuite_params;
11490         uint8_t auth_key[reference->auth_key.len + 1];
11491
11492         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11493
11494         /* Setup Authentication Parameters */
11495         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11496         ut_params->auth_xform.auth.op = auth_op;
11497         ut_params->auth_xform.next = NULL;
11498         ut_params->auth_xform.auth.algo = reference->auth_algo;
11499         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11500         ut_params->auth_xform.auth.key.data = auth_key;
11501         ut_params->auth_xform.auth.digest_length = reference->digest.len;
11502
11503         /* Create Crypto session*/
11504         ut_params->sess = rte_cryptodev_sym_session_create(
11505                         ts_params->session_mpool);
11506
11507         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11508                                 &ut_params->auth_xform,
11509                                 ts_params->session_priv_mpool);
11510
11511         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11512
11513         return 0;
11514 }
11515
11516 static int
11517 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
11518                 uint8_t dev_id,
11519                 const struct test_crypto_vector *reference,
11520                 enum rte_crypto_auth_operation auth_op,
11521                 enum rte_crypto_cipher_operation cipher_op)
11522 {
11523         struct crypto_testsuite_params *ts_params = &testsuite_params;
11524         uint8_t cipher_key[reference->cipher_key.len + 1];
11525         uint8_t auth_key[reference->auth_key.len + 1];
11526
11527         memcpy(cipher_key, reference->cipher_key.data,
11528                         reference->cipher_key.len);
11529         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11530
11531         /* Setup Authentication Parameters */
11532         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11533         ut_params->auth_xform.auth.op = auth_op;
11534         ut_params->auth_xform.auth.algo = reference->auth_algo;
11535         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11536         ut_params->auth_xform.auth.key.data = auth_key;
11537         ut_params->auth_xform.auth.digest_length = reference->digest.len;
11538
11539         if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
11540                 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11541                 ut_params->auth_xform.auth.iv.length = reference->iv.len;
11542         } else {
11543                 ut_params->auth_xform.next = &ut_params->cipher_xform;
11544
11545                 /* Setup Cipher Parameters */
11546                 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11547                 ut_params->cipher_xform.next = NULL;
11548                 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
11549                 ut_params->cipher_xform.cipher.op = cipher_op;
11550                 ut_params->cipher_xform.cipher.key.data = cipher_key;
11551                 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
11552                 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
11553                 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
11554         }
11555
11556         /* Create Crypto session*/
11557         ut_params->sess = rte_cryptodev_sym_session_create(
11558                         ts_params->session_mpool);
11559
11560         rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11561                                 &ut_params->auth_xform,
11562                                 ts_params->session_priv_mpool);
11563
11564         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11565
11566         return 0;
11567 }
11568
11569 static int
11570 create_auth_operation(struct crypto_testsuite_params *ts_params,
11571                 struct crypto_unittest_params *ut_params,
11572                 const struct test_crypto_vector *reference,
11573                 unsigned int auth_generate)
11574 {
11575         /* Generate Crypto op data structure */
11576         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11577                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11578         TEST_ASSERT_NOT_NULL(ut_params->op,
11579                         "Failed to allocate pktmbuf offload");
11580
11581         /* Set crypto operation data parameters */
11582         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11583
11584         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11585
11586         /* set crypto operation source mbuf */
11587         sym_op->m_src = ut_params->ibuf;
11588
11589         /* digest */
11590         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11591                         ut_params->ibuf, reference->digest.len);
11592
11593         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11594                         "no room to append auth tag");
11595
11596         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11597                         ut_params->ibuf, reference->plaintext.len);
11598
11599         if (auth_generate)
11600                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11601         else
11602                 memcpy(sym_op->auth.digest.data,
11603                                 reference->digest.data,
11604                                 reference->digest.len);
11605
11606         debug_hexdump(stdout, "digest:",
11607                         sym_op->auth.digest.data,
11608                         reference->digest.len);
11609
11610         sym_op->auth.data.length = reference->plaintext.len;
11611         sym_op->auth.data.offset = 0;
11612
11613         return 0;
11614 }
11615
11616 static int
11617 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
11618                 struct crypto_unittest_params *ut_params,
11619                 const struct test_crypto_vector *reference,
11620                 unsigned int auth_generate)
11621 {
11622         /* Generate Crypto op data structure */
11623         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11624                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11625         TEST_ASSERT_NOT_NULL(ut_params->op,
11626                         "Failed to allocate pktmbuf offload");
11627
11628         /* Set crypto operation data parameters */
11629         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11630
11631         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11632
11633         /* set crypto operation source mbuf */
11634         sym_op->m_src = ut_params->ibuf;
11635
11636         /* digest */
11637         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11638                         ut_params->ibuf, reference->digest.len);
11639
11640         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11641                         "no room to append auth tag");
11642
11643         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11644                         ut_params->ibuf, reference->ciphertext.len);
11645
11646         if (auth_generate)
11647                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11648         else
11649                 memcpy(sym_op->auth.digest.data,
11650                                 reference->digest.data,
11651                                 reference->digest.len);
11652
11653         debug_hexdump(stdout, "digest:",
11654                         sym_op->auth.digest.data,
11655                         reference->digest.len);
11656
11657         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11658                         reference->iv.data, reference->iv.len);
11659
11660         sym_op->cipher.data.length = 0;
11661         sym_op->cipher.data.offset = 0;
11662
11663         sym_op->auth.data.length = reference->plaintext.len;
11664         sym_op->auth.data.offset = 0;
11665
11666         return 0;
11667 }
11668
11669 static int
11670 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
11671                 struct crypto_unittest_params *ut_params,
11672                 const struct test_crypto_vector *reference,
11673                 unsigned int auth_generate)
11674 {
11675         /* Generate Crypto op data structure */
11676         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11677                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11678         TEST_ASSERT_NOT_NULL(ut_params->op,
11679                         "Failed to allocate pktmbuf offload");
11680
11681         /* Set crypto operation data parameters */
11682         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11683
11684         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11685
11686         /* set crypto operation source mbuf */
11687         sym_op->m_src = ut_params->ibuf;
11688
11689         /* digest */
11690         sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11691                         ut_params->ibuf, reference->digest.len);
11692
11693         TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11694                         "no room to append auth tag");
11695
11696         sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11697                         ut_params->ibuf, reference->ciphertext.len);
11698
11699         if (auth_generate)
11700                 memset(sym_op->auth.digest.data, 0, reference->digest.len);
11701         else
11702                 memcpy(sym_op->auth.digest.data,
11703                                 reference->digest.data,
11704                                 reference->digest.len);
11705
11706         debug_hexdump(stdout, "digest:",
11707                         sym_op->auth.digest.data,
11708                         reference->digest.len);
11709
11710         rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11711                         reference->iv.data, reference->iv.len);
11712
11713         sym_op->cipher.data.length = reference->cipher_len;
11714         sym_op->cipher.data.offset = reference->cipher_offset;
11715
11716         sym_op->auth.data.length = reference->plaintext.len;
11717         sym_op->auth.data.offset = reference->auth_offset;
11718
11719         return 0;
11720 }
11721
11722 static int
11723 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11724                 struct crypto_unittest_params *ut_params,
11725                 const struct test_crypto_vector *reference)
11726 {
11727         return create_auth_operation(ts_params, ut_params, reference, 0);
11728 }
11729
11730 static int
11731 create_auth_verify_GMAC_operation(
11732                 struct crypto_testsuite_params *ts_params,
11733                 struct crypto_unittest_params *ut_params,
11734                 const struct test_crypto_vector *reference)
11735 {
11736         return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
11737 }
11738
11739 static int
11740 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11741                 struct crypto_unittest_params *ut_params,
11742                 const struct test_crypto_vector *reference)
11743 {
11744         return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
11745 }
11746
11747 static int
11748 test_authentication_verify_fail_when_data_corruption(
11749                 struct crypto_testsuite_params *ts_params,
11750                 struct crypto_unittest_params *ut_params,
11751                 const struct test_crypto_vector *reference,
11752                 unsigned int data_corrupted)
11753 {
11754         int retval;
11755
11756         uint8_t *plaintext;
11757         struct rte_cryptodev_info dev_info;
11758
11759         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11760         uint64_t feat_flags = dev_info.feature_flags;
11761
11762         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11763                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11764                 printf("Device doesn't support RAW data-path APIs.\n");
11765                 return -ENOTSUP;
11766         }
11767
11768         /* Verify the capabilities */
11769         struct rte_cryptodev_sym_capability_idx cap_idx;
11770         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11771         cap_idx.algo.auth = reference->auth_algo;
11772         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11773                         &cap_idx) == NULL)
11774                 return -ENOTSUP;
11775
11776
11777         /* Create session */
11778         retval = create_auth_session(ut_params,
11779                         ts_params->valid_devs[0],
11780                         reference,
11781                         RTE_CRYPTO_AUTH_OP_VERIFY);
11782         if (retval < 0)
11783                 return retval;
11784
11785         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11786         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11787                         "Failed to allocate input buffer in mempool");
11788
11789         /* clear mbuf payload */
11790         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11791                         rte_pktmbuf_tailroom(ut_params->ibuf));
11792
11793         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11794                         reference->plaintext.len);
11795         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11796         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
11797
11798         debug_hexdump(stdout, "plaintext:", plaintext,
11799                 reference->plaintext.len);
11800
11801         /* Create operation */
11802         retval = create_auth_verify_operation(ts_params, ut_params, reference);
11803
11804         if (retval < 0)
11805                 return retval;
11806
11807         if (data_corrupted)
11808                 data_corruption(plaintext);
11809         else
11810                 tag_corruption(plaintext, reference->plaintext.len);
11811
11812         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
11813                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11814                         ut_params->op);
11815                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
11816                         RTE_CRYPTO_OP_STATUS_SUCCESS,
11817                         "authentication not failed");
11818         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11819                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11820                                 ut_params->op, 0, 1, 0, 0);
11821         else {
11822                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
11823                         ut_params->op);
11824                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
11825         }
11826
11827         return 0;
11828 }
11829
11830 static int
11831 test_authentication_verify_GMAC_fail_when_corruption(
11832                 struct crypto_testsuite_params *ts_params,
11833                 struct crypto_unittest_params *ut_params,
11834                 const struct test_crypto_vector *reference,
11835                 unsigned int data_corrupted)
11836 {
11837         int retval;
11838         uint8_t *plaintext;
11839         struct rte_cryptodev_info dev_info;
11840
11841         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11842         uint64_t feat_flags = dev_info.feature_flags;
11843
11844         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11845                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11846                 printf("Device doesn't support RAW data-path APIs.\n");
11847                 return -ENOTSUP;
11848         }
11849
11850         /* Verify the capabilities */
11851         struct rte_cryptodev_sym_capability_idx cap_idx;
11852         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11853         cap_idx.algo.auth = reference->auth_algo;
11854         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11855                         &cap_idx) == NULL)
11856                 return -ENOTSUP;
11857
11858         /* Create session */
11859         retval = create_auth_cipher_session(ut_params,
11860                         ts_params->valid_devs[0],
11861                         reference,
11862                         RTE_CRYPTO_AUTH_OP_VERIFY,
11863                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
11864         if (retval < 0)
11865                 return retval;
11866
11867         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11868         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11869                         "Failed to allocate input buffer in mempool");
11870
11871         /* clear mbuf payload */
11872         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11873                         rte_pktmbuf_tailroom(ut_params->ibuf));
11874
11875         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11876                         reference->plaintext.len);
11877         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11878         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
11879
11880         debug_hexdump(stdout, "plaintext:", plaintext,
11881                 reference->plaintext.len);
11882
11883         /* Create operation */
11884         retval = create_auth_verify_GMAC_operation(ts_params,
11885                         ut_params,
11886                         reference);
11887
11888         if (retval < 0)
11889                 return retval;
11890
11891         if (data_corrupted)
11892                 data_corruption(plaintext);
11893         else
11894                 tag_corruption(plaintext, reference->aad.len);
11895
11896         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
11897                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11898                         ut_params->op);
11899                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
11900                         RTE_CRYPTO_OP_STATUS_SUCCESS,
11901                         "authentication not failed");
11902         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11903                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11904                                 ut_params->op, 0, 1, 0, 0);
11905         else {
11906                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
11907                         ut_params->op);
11908                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
11909         }
11910
11911         return 0;
11912 }
11913
11914 static int
11915 test_authenticated_decryption_fail_when_corruption(
11916                 struct crypto_testsuite_params *ts_params,
11917                 struct crypto_unittest_params *ut_params,
11918                 const struct test_crypto_vector *reference,
11919                 unsigned int data_corrupted)
11920 {
11921         int retval;
11922
11923         uint8_t *ciphertext;
11924         struct rte_cryptodev_info dev_info;
11925
11926         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11927         uint64_t feat_flags = dev_info.feature_flags;
11928
11929         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11930                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11931                 printf("Device doesn't support RAW data-path APIs.\n");
11932                 return -ENOTSUP;
11933         }
11934
11935         /* Verify the capabilities */
11936         struct rte_cryptodev_sym_capability_idx cap_idx;
11937         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11938         cap_idx.algo.auth = reference->auth_algo;
11939         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11940                         &cap_idx) == NULL)
11941                 return -ENOTSUP;
11942         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11943         cap_idx.algo.cipher = reference->crypto_algo;
11944         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11945                         &cap_idx) == NULL)
11946                 return -ENOTSUP;
11947
11948         /* Create session */
11949         retval = create_auth_cipher_session(ut_params,
11950                         ts_params->valid_devs[0],
11951                         reference,
11952                         RTE_CRYPTO_AUTH_OP_VERIFY,
11953                         RTE_CRYPTO_CIPHER_OP_DECRYPT);
11954         if (retval < 0)
11955                 return retval;
11956
11957         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11958         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11959                         "Failed to allocate input buffer in mempool");
11960
11961         /* clear mbuf payload */
11962         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11963                         rte_pktmbuf_tailroom(ut_params->ibuf));
11964
11965         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11966                         reference->ciphertext.len);
11967         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
11968         memcpy(ciphertext, reference->ciphertext.data,
11969                         reference->ciphertext.len);
11970
11971         /* Create operation */
11972         retval = create_cipher_auth_verify_operation(ts_params,
11973                         ut_params,
11974                         reference);
11975
11976         if (retval < 0)
11977                 return retval;
11978
11979         if (data_corrupted)
11980                 data_corruption(ciphertext);
11981         else
11982                 tag_corruption(ciphertext, reference->ciphertext.len);
11983
11984         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
11985                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11986                         ut_params->op);
11987                 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
11988                         RTE_CRYPTO_OP_STATUS_SUCCESS,
11989                         "authentication not failed");
11990         } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11991                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11992                                 ut_params->op, 1, 1, 0, 0);
11993         else {
11994                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
11995                         ut_params->op);
11996                 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
11997         }
11998
11999         return 0;
12000 }
12001
12002 static int
12003 test_authenticated_encryt_with_esn(
12004                 struct crypto_testsuite_params *ts_params,
12005                 struct crypto_unittest_params *ut_params,
12006                 const struct test_crypto_vector *reference)
12007 {
12008         int retval;
12009
12010         uint8_t *authciphertext, *plaintext, *auth_tag;
12011         uint16_t plaintext_pad_len;
12012         uint8_t cipher_key[reference->cipher_key.len + 1];
12013         uint8_t auth_key[reference->auth_key.len + 1];
12014         struct rte_cryptodev_info dev_info;
12015
12016         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12017         uint64_t feat_flags = dev_info.feature_flags;
12018
12019         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12020                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12021                 printf("Device doesn't support RAW data-path APIs.\n");
12022                 return -ENOTSUP;
12023         }
12024
12025         /* Verify the capabilities */
12026         struct rte_cryptodev_sym_capability_idx cap_idx;
12027         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12028         cap_idx.algo.auth = reference->auth_algo;
12029         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12030                         &cap_idx) == NULL)
12031                 return -ENOTSUP;
12032         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12033         cap_idx.algo.cipher = reference->crypto_algo;
12034         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12035                         &cap_idx) == NULL)
12036                 return -ENOTSUP;
12037
12038         /* Create session */
12039         memcpy(cipher_key, reference->cipher_key.data,
12040                         reference->cipher_key.len);
12041         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12042
12043         /* Setup Cipher Parameters */
12044         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12045         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12046         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12047         ut_params->cipher_xform.cipher.key.data = cipher_key;
12048         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12049         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12050         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12051
12052         ut_params->cipher_xform.next = &ut_params->auth_xform;
12053
12054         /* Setup Authentication Parameters */
12055         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12056         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12057         ut_params->auth_xform.auth.algo = reference->auth_algo;
12058         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12059         ut_params->auth_xform.auth.key.data = auth_key;
12060         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12061         ut_params->auth_xform.next = NULL;
12062
12063         /* Create Crypto session*/
12064         ut_params->sess = rte_cryptodev_sym_session_create(
12065                         ts_params->session_mpool);
12066
12067         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12068                                 ut_params->sess,
12069                                 &ut_params->cipher_xform,
12070                                 ts_params->session_priv_mpool);
12071
12072         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12073
12074         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12075         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12076                         "Failed to allocate input buffer in mempool");
12077
12078         /* clear mbuf payload */
12079         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12080                         rte_pktmbuf_tailroom(ut_params->ibuf));
12081
12082         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12083                         reference->plaintext.len);
12084         TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12085         memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12086
12087         /* Create operation */
12088         retval = create_cipher_auth_operation(ts_params,
12089                         ut_params,
12090                         reference, 0);
12091
12092         if (retval < 0)
12093                 return retval;
12094
12095         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12096                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12097                         ut_params->op);
12098         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12099                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12100                                 ut_params->op, 1, 1, 0, 0);
12101         else
12102                 ut_params->op = process_crypto_request(
12103                         ts_params->valid_devs[0], ut_params->op);
12104
12105         TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
12106
12107         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12108                         "crypto op processing failed");
12109
12110         plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
12111
12112         authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
12113                         ut_params->op->sym->auth.data.offset);
12114         auth_tag = authciphertext + plaintext_pad_len;
12115         debug_hexdump(stdout, "ciphertext:", authciphertext,
12116                         reference->ciphertext.len);
12117         debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
12118
12119         /* Validate obuf */
12120         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12121                         authciphertext,
12122                         reference->ciphertext.data,
12123                         reference->ciphertext.len,
12124                         "Ciphertext data not as expected");
12125
12126         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12127                         auth_tag,
12128                         reference->digest.data,
12129                         reference->digest.len,
12130                         "Generated digest not as expected");
12131
12132         return TEST_SUCCESS;
12133
12134 }
12135
12136 static int
12137 test_authenticated_decrypt_with_esn(
12138                 struct crypto_testsuite_params *ts_params,
12139                 struct crypto_unittest_params *ut_params,
12140                 const struct test_crypto_vector *reference)
12141 {
12142         int retval;
12143
12144         uint8_t *ciphertext;
12145         uint8_t cipher_key[reference->cipher_key.len + 1];
12146         uint8_t auth_key[reference->auth_key.len + 1];
12147         struct rte_cryptodev_info dev_info;
12148
12149         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12150         uint64_t feat_flags = dev_info.feature_flags;
12151
12152         if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12153                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12154                 printf("Device doesn't support RAW data-path APIs.\n");
12155                 return -ENOTSUP;
12156         }
12157
12158         /* Verify the capabilities */
12159         struct rte_cryptodev_sym_capability_idx cap_idx;
12160         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12161         cap_idx.algo.auth = reference->auth_algo;
12162         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12163                         &cap_idx) == NULL)
12164                 return -ENOTSUP;
12165         cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12166         cap_idx.algo.cipher = reference->crypto_algo;
12167         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12168                         &cap_idx) == NULL)
12169                 return -ENOTSUP;
12170
12171         /* Create session */
12172         memcpy(cipher_key, reference->cipher_key.data,
12173                         reference->cipher_key.len);
12174         memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12175
12176         /* Setup Authentication Parameters */
12177         ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12178         ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
12179         ut_params->auth_xform.auth.algo = reference->auth_algo;
12180         ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12181         ut_params->auth_xform.auth.key.data = auth_key;
12182         ut_params->auth_xform.auth.digest_length = reference->digest.len;
12183         ut_params->auth_xform.next = &ut_params->cipher_xform;
12184
12185         /* Setup Cipher Parameters */
12186         ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12187         ut_params->cipher_xform.next = NULL;
12188         ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12189         ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
12190         ut_params->cipher_xform.cipher.key.data = cipher_key;
12191         ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12192         ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12193         ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12194
12195         /* Create Crypto session*/
12196         ut_params->sess = rte_cryptodev_sym_session_create(
12197                         ts_params->session_mpool);
12198
12199         rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12200                                 ut_params->sess,
12201                                 &ut_params->auth_xform,
12202                                 ts_params->session_priv_mpool);
12203
12204         TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12205
12206         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12207         TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12208                         "Failed to allocate input buffer in mempool");
12209
12210         /* clear mbuf payload */
12211         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12212                         rte_pktmbuf_tailroom(ut_params->ibuf));
12213
12214         ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12215                         reference->ciphertext.len);
12216         TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12217         memcpy(ciphertext, reference->ciphertext.data,
12218                         reference->ciphertext.len);
12219
12220         /* Create operation */
12221         retval = create_cipher_auth_verify_operation(ts_params,
12222                         ut_params,
12223                         reference);
12224
12225         if (retval < 0)
12226                 return retval;
12227
12228         if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12229                 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12230                         ut_params->op);
12231         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12232                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12233                                 ut_params->op, 1, 1, 0, 0);
12234         else
12235                 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12236                         ut_params->op);
12237
12238         TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
12239         TEST_ASSERT_EQUAL(ut_params->op->status,
12240                         RTE_CRYPTO_OP_STATUS_SUCCESS,
12241                         "crypto op processing passed");
12242
12243         ut_params->obuf = ut_params->op->sym->m_src;
12244         TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
12245
12246         return 0;
12247 }
12248
12249 static int
12250 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
12251                 const struct aead_test_data *tdata,
12252                 void *digest_mem, uint64_t digest_phys)
12253 {
12254         struct crypto_testsuite_params *ts_params = &testsuite_params;
12255         struct crypto_unittest_params *ut_params = &unittest_params;
12256
12257         const unsigned int auth_tag_len = tdata->auth_tag.len;
12258         const unsigned int iv_len = tdata->iv.len;
12259         unsigned int aad_len = tdata->aad.len;
12260         unsigned int aad_len_pad = 0;
12261
12262         /* Generate Crypto op data structure */
12263         ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12264                         RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12265         TEST_ASSERT_NOT_NULL(ut_params->op,
12266                 "Failed to allocate symmetric crypto operation struct");
12267
12268         struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12269
12270         sym_op->aead.digest.data = digest_mem;
12271
12272         TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
12273                         "no room to append digest");
12274
12275         sym_op->aead.digest.phys_addr = digest_phys;
12276
12277         if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
12278                 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
12279                                 auth_tag_len);
12280                 debug_hexdump(stdout, "digest:",
12281                                 sym_op->aead.digest.data,
12282                                 auth_tag_len);
12283         }
12284
12285         /* Append aad data */
12286         if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
12287                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12288                                 uint8_t *, IV_OFFSET);
12289
12290                 /* Copy IV 1 byte after the IV pointer, according to the API */
12291                 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
12292
12293                 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
12294
12295                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12296                                 ut_params->ibuf, aad_len);
12297                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12298                                 "no room to prepend aad");
12299                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12300                                 ut_params->ibuf);
12301
12302                 memset(sym_op->aead.aad.data, 0, aad_len);
12303                 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
12304                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12305
12306                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12307                 debug_hexdump(stdout, "aad:",
12308                                 sym_op->aead.aad.data, aad_len);
12309         } else {
12310                 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12311                                 uint8_t *, IV_OFFSET);
12312
12313                 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
12314
12315                 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
12316
12317                 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12318                                 ut_params->ibuf, aad_len_pad);
12319                 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12320                                 "no room to prepend aad");
12321                 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12322                                 ut_params->ibuf);
12323
12324                 memset(sym_op->aead.aad.data, 0, aad_len);
12325                 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12326
12327                 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12328                 debug_hexdump(stdout, "aad:",
12329                                 sym_op->aead.aad.data, aad_len);
12330         }
12331
12332         sym_op->aead.data.length = tdata->plaintext.len;
12333         sym_op->aead.data.offset = aad_len_pad;
12334
12335         return 0;
12336 }
12337
12338 #define SGL_MAX_NO      16
12339
12340 static int
12341 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
12342                 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
12343 {
12344         struct crypto_testsuite_params *ts_params = &testsuite_params;
12345         struct crypto_unittest_params *ut_params = &unittest_params;
12346         struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
12347         int retval;
12348         int to_trn = 0;
12349         int to_trn_tbl[SGL_MAX_NO];
12350         int segs = 1;
12351         unsigned int trn_data = 0;
12352         uint8_t *plaintext, *ciphertext, *auth_tag;
12353         struct rte_cryptodev_info dev_info;
12354
12355         /* Verify the capabilities */
12356         struct rte_cryptodev_sym_capability_idx cap_idx;
12357         cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12358         cap_idx.algo.aead = tdata->algo;
12359         if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12360                         &cap_idx) == NULL)
12361                 return -ENOTSUP;
12362
12363         /* OOP not supported with CPU crypto */
12364         if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12365                 return -ENOTSUP;
12366
12367         /* Detailed check for the particular SGL support flag */
12368         rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12369         if (!oop) {
12370                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
12371                 if (sgl_in && (!(dev_info.feature_flags &
12372                                 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
12373                         return -ENOTSUP;
12374
12375                 uint64_t feat_flags = dev_info.feature_flags;
12376
12377                 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12378                         (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12379                         printf("Device doesn't support RAW data-path APIs.\n");
12380                         return -ENOTSUP;
12381                 }
12382         } else {
12383                 unsigned int sgl_in = fragsz < tdata->plaintext.len;
12384                 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
12385                                 tdata->plaintext.len;
12386                 /* Raw data path API does not support OOP */
12387                 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12388                         return -ENOTSUP;
12389                 if (sgl_in && !sgl_out) {
12390                         if (!(dev_info.feature_flags &
12391                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
12392                                 return -ENOTSUP;
12393                 } else if (!sgl_in && sgl_out) {
12394                         if (!(dev_info.feature_flags &
12395                                         RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
12396                                 return -ENOTSUP;
12397                 } else if (sgl_in && sgl_out) {
12398                         if (!(dev_info.feature_flags &
12399                                         RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
12400                                 return -ENOTSUP;
12401                 }
12402         }
12403
12404         if (fragsz > tdata->plaintext.len)
12405                 fragsz = tdata->plaintext.len;
12406
12407         uint16_t plaintext_len = fragsz;
12408         uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
12409
12410         if (fragsz_oop > tdata->plaintext.len)
12411                 frag_size_oop = tdata->plaintext.len;
12412
12413         int ecx = 0;
12414         void *digest_mem = NULL;
12415
12416         uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
12417
12418         if (tdata->plaintext.len % fragsz != 0) {
12419                 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
12420                         return 1;
12421         }       else {
12422                 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
12423                         return 1;
12424         }
12425
12426         /*
12427          * For out-op-place we need to alloc another mbuf
12428          */
12429         if (oop) {
12430                 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12431                 rte_pktmbuf_append(ut_params->obuf,
12432                                 frag_size_oop + prepend_len);
12433                 buf_oop = ut_params->obuf;
12434         }
12435
12436         /* Create AEAD session */
12437         retval = create_aead_session(ts_params->valid_devs[0],
12438                         tdata->algo,
12439                         RTE_CRYPTO_AEAD_OP_ENCRYPT,
12440                         tdata->key.data, tdata->key.len,
12441                         tdata->aad.len, tdata->auth_tag.len,
12442                         tdata->iv.len);
12443         if (retval < 0)
12444                 return retval;
12445
12446         ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12447
12448         /* clear mbuf payload */
12449         memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12450                         rte_pktmbuf_tailroom(ut_params->ibuf));
12451
12452         plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12453                         plaintext_len);
12454
12455         memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12456
12457         trn_data += plaintext_len;
12458
12459         buf = ut_params->ibuf;
12460
12461         /*
12462          * Loop until no more fragments
12463          */
12464
12465         while (trn_data < tdata->plaintext.len) {
12466                 ++segs;
12467                 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12468                                 (tdata->plaintext.len - trn_data) : fragsz;
12469
12470                 to_trn_tbl[ecx++] = to_trn;
12471
12472                 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12473                 buf = buf->next;
12474
12475                 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12476                                 rte_pktmbuf_tailroom(buf));
12477
12478                 /* OOP */
12479                 if (oop && !fragsz_oop) {
12480                         buf_last_oop = buf_oop->next =
12481                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
12482                         buf_oop = buf_oop->next;
12483                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12484                                         0, rte_pktmbuf_tailroom(buf_oop));
12485                         rte_pktmbuf_append(buf_oop, to_trn);
12486                 }
12487
12488                 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12489                                 to_trn);
12490
12491                 memcpy(plaintext, tdata->plaintext.data + trn_data,
12492                                 to_trn);
12493                 trn_data += to_trn;
12494                 if (trn_data  == tdata->plaintext.len) {
12495                         if (oop) {
12496                                 if (!fragsz_oop)
12497                                         digest_mem = rte_pktmbuf_append(buf_oop,
12498                                                 tdata->auth_tag.len);
12499                         } else
12500                                 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12501                                         tdata->auth_tag.len);
12502                 }
12503         }
12504
12505         uint64_t digest_phys = 0;
12506
12507         ut_params->ibuf->nb_segs = segs;
12508
12509         segs = 1;
12510         if (fragsz_oop && oop) {
12511                 to_trn = 0;
12512                 ecx = 0;
12513
12514                 if (frag_size_oop == tdata->plaintext.len) {
12515                         digest_mem = rte_pktmbuf_append(ut_params->obuf,
12516                                 tdata->auth_tag.len);
12517
12518                         digest_phys = rte_pktmbuf_iova_offset(
12519                                         ut_params->obuf,
12520                                         tdata->plaintext.len + prepend_len);
12521                 }
12522
12523                 trn_data = frag_size_oop;
12524                 while (trn_data < tdata->plaintext.len) {
12525                         ++segs;
12526                         to_trn =
12527                                 (tdata->plaintext.len - trn_data <
12528                                                 frag_size_oop) ?
12529                                 (tdata->plaintext.len - trn_data) :
12530                                                 frag_size_oop;
12531
12532                         to_trn_tbl[ecx++] = to_trn;
12533
12534                         buf_last_oop = buf_oop->next =
12535                                         rte_pktmbuf_alloc(ts_params->mbuf_pool);
12536                         buf_oop = buf_oop->next;
12537                         memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12538                                         0, rte_pktmbuf_tailroom(buf_oop));
12539                         rte_pktmbuf_append(buf_oop, to_trn);
12540
12541                         trn_data += to_trn;
12542
12543                         if (trn_data  == tdata->plaintext.len) {
12544                                 digest_mem = rte_pktmbuf_append(buf_oop,
12545                                         tdata->auth_tag.len);
12546                         }
12547                 }
12548
12549                 ut_params->obuf->nb_segs = segs;
12550         }
12551
12552         /*
12553          * Place digest at the end of the last buffer
12554          */
12555         if (!digest_phys)
12556                 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12557         if (oop && buf_last_oop)
12558                 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
12559
12560         if (!digest_mem && !oop) {
12561                 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12562                                 + tdata->auth_tag.len);
12563                 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12564                                 tdata->plaintext.len);
12565         }
12566
12567         /* Create AEAD operation */
12568         retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
12569                         tdata, digest_mem, digest_phys);
12570
12571         if (retval < 0)
12572                 return retval;
12573
12574         rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12575
12576         ut_params->op->sym->m_src = ut_params->ibuf;
12577         if (oop)
12578                 ut_params->op->sym->m_dst = ut_params->obuf;
12579
12580         /* Process crypto operation */
12581         if (oop == IN_PLACE &&
12582                         gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12583                 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
12584         else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12585                 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12586                                 ut_params->op, 0, 0, 0, 0);
12587         else
12588                 TEST_ASSERT_NOT_NULL(
12589                         process_crypto_request(ts_params->valid_devs[0],
12590                         ut_params->op), "failed to process sym crypto op");
12591
12592         TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12593                         "crypto op processing failed");
12594
12595
12596         ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
12597                         uint8_t *, prepend_len);
12598         if (oop) {
12599                 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12600                                 uint8_t *, prepend_len);
12601         }
12602
12603         if (fragsz_oop)
12604                 fragsz = fragsz_oop;
12605
12606         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12607                         ciphertext,
12608                         tdata->ciphertext.data,
12609                         fragsz,
12610                         "Ciphertext data not as expected");
12611
12612         buf = ut_params->op->sym->m_src->next;
12613         if (oop)
12614                 buf = ut_params->op->sym->m_dst->next;
12615
12616         unsigned int off = fragsz;
12617
12618         ecx = 0;
12619         while (buf) {
12620                 ciphertext = rte_pktmbuf_mtod(buf,
12621                                 uint8_t *);
12622
12623                 TEST_ASSERT_BUFFERS_ARE_EQUAL(
12624                                 ciphertext,
12625                                 tdata->ciphertext.data + off,
12626                                 to_trn_tbl[ecx],
12627                                 "Ciphertext data not as expected");
12628
12629                 off += to_trn_tbl[ecx++];
12630                 buf = buf->next;
12631         }
12632
12633         auth_tag = digest_mem;
12634         TEST_ASSERT_BUFFERS_ARE_EQUAL(
12635                         auth_tag,
12636                         tdata->auth_tag.data,
12637                         tdata->auth_tag.len,
12638                         "Generated auth tag not as expected");
12639
12640         return 0;
12641 }
12642
12643 static int
12644 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
12645 {
12646         return test_authenticated_encryption_SGL(
12647                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
12648 }
12649
12650 static int
12651 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
12652 {
12653         return test_authenticated_encryption_SGL(
12654                         &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
12655 }
12656
12657 static int
12658 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
12659 {
12660         return test_authenticated_encryption_SGL(
12661                         &gcm_test_case_8, OUT_OF_PLACE, 400,
12662                         gcm_test_case_8.plaintext.len);
12663 }
12664
12665 static int
12666 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
12667 {
12668         /* This test is not for OPENSSL PMD */
12669         if (gbl_driver_id == rte_cryptodev_driver_id_get(
12670                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
12671                 return -ENOTSUP;
12672
12673         return test_authenticated_encryption_SGL(
12674                         &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
12675 }
12676
12677 static int
12678 test_authentication_verify_fail_when_data_corrupted(
12679                 struct crypto_testsuite_params *ts_params,
12680                 struct crypto_unittest_params *ut_params,
12681                 const struct test_crypto_vector *reference)
12682 {
12683         return test_authentication_verify_fail_when_data_corruption(
12684                         ts_params, ut_params, reference, 1);
12685 }
12686
12687 static int
12688 test_authentication_verify_fail_when_tag_corrupted(
12689                 struct crypto_testsuite_params *ts_params,
12690                 struct crypto_unittest_params *ut_params,
12691                 const struct test_crypto_vector *reference)
12692 {
12693         return test_authentication_verify_fail_when_data_corruption(
12694                         ts_params, ut_params, reference, 0);
12695 }
12696
12697 static int
12698 test_authentication_verify_GMAC_fail_when_data_corrupted(
12699                 struct crypto_testsuite_params *ts_params,
12700                 struct crypto_unittest_params *ut_params,
12701                 const struct test_crypto_vector *reference)
12702 {
12703         return test_authentication_verify_GMAC_fail_when_corruption(
12704                         ts_params, ut_params, reference, 1);
12705 }
12706
12707 static int
12708 test_authentication_verify_GMAC_fail_when_tag_corrupted(
12709                 struct crypto_testsuite_params *ts_params,
12710                 struct crypto_unittest_params *ut_params,
12711                 const struct test_crypto_vector *reference)
12712 {
12713         return test_authentication_verify_GMAC_fail_when_corruption(
12714                         ts_params, ut_params, reference, 0);
12715 }
12716
12717 static int
12718 test_authenticated_decryption_fail_when_data_corrupted(
12719                 struct crypto_testsuite_params *ts_params,
12720                 struct crypto_unittest_params *ut_params,
12721                 const struct test_crypto_vector *reference)
12722 {
12723         return test_authenticated_decryption_fail_when_corruption(
12724                         ts_params, ut_params, reference, 1);
12725 }
12726
12727 static int
12728 test_authenticated_decryption_fail_when_tag_corrupted(
12729                 struct crypto_testsuite_params *ts_params,
12730                 struct crypto_unittest_params *ut_params,
12731                 const struct test_crypto_vector *reference)
12732 {
12733         return test_authenticated_decryption_fail_when_corruption(
12734                         ts_params, ut_params, reference, 0);
12735 }
12736
12737 static int
12738 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
12739 {
12740         return test_authentication_verify_fail_when_data_corrupted(
12741                         &testsuite_params, &unittest_params,
12742                         &hmac_sha1_test_crypto_vector);
12743 }
12744
12745 static int
12746 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
12747 {
12748         return test_authentication_verify_fail_when_tag_corrupted(
12749                         &testsuite_params, &unittest_params,
12750                         &hmac_sha1_test_crypto_vector);
12751 }
12752
12753 static int
12754 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
12755 {
12756         return test_authentication_verify_GMAC_fail_when_data_corrupted(
12757                         &testsuite_params, &unittest_params,
12758                         &aes128_gmac_test_vector);
12759 }
12760
12761 static int
12762 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
12763 {
12764         return test_authentication_verify_GMAC_fail_when_tag_corrupted(
12765                         &testsuite_params, &unittest_params,
12766                         &aes128_gmac_test_vector);
12767 }
12768
12769 static int
12770 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
12771 {
12772         return test_authenticated_decryption_fail_when_data_corrupted(
12773                         &testsuite_params,
12774                         &unittest_params,
12775                         &aes128cbc_hmac_sha1_test_vector);
12776 }
12777
12778 static int
12779 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
12780 {
12781         return test_authenticated_decryption_fail_when_tag_corrupted(
12782                         &testsuite_params,
12783                         &unittest_params,
12784                         &aes128cbc_hmac_sha1_test_vector);
12785 }
12786
12787 static int
12788 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
12789 {
12790         return test_authenticated_encryt_with_esn(
12791                         &testsuite_params,
12792                         &unittest_params,
12793                         &aes128cbc_hmac_sha1_aad_test_vector);
12794 }
12795
12796 static int
12797 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
12798 {
12799         return test_authenticated_decrypt_with_esn(
12800                         &testsuite_params,
12801                         &unittest_params,
12802                         &aes128cbc_hmac_sha1_aad_test_vector);
12803 }
12804
12805 static int
12806 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
12807 {
12808         return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
12809 }
12810
12811 static int
12812 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
12813 {
12814         return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
12815 }
12816
12817 #ifdef RTE_CRYPTO_SCHEDULER
12818
12819 /* global AESNI worker IDs for the scheduler test */
12820 uint8_t aesni_ids[2];
12821
12822 static int
12823 test_scheduler_attach_slave_op(void)
12824 {
12825         struct crypto_testsuite_params *ts_params = &testsuite_params;
12826         uint8_t sched_id = ts_params->valid_devs[0];
12827         uint32_t nb_devs, i, nb_devs_attached = 0;
12828         int ret;
12829         char vdev_name[32];
12830
12831         /* create 2 AESNI_MB if necessary */
12832         nb_devs = rte_cryptodev_device_count_by_driver(
12833                         rte_cryptodev_driver_id_get(
12834                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
12835         if (nb_devs < 2) {
12836                 for (i = nb_devs; i < 2; i++) {
12837                         snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
12838                                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
12839                                         i);
12840                         ret = rte_vdev_init(vdev_name, NULL);
12841
12842                         TEST_ASSERT(ret == 0,
12843                                 "Failed to create instance %u of"
12844                                 " pmd : %s",
12845                                 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
12846                 }
12847         }
12848
12849         /* attach 2 AESNI_MB cdevs */
12850         for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
12851                         i++) {
12852                 struct rte_cryptodev_info info;
12853                 unsigned int session_size;
12854
12855                 rte_cryptodev_info_get(i, &info);
12856                 if (info.driver_id != rte_cryptodev_driver_id_get(
12857                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
12858                         continue;
12859
12860                 session_size = rte_cryptodev_sym_get_private_session_size(i);
12861                 /*
12862                  * Create the session mempool again, since now there are new devices
12863                  * to use the mempool.
12864                  */
12865                 if (ts_params->session_mpool) {
12866                         rte_mempool_free(ts_params->session_mpool);
12867                         ts_params->session_mpool = NULL;
12868                 }
12869                 if (ts_params->session_priv_mpool) {
12870                         rte_mempool_free(ts_params->session_priv_mpool);
12871                         ts_params->session_priv_mpool = NULL;
12872                 }
12873
12874                 if (info.sym.max_nb_sessions != 0 &&
12875                                 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
12876                         RTE_LOG(ERR, USER1,
12877                                         "Device does not support "
12878                                         "at least %u sessions\n",
12879                                         MAX_NB_SESSIONS);
12880                         return TEST_FAILED;
12881                 }
12882                 /*
12883                  * Create mempool with maximum number of sessions,
12884                  * to include the session headers
12885                  */
12886                 if (ts_params->session_mpool == NULL) {
12887                         ts_params->session_mpool =
12888                                 rte_cryptodev_sym_session_pool_create(
12889                                                 "test_sess_mp",
12890                                                 MAX_NB_SESSIONS, 0, 0, 0,
12891                                                 SOCKET_ID_ANY);
12892                         TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
12893                                         "session mempool allocation failed");
12894                 }
12895
12896                 /*
12897                  * Create mempool with maximum number of sessions,
12898                  * to include device specific session private data
12899                  */
12900                 if (ts_params->session_priv_mpool == NULL) {
12901                         ts_params->session_priv_mpool = rte_mempool_create(
12902                                         "test_sess_mp_priv",
12903                                         MAX_NB_SESSIONS,
12904                                         session_size,
12905                                         0, 0, NULL, NULL, NULL,
12906                                         NULL, SOCKET_ID_ANY,
12907                                         0);
12908
12909                         TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
12910                                         "session mempool allocation failed");
12911                 }
12912
12913                 ts_params->qp_conf.mp_session = ts_params->session_mpool;
12914                 ts_params->qp_conf.mp_session_private =
12915                                 ts_params->session_priv_mpool;
12916
12917                 ret = rte_cryptodev_scheduler_worker_attach(sched_id,
12918                                 (uint8_t)i);
12919
12920                 TEST_ASSERT(ret == 0,
12921                         "Failed to attach device %u of pmd : %s", i,
12922                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
12923
12924                 aesni_ids[nb_devs_attached] = (uint8_t)i;
12925
12926                 nb_devs_attached++;
12927         }
12928
12929         return 0;
12930 }
12931
12932 static int
12933 test_scheduler_detach_slave_op(void)
12934 {
12935         struct crypto_testsuite_params *ts_params = &testsuite_params;
12936         uint8_t sched_id = ts_params->valid_devs[0];
12937         uint32_t i;
12938         int ret;
12939
12940         for (i = 0; i < 2; i++) {
12941                 ret = rte_cryptodev_scheduler_worker_detach(sched_id,
12942                                 aesni_ids[i]);
12943                 TEST_ASSERT(ret == 0,
12944                         "Failed to detach device %u", aesni_ids[i]);
12945         }
12946
12947         return 0;
12948 }
12949
12950 static int
12951 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
12952 {
12953         struct crypto_testsuite_params *ts_params = &testsuite_params;
12954         uint8_t sched_id = ts_params->valid_devs[0];
12955         /* set mode */
12956         return rte_cryptodev_scheduler_mode_set(sched_id,
12957                 scheduler_mode);
12958 }
12959
12960 static int
12961 test_scheduler_mode_roundrobin_op(void)
12962 {
12963         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
12964                         0, "Failed to set roundrobin mode");
12965         return 0;
12966
12967 }
12968
12969 static int
12970 test_scheduler_mode_multicore_op(void)
12971 {
12972         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
12973                         0, "Failed to set multicore mode");
12974
12975         return 0;
12976 }
12977
12978 static int
12979 test_scheduler_mode_failover_op(void)
12980 {
12981         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
12982                         0, "Failed to set failover mode");
12983
12984         return 0;
12985 }
12986
12987 static int
12988 test_scheduler_mode_pkt_size_distr_op(void)
12989 {
12990         TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
12991                         0, "Failed to set pktsize mode");
12992
12993         return 0;
12994 }
12995
12996 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
12997         .suite_name = "Crypto Device Scheduler Unit Test Suite",
12998         .setup = testsuite_setup,
12999         .teardown = testsuite_teardown,
13000         .unit_test_cases = {
13001                 /* Multi Core */
13002                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13003                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),
13004                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13005                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13006                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13007                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13008
13009                 /* Round Robin */
13010                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13011                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),
13012                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13013                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13014                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13015                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13016
13017                 /* Fail over */
13018                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13019                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),
13020                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13021                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13022                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13023                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13024
13025                 /* PKT SIZE */
13026                 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13027                 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),
13028                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13029                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13030                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13031                 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13032
13033                 TEST_CASES_END() /**< NULL terminate unit test array */
13034         }
13035 };
13036
13037 #endif /* RTE_CRYPTO_SCHEDULER */
13038
13039 static struct unit_test_suite cryptodev_testsuite  = {
13040         .suite_name = "Crypto Unit Test Suite",
13041         .setup = testsuite_setup,
13042         .teardown = testsuite_teardown,
13043         .unit_test_cases = {
13044                 TEST_CASE_ST(ut_setup, ut_teardown,
13045                                 test_device_configure_invalid_dev_id),
13046                 TEST_CASE_ST(ut_setup, ut_teardown,
13047                                 test_queue_pair_descriptor_setup),
13048                 TEST_CASE_ST(ut_setup, ut_teardown,
13049                                 test_device_configure_invalid_queue_pair_ids),
13050
13051                 TEST_CASE_ST(ut_setup, ut_teardown,
13052                                 test_multi_session),
13053                 TEST_CASE_ST(ut_setup, ut_teardown,
13054                                 test_multi_session_random_usage),
13055
13056                 TEST_CASE_ST(ut_setup, ut_teardown,
13057                         test_null_invalid_operation),
13058                 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
13059
13060                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13061                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13062                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13063                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13064                 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all),
13065                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all),
13066                 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all),
13067                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13068                 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
13069
13070                 /** AES CCM Authenticated Encryption 128 bits key */
13071                 TEST_CASE_ST(ut_setup, ut_teardown,
13072                         test_AES_CCM_authenticated_encryption_test_case_128_1),
13073                 TEST_CASE_ST(ut_setup, ut_teardown,
13074                         test_AES_CCM_authenticated_encryption_test_case_128_2),
13075                 TEST_CASE_ST(ut_setup, ut_teardown,
13076                         test_AES_CCM_authenticated_encryption_test_case_128_3),
13077
13078                 /** AES CCM Authenticated Decryption 128 bits key*/
13079                 TEST_CASE_ST(ut_setup, ut_teardown,
13080                         test_AES_CCM_authenticated_decryption_test_case_128_1),
13081                 TEST_CASE_ST(ut_setup, ut_teardown,
13082                         test_AES_CCM_authenticated_decryption_test_case_128_2),
13083                 TEST_CASE_ST(ut_setup, ut_teardown,
13084                         test_AES_CCM_authenticated_decryption_test_case_128_3),
13085
13086                 /** AES CCM Authenticated Encryption 192 bits key */
13087                 TEST_CASE_ST(ut_setup, ut_teardown,
13088                         test_AES_CCM_authenticated_encryption_test_case_192_1),
13089                 TEST_CASE_ST(ut_setup, ut_teardown,
13090                         test_AES_CCM_authenticated_encryption_test_case_192_2),
13091                 TEST_CASE_ST(ut_setup, ut_teardown,
13092                         test_AES_CCM_authenticated_encryption_test_case_192_3),
13093
13094                 /** AES CCM Authenticated Decryption 192 bits key*/
13095                 TEST_CASE_ST(ut_setup, ut_teardown,
13096                         test_AES_CCM_authenticated_decryption_test_case_192_1),
13097                 TEST_CASE_ST(ut_setup, ut_teardown,
13098                         test_AES_CCM_authenticated_decryption_test_case_192_2),
13099                 TEST_CASE_ST(ut_setup, ut_teardown,
13100                         test_AES_CCM_authenticated_decryption_test_case_192_3),
13101
13102                 /** AES CCM Authenticated Encryption 256 bits key */
13103                 TEST_CASE_ST(ut_setup, ut_teardown,
13104                         test_AES_CCM_authenticated_encryption_test_case_256_1),
13105                 TEST_CASE_ST(ut_setup, ut_teardown,
13106                         test_AES_CCM_authenticated_encryption_test_case_256_2),
13107                 TEST_CASE_ST(ut_setup, ut_teardown,
13108                         test_AES_CCM_authenticated_encryption_test_case_256_3),
13109
13110                 /** AES CCM Authenticated Decryption 256 bits key*/
13111                 TEST_CASE_ST(ut_setup, ut_teardown,
13112                         test_AES_CCM_authenticated_decryption_test_case_256_1),
13113                 TEST_CASE_ST(ut_setup, ut_teardown,
13114                         test_AES_CCM_authenticated_decryption_test_case_256_2),
13115                 TEST_CASE_ST(ut_setup, ut_teardown,
13116                         test_AES_CCM_authenticated_decryption_test_case_256_3),
13117
13118                 /** AES GCM Authenticated Encryption */
13119                 TEST_CASE_ST(ut_setup, ut_teardown,
13120                         test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
13121                 TEST_CASE_ST(ut_setup, ut_teardown,
13122                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
13123                 TEST_CASE_ST(ut_setup, ut_teardown,
13124                         test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
13125                 TEST_CASE_ST(ut_setup, ut_teardown,
13126                         test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
13127                 TEST_CASE_ST(ut_setup, ut_teardown,
13128                         test_AES_GCM_authenticated_encryption_test_case_1),
13129                 TEST_CASE_ST(ut_setup, ut_teardown,
13130                         test_AES_GCM_authenticated_encryption_test_case_2),
13131                 TEST_CASE_ST(ut_setup, ut_teardown,
13132                         test_AES_GCM_authenticated_encryption_test_case_3),
13133                 TEST_CASE_ST(ut_setup, ut_teardown,
13134                         test_AES_GCM_authenticated_encryption_test_case_4),
13135                 TEST_CASE_ST(ut_setup, ut_teardown,
13136                         test_AES_GCM_authenticated_encryption_test_case_5),
13137                 TEST_CASE_ST(ut_setup, ut_teardown,
13138                         test_AES_GCM_authenticated_encryption_test_case_6),
13139                 TEST_CASE_ST(ut_setup, ut_teardown,
13140                         test_AES_GCM_authenticated_encryption_test_case_7),
13141                 TEST_CASE_ST(ut_setup, ut_teardown,
13142                         test_AES_GCM_authenticated_encryption_test_case_8),
13143                 TEST_CASE_ST(ut_setup, ut_teardown,
13144                         test_AES_GCM_J0_authenticated_encryption_test_case_1),
13145
13146                 /** AES GCM Authenticated Decryption */
13147                 TEST_CASE_ST(ut_setup, ut_teardown,
13148                         test_AES_GCM_authenticated_decryption_test_case_1),
13149                 TEST_CASE_ST(ut_setup, ut_teardown,
13150                         test_AES_GCM_authenticated_decryption_test_case_2),
13151                 TEST_CASE_ST(ut_setup, ut_teardown,
13152                         test_AES_GCM_authenticated_decryption_test_case_3),
13153                 TEST_CASE_ST(ut_setup, ut_teardown,
13154                         test_AES_GCM_authenticated_decryption_test_case_4),
13155                 TEST_CASE_ST(ut_setup, ut_teardown,
13156                         test_AES_GCM_authenticated_decryption_test_case_5),
13157                 TEST_CASE_ST(ut_setup, ut_teardown,
13158                         test_AES_GCM_authenticated_decryption_test_case_6),
13159                 TEST_CASE_ST(ut_setup, ut_teardown,
13160                         test_AES_GCM_authenticated_decryption_test_case_7),
13161                 TEST_CASE_ST(ut_setup, ut_teardown,
13162                         test_AES_GCM_authenticated_decryption_test_case_8),
13163                 TEST_CASE_ST(ut_setup, ut_teardown,
13164                         test_AES_GCM_J0_authenticated_decryption_test_case_1),
13165
13166                 /** AES GCM Authenticated Encryption 192 bits key */
13167                 TEST_CASE_ST(ut_setup, ut_teardown,
13168                         test_AES_GCM_auth_encryption_test_case_192_1),
13169                 TEST_CASE_ST(ut_setup, ut_teardown,
13170                         test_AES_GCM_auth_encryption_test_case_192_2),
13171                 TEST_CASE_ST(ut_setup, ut_teardown,
13172                         test_AES_GCM_auth_encryption_test_case_192_3),
13173                 TEST_CASE_ST(ut_setup, ut_teardown,
13174                         test_AES_GCM_auth_encryption_test_case_192_4),
13175                 TEST_CASE_ST(ut_setup, ut_teardown,
13176                         test_AES_GCM_auth_encryption_test_case_192_5),
13177                 TEST_CASE_ST(ut_setup, ut_teardown,
13178                         test_AES_GCM_auth_encryption_test_case_192_6),
13179                 TEST_CASE_ST(ut_setup, ut_teardown,
13180                         test_AES_GCM_auth_encryption_test_case_192_7),
13181
13182                 /** AES GCM Authenticated Decryption 192 bits key */
13183                 TEST_CASE_ST(ut_setup, ut_teardown,
13184                         test_AES_GCM_auth_decryption_test_case_192_1),
13185                 TEST_CASE_ST(ut_setup, ut_teardown,
13186                         test_AES_GCM_auth_decryption_test_case_192_2),
13187                 TEST_CASE_ST(ut_setup, ut_teardown,
13188                         test_AES_GCM_auth_decryption_test_case_192_3),
13189                 TEST_CASE_ST(ut_setup, ut_teardown,
13190                         test_AES_GCM_auth_decryption_test_case_192_4),
13191                 TEST_CASE_ST(ut_setup, ut_teardown,
13192                         test_AES_GCM_auth_decryption_test_case_192_5),
13193                 TEST_CASE_ST(ut_setup, ut_teardown,
13194                         test_AES_GCM_auth_decryption_test_case_192_6),
13195                 TEST_CASE_ST(ut_setup, ut_teardown,
13196                         test_AES_GCM_auth_decryption_test_case_192_7),
13197
13198                 /** AES GCM Authenticated Encryption 256 bits key */
13199                 TEST_CASE_ST(ut_setup, ut_teardown,
13200                         test_AES_GCM_auth_encryption_test_case_256_1),
13201                 TEST_CASE_ST(ut_setup, ut_teardown,
13202                         test_AES_GCM_auth_encryption_test_case_256_2),
13203                 TEST_CASE_ST(ut_setup, ut_teardown,
13204                         test_AES_GCM_auth_encryption_test_case_256_3),
13205                 TEST_CASE_ST(ut_setup, ut_teardown,
13206                         test_AES_GCM_auth_encryption_test_case_256_4),
13207                 TEST_CASE_ST(ut_setup, ut_teardown,
13208                         test_AES_GCM_auth_encryption_test_case_256_5),
13209                 TEST_CASE_ST(ut_setup, ut_teardown,
13210                         test_AES_GCM_auth_encryption_test_case_256_6),
13211                 TEST_CASE_ST(ut_setup, ut_teardown,
13212                         test_AES_GCM_auth_encryption_test_case_256_7),
13213
13214                 /** AES GCM Authenticated Decryption 256 bits key */
13215                 TEST_CASE_ST(ut_setup, ut_teardown,
13216                         test_AES_GCM_auth_decryption_test_case_256_1),
13217                 TEST_CASE_ST(ut_setup, ut_teardown,
13218                         test_AES_GCM_auth_decryption_test_case_256_2),
13219                 TEST_CASE_ST(ut_setup, ut_teardown,
13220                         test_AES_GCM_auth_decryption_test_case_256_3),
13221                 TEST_CASE_ST(ut_setup, ut_teardown,
13222                         test_AES_GCM_auth_decryption_test_case_256_4),
13223                 TEST_CASE_ST(ut_setup, ut_teardown,
13224                         test_AES_GCM_auth_decryption_test_case_256_5),
13225                 TEST_CASE_ST(ut_setup, ut_teardown,
13226                         test_AES_GCM_auth_decryption_test_case_256_6),
13227                 TEST_CASE_ST(ut_setup, ut_teardown,
13228                         test_AES_GCM_auth_decryption_test_case_256_7),
13229
13230                 /** AES GCM Authenticated Encryption big aad size */
13231                 TEST_CASE_ST(ut_setup, ut_teardown,
13232                         test_AES_GCM_auth_encryption_test_case_aad_1),
13233                 TEST_CASE_ST(ut_setup, ut_teardown,
13234                         test_AES_GCM_auth_encryption_test_case_aad_2),
13235
13236                 /** AES GCM Authenticated Decryption big aad size */
13237                 TEST_CASE_ST(ut_setup, ut_teardown,
13238                         test_AES_GCM_auth_decryption_test_case_aad_1),
13239                 TEST_CASE_ST(ut_setup, ut_teardown,
13240                         test_AES_GCM_auth_decryption_test_case_aad_2),
13241
13242                 /** Out of place tests */
13243                 TEST_CASE_ST(ut_setup, ut_teardown,
13244                         test_AES_GCM_authenticated_encryption_oop_test_case_1),
13245                 TEST_CASE_ST(ut_setup, ut_teardown,
13246                         test_AES_GCM_authenticated_decryption_oop_test_case_1),
13247
13248                 /** Session-less tests */
13249                 TEST_CASE_ST(ut_setup, ut_teardown,
13250                         test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
13251                 TEST_CASE_ST(ut_setup, ut_teardown,
13252                         test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
13253
13254                 /** AES GMAC Authentication */
13255                 TEST_CASE_ST(ut_setup, ut_teardown,
13256                         test_AES_GMAC_authentication_test_case_1),
13257                 TEST_CASE_ST(ut_setup, ut_teardown,
13258                         test_AES_GMAC_authentication_verify_test_case_1),
13259                 TEST_CASE_ST(ut_setup, ut_teardown,
13260                         test_AES_GMAC_authentication_test_case_2),
13261                 TEST_CASE_ST(ut_setup, ut_teardown,
13262                         test_AES_GMAC_authentication_verify_test_case_2),
13263                 TEST_CASE_ST(ut_setup, ut_teardown,
13264                         test_AES_GMAC_authentication_test_case_3),
13265                 TEST_CASE_ST(ut_setup, ut_teardown,
13266                         test_AES_GMAC_authentication_verify_test_case_3),
13267                 TEST_CASE_ST(ut_setup, ut_teardown,
13268                         test_AES_GMAC_authentication_test_case_4),
13269                 TEST_CASE_ST(ut_setup, ut_teardown,
13270                         test_AES_GMAC_authentication_verify_test_case_4),
13271                 TEST_CASE_ST(ut_setup, ut_teardown,
13272                         test_AES_GMAC_authentication_SGL_40B),
13273                 TEST_CASE_ST(ut_setup, ut_teardown,
13274                         test_AES_GMAC_authentication_SGL_80B),
13275                 TEST_CASE_ST(ut_setup, ut_teardown,
13276                         test_AES_GMAC_authentication_SGL_2048B),
13277                 TEST_CASE_ST(ut_setup, ut_teardown,
13278                         test_AES_GMAC_authentication_SGL_2047B),
13279
13280                 /** Chacha20-Poly1305 */
13281                 TEST_CASE_ST(ut_setup, ut_teardown,
13282                         test_chacha20_poly1305_encrypt_test_case_rfc8439),
13283                 TEST_CASE_ST(ut_setup, ut_teardown,
13284                         test_chacha20_poly1305_decrypt_test_case_rfc8439),
13285                 /** SNOW 3G encrypt only (UEA2) */
13286                 TEST_CASE_ST(ut_setup, ut_teardown,
13287                         test_snow3g_encryption_test_case_1),
13288                 TEST_CASE_ST(ut_setup, ut_teardown,
13289                         test_snow3g_encryption_test_case_2),
13290                 TEST_CASE_ST(ut_setup, ut_teardown,
13291                         test_snow3g_encryption_test_case_3),
13292                 TEST_CASE_ST(ut_setup, ut_teardown,
13293                         test_snow3g_encryption_test_case_4),
13294                 TEST_CASE_ST(ut_setup, ut_teardown,
13295                         test_snow3g_encryption_test_case_5),
13296
13297                 TEST_CASE_ST(ut_setup, ut_teardown,
13298                         test_snow3g_encryption_test_case_1_oop),
13299                 TEST_CASE_ST(ut_setup, ut_teardown,
13300                         test_snow3g_encryption_test_case_1_oop_sgl),
13301                 TEST_CASE_ST(ut_setup, ut_teardown,
13302                         test_snow3g_encryption_test_case_1_offset_oop),
13303                 TEST_CASE_ST(ut_setup, ut_teardown,
13304                         test_snow3g_decryption_test_case_1_oop),
13305
13306                 /** SNOW 3G generate auth, then encrypt (UEA2) */
13307                 TEST_CASE_ST(ut_setup, ut_teardown,
13308                         test_snow3g_auth_cipher_test_case_1),
13309                 TEST_CASE_ST(ut_setup, ut_teardown,
13310                         test_snow3g_auth_cipher_test_case_2),
13311                 TEST_CASE_ST(ut_setup, ut_teardown,
13312                         test_snow3g_auth_cipher_test_case_2_oop),
13313                 TEST_CASE_ST(ut_setup, ut_teardown,
13314                         test_snow3g_auth_cipher_part_digest_enc),
13315                 TEST_CASE_ST(ut_setup, ut_teardown,
13316                         test_snow3g_auth_cipher_part_digest_enc_oop),
13317                 TEST_CASE_ST(ut_setup, ut_teardown,
13318                         test_snow3g_auth_cipher_test_case_3_sgl),
13319                 TEST_CASE_ST(ut_setup, ut_teardown,
13320                         test_snow3g_auth_cipher_test_case_3_oop_sgl),
13321                 TEST_CASE_ST(ut_setup, ut_teardown,
13322                         test_snow3g_auth_cipher_part_digest_enc_sgl),
13323                 TEST_CASE_ST(ut_setup, ut_teardown,
13324                         test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
13325
13326                 /** SNOW 3G decrypt (UEA2), then verify auth */
13327                 TEST_CASE_ST(ut_setup, ut_teardown,
13328                         test_snow3g_auth_cipher_verify_test_case_1),
13329                 TEST_CASE_ST(ut_setup, ut_teardown,
13330                         test_snow3g_auth_cipher_verify_test_case_2),
13331                 TEST_CASE_ST(ut_setup, ut_teardown,
13332                         test_snow3g_auth_cipher_verify_test_case_2_oop),
13333                 TEST_CASE_ST(ut_setup, ut_teardown,
13334                         test_snow3g_auth_cipher_verify_part_digest_enc),
13335                 TEST_CASE_ST(ut_setup, ut_teardown,
13336                         test_snow3g_auth_cipher_verify_part_digest_enc_oop),
13337                 TEST_CASE_ST(ut_setup, ut_teardown,
13338                         test_snow3g_auth_cipher_verify_test_case_3_sgl),
13339                 TEST_CASE_ST(ut_setup, ut_teardown,
13340                         test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
13341                 TEST_CASE_ST(ut_setup, ut_teardown,
13342                         test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
13343                 TEST_CASE_ST(ut_setup, ut_teardown,
13344                         test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
13345
13346                 /** SNOW 3G decrypt only (UEA2) */
13347                 TEST_CASE_ST(ut_setup, ut_teardown,
13348                         test_snow3g_decryption_test_case_1),
13349                 TEST_CASE_ST(ut_setup, ut_teardown,
13350                         test_snow3g_decryption_test_case_2),
13351                 TEST_CASE_ST(ut_setup, ut_teardown,
13352                         test_snow3g_decryption_test_case_3),
13353                 TEST_CASE_ST(ut_setup, ut_teardown,
13354                         test_snow3g_decryption_test_case_4),
13355                 TEST_CASE_ST(ut_setup, ut_teardown,
13356                         test_snow3g_decryption_test_case_5),
13357                 TEST_CASE_ST(ut_setup, ut_teardown,
13358                         test_snow3g_decryption_with_digest_test_case_1),
13359                 TEST_CASE_ST(ut_setup, ut_teardown,
13360                         test_snow3g_hash_generate_test_case_1),
13361                 TEST_CASE_ST(ut_setup, ut_teardown,
13362                         test_snow3g_hash_generate_test_case_2),
13363                 TEST_CASE_ST(ut_setup, ut_teardown,
13364                         test_snow3g_hash_generate_test_case_3),
13365                 /* Tests with buffers which length is not byte-aligned */
13366                 TEST_CASE_ST(ut_setup, ut_teardown,
13367                         test_snow3g_hash_generate_test_case_4),
13368                 TEST_CASE_ST(ut_setup, ut_teardown,
13369                         test_snow3g_hash_generate_test_case_5),
13370                 TEST_CASE_ST(ut_setup, ut_teardown,
13371                         test_snow3g_hash_generate_test_case_6),
13372                 TEST_CASE_ST(ut_setup, ut_teardown,
13373                         test_snow3g_hash_verify_test_case_1),
13374                 TEST_CASE_ST(ut_setup, ut_teardown,
13375                         test_snow3g_hash_verify_test_case_2),
13376                 TEST_CASE_ST(ut_setup, ut_teardown,
13377                         test_snow3g_hash_verify_test_case_3),
13378                 /* Tests with buffers which length is not byte-aligned */
13379                 TEST_CASE_ST(ut_setup, ut_teardown,
13380                         test_snow3g_hash_verify_test_case_4),
13381                 TEST_CASE_ST(ut_setup, ut_teardown,
13382                         test_snow3g_hash_verify_test_case_5),
13383                 TEST_CASE_ST(ut_setup, ut_teardown,
13384                         test_snow3g_hash_verify_test_case_6),
13385                 TEST_CASE_ST(ut_setup, ut_teardown,
13386                         test_snow3g_cipher_auth_test_case_1),
13387                 TEST_CASE_ST(ut_setup, ut_teardown,
13388                         test_snow3g_auth_cipher_with_digest_test_case_1),
13389
13390                 /** ZUC encrypt only (EEA3) */
13391                 TEST_CASE_ST(ut_setup, ut_teardown,
13392                         test_zuc_encryption_test_case_1),
13393                 TEST_CASE_ST(ut_setup, ut_teardown,
13394                         test_zuc_encryption_test_case_2),
13395                 TEST_CASE_ST(ut_setup, ut_teardown,
13396                         test_zuc_encryption_test_case_3),
13397                 TEST_CASE_ST(ut_setup, ut_teardown,
13398                         test_zuc_encryption_test_case_4),
13399                 TEST_CASE_ST(ut_setup, ut_teardown,
13400                         test_zuc_encryption_test_case_5),
13401                 TEST_CASE_ST(ut_setup, ut_teardown,
13402                         test_zuc_encryption_test_case_6_sgl),
13403
13404                 /** ZUC authenticate (EIA3) */
13405                 TEST_CASE_ST(ut_setup, ut_teardown,
13406                         test_zuc_hash_generate_test_case_1),
13407                 TEST_CASE_ST(ut_setup, ut_teardown,
13408                         test_zuc_hash_generate_test_case_2),
13409                 TEST_CASE_ST(ut_setup, ut_teardown,
13410                         test_zuc_hash_generate_test_case_3),
13411                 TEST_CASE_ST(ut_setup, ut_teardown,
13412                         test_zuc_hash_generate_test_case_4),
13413                 TEST_CASE_ST(ut_setup, ut_teardown,
13414                         test_zuc_hash_generate_test_case_5),
13415                 TEST_CASE_ST(ut_setup, ut_teardown,
13416                         test_zuc_hash_generate_test_case_6),
13417                 TEST_CASE_ST(ut_setup, ut_teardown,
13418                         test_zuc_hash_generate_test_case_7),
13419                 TEST_CASE_ST(ut_setup, ut_teardown,
13420                         test_zuc_hash_generate_test_case_8),
13421
13422                 /** ZUC alg-chain (EEA3/EIA3) */
13423                 TEST_CASE_ST(ut_setup, ut_teardown,
13424                         test_zuc_cipher_auth_test_case_1),
13425                 TEST_CASE_ST(ut_setup, ut_teardown,
13426                         test_zuc_cipher_auth_test_case_2),
13427
13428                 /** ZUC generate auth, then encrypt (EEA3) */
13429                 TEST_CASE_ST(ut_setup, ut_teardown,
13430                         test_zuc_auth_cipher_test_case_1),
13431                 TEST_CASE_ST(ut_setup, ut_teardown,
13432                         test_zuc_auth_cipher_test_case_1_oop),
13433                 TEST_CASE_ST(ut_setup, ut_teardown,
13434                         test_zuc_auth_cipher_test_case_1_sgl),
13435                 TEST_CASE_ST(ut_setup, ut_teardown,
13436                         test_zuc_auth_cipher_test_case_1_oop_sgl),
13437
13438                 /** ZUC decrypt (EEA3), then verify auth */
13439                 TEST_CASE_ST(ut_setup, ut_teardown,
13440                         test_zuc_auth_cipher_verify_test_case_1),
13441                 TEST_CASE_ST(ut_setup, ut_teardown,
13442                         test_zuc_auth_cipher_verify_test_case_1_oop),
13443                 TEST_CASE_ST(ut_setup, ut_teardown,
13444                         test_zuc_auth_cipher_verify_test_case_1_sgl),
13445                 TEST_CASE_ST(ut_setup, ut_teardown,
13446                         test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
13447
13448                 /** HMAC_MD5 Authentication */
13449                 TEST_CASE_ST(ut_setup, ut_teardown,
13450                         test_MD5_HMAC_generate_case_1),
13451                 TEST_CASE_ST(ut_setup, ut_teardown,
13452                         test_MD5_HMAC_verify_case_1),
13453                 TEST_CASE_ST(ut_setup, ut_teardown,
13454                         test_MD5_HMAC_generate_case_2),
13455                 TEST_CASE_ST(ut_setup, ut_teardown,
13456                         test_MD5_HMAC_verify_case_2),
13457
13458                 /** KASUMI hash only (UIA1) */
13459                 TEST_CASE_ST(ut_setup, ut_teardown,
13460                         test_kasumi_hash_generate_test_case_1),
13461                 TEST_CASE_ST(ut_setup, ut_teardown,
13462                         test_kasumi_hash_generate_test_case_2),
13463                 TEST_CASE_ST(ut_setup, ut_teardown,
13464                         test_kasumi_hash_generate_test_case_3),
13465                 TEST_CASE_ST(ut_setup, ut_teardown,
13466                         test_kasumi_hash_generate_test_case_4),
13467                 TEST_CASE_ST(ut_setup, ut_teardown,
13468                         test_kasumi_hash_generate_test_case_5),
13469                 TEST_CASE_ST(ut_setup, ut_teardown,
13470                         test_kasumi_hash_generate_test_case_6),
13471
13472                 TEST_CASE_ST(ut_setup, ut_teardown,
13473                         test_kasumi_hash_verify_test_case_1),
13474                 TEST_CASE_ST(ut_setup, ut_teardown,
13475                         test_kasumi_hash_verify_test_case_2),
13476                 TEST_CASE_ST(ut_setup, ut_teardown,
13477                         test_kasumi_hash_verify_test_case_3),
13478                 TEST_CASE_ST(ut_setup, ut_teardown,
13479                         test_kasumi_hash_verify_test_case_4),
13480                 TEST_CASE_ST(ut_setup, ut_teardown,
13481                         test_kasumi_hash_verify_test_case_5),
13482
13483                 /** KASUMI encrypt only (UEA1) */
13484                 TEST_CASE_ST(ut_setup, ut_teardown,
13485                         test_kasumi_encryption_test_case_1),
13486                 TEST_CASE_ST(ut_setup, ut_teardown,
13487                         test_kasumi_encryption_test_case_1_sgl),
13488                 TEST_CASE_ST(ut_setup, ut_teardown,
13489                         test_kasumi_encryption_test_case_1_oop),
13490                 TEST_CASE_ST(ut_setup, ut_teardown,
13491                         test_kasumi_encryption_test_case_1_oop_sgl),
13492                 TEST_CASE_ST(ut_setup, ut_teardown,
13493                         test_kasumi_encryption_test_case_2),
13494                 TEST_CASE_ST(ut_setup, ut_teardown,
13495                         test_kasumi_encryption_test_case_3),
13496                 TEST_CASE_ST(ut_setup, ut_teardown,
13497                         test_kasumi_encryption_test_case_4),
13498                 TEST_CASE_ST(ut_setup, ut_teardown,
13499                         test_kasumi_encryption_test_case_5),
13500
13501                 /** KASUMI decrypt only (UEA1) */
13502                 TEST_CASE_ST(ut_setup, ut_teardown,
13503                         test_kasumi_decryption_test_case_1),
13504                 TEST_CASE_ST(ut_setup, ut_teardown,
13505                         test_kasumi_decryption_test_case_2),
13506                 TEST_CASE_ST(ut_setup, ut_teardown,
13507                         test_kasumi_decryption_test_case_3),
13508                 TEST_CASE_ST(ut_setup, ut_teardown,
13509                         test_kasumi_decryption_test_case_4),
13510                 TEST_CASE_ST(ut_setup, ut_teardown,
13511                         test_kasumi_decryption_test_case_5),
13512                 TEST_CASE_ST(ut_setup, ut_teardown,
13513                         test_kasumi_decryption_test_case_1_oop),
13514
13515                 TEST_CASE_ST(ut_setup, ut_teardown,
13516                         test_kasumi_cipher_auth_test_case_1),
13517
13518                 /** KASUMI generate auth, then encrypt (F8) */
13519                 TEST_CASE_ST(ut_setup, ut_teardown,
13520                         test_kasumi_auth_cipher_test_case_1),
13521                 TEST_CASE_ST(ut_setup, ut_teardown,
13522                         test_kasumi_auth_cipher_test_case_2),
13523                 TEST_CASE_ST(ut_setup, ut_teardown,
13524                         test_kasumi_auth_cipher_test_case_2_oop),
13525                 TEST_CASE_ST(ut_setup, ut_teardown,
13526                         test_kasumi_auth_cipher_test_case_2_sgl),
13527                 TEST_CASE_ST(ut_setup, ut_teardown,
13528                         test_kasumi_auth_cipher_test_case_2_oop_sgl),
13529
13530                 /** KASUMI decrypt (F8), then verify auth */
13531                 TEST_CASE_ST(ut_setup, ut_teardown,
13532                         test_kasumi_auth_cipher_verify_test_case_1),
13533                 TEST_CASE_ST(ut_setup, ut_teardown,
13534                         test_kasumi_auth_cipher_verify_test_case_2),
13535                 TEST_CASE_ST(ut_setup, ut_teardown,
13536                         test_kasumi_auth_cipher_verify_test_case_2_oop),
13537                 TEST_CASE_ST(ut_setup, ut_teardown,
13538                         test_kasumi_auth_cipher_verify_test_case_2_sgl),
13539                 TEST_CASE_ST(ut_setup, ut_teardown,
13540                         test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
13541
13542                 /** ESN Testcase */
13543                 TEST_CASE_ST(ut_setup, ut_teardown,
13544                         auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
13545                 TEST_CASE_ST(ut_setup, ut_teardown,
13546                         auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
13547
13548                 /** Negative tests */
13549                 TEST_CASE_ST(ut_setup, ut_teardown,
13550                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13551                 TEST_CASE_ST(ut_setup, ut_teardown,
13552                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13553                 TEST_CASE_ST(ut_setup, ut_teardown,
13554                         test_AES_GCM_auth_encryption_fail_iv_corrupt),
13555                 TEST_CASE_ST(ut_setup, ut_teardown,
13556                         test_AES_GCM_auth_encryption_fail_in_data_corrupt),
13557                 TEST_CASE_ST(ut_setup, ut_teardown,
13558                         test_AES_GCM_auth_encryption_fail_out_data_corrupt),
13559                 TEST_CASE_ST(ut_setup, ut_teardown,
13560                         test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
13561                 TEST_CASE_ST(ut_setup, ut_teardown,
13562                         test_AES_GCM_auth_encryption_fail_aad_corrupt),
13563                 TEST_CASE_ST(ut_setup, ut_teardown,
13564                         test_AES_GCM_auth_encryption_fail_tag_corrupt),
13565                 TEST_CASE_ST(ut_setup, ut_teardown,
13566                         test_AES_GCM_auth_decryption_fail_iv_corrupt),
13567                 TEST_CASE_ST(ut_setup, ut_teardown,
13568                         test_AES_GCM_auth_decryption_fail_in_data_corrupt),
13569                 TEST_CASE_ST(ut_setup, ut_teardown,
13570                         test_AES_GCM_auth_decryption_fail_out_data_corrupt),
13571                 TEST_CASE_ST(ut_setup, ut_teardown,
13572                         test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
13573                 TEST_CASE_ST(ut_setup, ut_teardown,
13574                         test_AES_GCM_auth_decryption_fail_aad_corrupt),
13575                 TEST_CASE_ST(ut_setup, ut_teardown,
13576                         test_AES_GCM_auth_decryption_fail_tag_corrupt),
13577                 TEST_CASE_ST(ut_setup, ut_teardown,
13578                         authentication_verify_AES128_GMAC_fail_data_corrupt),
13579                 TEST_CASE_ST(ut_setup, ut_teardown,
13580                         authentication_verify_AES128_GMAC_fail_tag_corrupt),
13581                 TEST_CASE_ST(ut_setup, ut_teardown,
13582                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13583                 TEST_CASE_ST(ut_setup, ut_teardown,
13584                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13585
13586                 /** Mixed CIPHER + HASH algorithms */
13587                 /** AUTH AES CMAC + CIPHER AES CTR */
13588                 TEST_CASE_ST(ut_setup, ut_teardown,
13589                         test_aes_cmac_aes_ctr_digest_enc_test_case_1),
13590                 TEST_CASE_ST(ut_setup, ut_teardown,
13591                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13592                 TEST_CASE_ST(ut_setup, ut_teardown,
13593                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13594                 TEST_CASE_ST(ut_setup, ut_teardown,
13595                         test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13596                 TEST_CASE_ST(ut_setup, ut_teardown,
13597                         test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
13598                 TEST_CASE_ST(ut_setup, ut_teardown,
13599                        test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13600                 TEST_CASE_ST(ut_setup, ut_teardown,
13601                        test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13602                 TEST_CASE_ST(ut_setup, ut_teardown,
13603                    test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13604
13605                 /** AUTH ZUC + CIPHER SNOW3G */
13606                 TEST_CASE_ST(ut_setup, ut_teardown,
13607                         test_auth_zuc_cipher_snow_test_case_1),
13608                 TEST_CASE_ST(ut_setup, ut_teardown,
13609                         test_verify_auth_zuc_cipher_snow_test_case_1),
13610                 /** AUTH AES CMAC + CIPHER SNOW3G */
13611                 TEST_CASE_ST(ut_setup, ut_teardown,
13612                         test_auth_aes_cmac_cipher_snow_test_case_1),
13613                 TEST_CASE_ST(ut_setup, ut_teardown,
13614                         test_verify_auth_aes_cmac_cipher_snow_test_case_1),
13615                 /** AUTH ZUC + CIPHER AES CTR */
13616                 TEST_CASE_ST(ut_setup, ut_teardown,
13617                         test_auth_zuc_cipher_aes_ctr_test_case_1),
13618                 TEST_CASE_ST(ut_setup, ut_teardown,
13619                         test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
13620                 /** AUTH SNOW3G + CIPHER AES CTR */
13621                 TEST_CASE_ST(ut_setup, ut_teardown,
13622                         test_auth_snow_cipher_aes_ctr_test_case_1),
13623                 TEST_CASE_ST(ut_setup, ut_teardown,
13624                         test_verify_auth_snow_cipher_aes_ctr_test_case_1),
13625                 /** AUTH SNOW3G + CIPHER ZUC */
13626                 TEST_CASE_ST(ut_setup, ut_teardown,
13627                         test_auth_snow_cipher_zuc_test_case_1),
13628                 TEST_CASE_ST(ut_setup, ut_teardown,
13629                         test_verify_auth_snow_cipher_zuc_test_case_1),
13630                 /** AUTH AES CMAC + CIPHER ZUC */
13631                 TEST_CASE_ST(ut_setup, ut_teardown,
13632                         test_auth_aes_cmac_cipher_zuc_test_case_1),
13633                 TEST_CASE_ST(ut_setup, ut_teardown,
13634                         test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
13635
13636                 /** AUTH NULL + CIPHER SNOW3G */
13637                 TEST_CASE_ST(ut_setup, ut_teardown,
13638                         test_auth_null_cipher_snow_test_case_1),
13639                 TEST_CASE_ST(ut_setup, ut_teardown,
13640                         test_verify_auth_null_cipher_snow_test_case_1),
13641                 /** AUTH NULL + CIPHER ZUC */
13642                 TEST_CASE_ST(ut_setup, ut_teardown,
13643                         test_auth_null_cipher_zuc_test_case_1),
13644                 TEST_CASE_ST(ut_setup, ut_teardown,
13645                         test_verify_auth_null_cipher_zuc_test_case_1),
13646                 /** AUTH SNOW3G + CIPHER NULL */
13647                 TEST_CASE_ST(ut_setup, ut_teardown,
13648                         test_auth_snow_cipher_null_test_case_1),
13649                 TEST_CASE_ST(ut_setup, ut_teardown,
13650                         test_verify_auth_snow_cipher_null_test_case_1),
13651                 /** AUTH ZUC + CIPHER NULL */
13652                 TEST_CASE_ST(ut_setup, ut_teardown,
13653                         test_auth_zuc_cipher_null_test_case_1),
13654                 TEST_CASE_ST(ut_setup, ut_teardown,
13655                         test_verify_auth_zuc_cipher_null_test_case_1),
13656                 /** AUTH NULL + CIPHER AES CTR */
13657                 TEST_CASE_ST(ut_setup, ut_teardown,
13658                         test_auth_null_cipher_aes_ctr_test_case_1),
13659                 TEST_CASE_ST(ut_setup, ut_teardown,
13660                         test_verify_auth_null_cipher_aes_ctr_test_case_1),
13661                 /** AUTH AES CMAC + CIPHER NULL */
13662                 TEST_CASE_ST(ut_setup, ut_teardown,
13663                         test_auth_aes_cmac_cipher_null_test_case_1),
13664                 TEST_CASE_ST(ut_setup, ut_teardown,
13665                         test_verify_auth_aes_cmac_cipher_null_test_case_1),
13666
13667 #ifdef RTE_LIB_SECURITY
13668                 TEST_CASE_ST(ut_setup_security, ut_teardown,
13669                         test_PDCP_PROTO_all),
13670                 TEST_CASE_ST(ut_setup_security, ut_teardown,
13671                         test_DOCSIS_PROTO_all),
13672 #endif
13673                 TEST_CASES_END() /**< NULL terminate unit test array */
13674         }
13675 };
13676
13677 static struct unit_test_suite cryptodev_virtio_testsuite = {
13678         .suite_name = "Crypto VIRTIO Unit Test Suite",
13679         .setup = testsuite_setup,
13680         .teardown = testsuite_teardown,
13681         .unit_test_cases = {
13682                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13683
13684                 TEST_CASES_END() /**< NULL terminate unit test array */
13685         }
13686 };
13687
13688 static struct unit_test_suite cryptodev_caam_jr_testsuite  = {
13689         .suite_name = "Crypto CAAM JR Unit Test Suite",
13690         .setup = testsuite_setup,
13691         .teardown = testsuite_teardown,
13692         .unit_test_cases = {
13693                 TEST_CASE_ST(ut_setup, ut_teardown,
13694                              test_device_configure_invalid_dev_id),
13695                 TEST_CASE_ST(ut_setup, ut_teardown,
13696                              test_multi_session),
13697
13698                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13699                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13700                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13701                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13702                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13703
13704                 TEST_CASES_END() /**< NULL terminate unit test array */
13705         }
13706 };
13707
13708 static struct unit_test_suite cryptodev_mrvl_testsuite  = {
13709         .suite_name = "Crypto Device Marvell Component Test Suite",
13710         .setup = testsuite_setup,
13711         .teardown = testsuite_teardown,
13712         .unit_test_cases = {
13713                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13714                 TEST_CASE_ST(ut_setup, ut_teardown,
13715                                 test_multi_session_random_usage),
13716                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13717                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13718                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13719                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13720                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13721
13722                 /** Negative tests */
13723                 TEST_CASE_ST(ut_setup, ut_teardown,
13724                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13725                 TEST_CASE_ST(ut_setup, ut_teardown,
13726                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13727                 TEST_CASE_ST(ut_setup, ut_teardown,
13728                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13729                 TEST_CASE_ST(ut_setup, ut_teardown,
13730                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13731
13732                 TEST_CASES_END() /**< NULL terminate unit test array */
13733         }
13734 };
13735
13736 static struct unit_test_suite cryptodev_ccp_testsuite  = {
13737         .suite_name = "Crypto Device CCP Unit Test Suite",
13738         .setup = testsuite_setup,
13739         .teardown = testsuite_teardown,
13740         .unit_test_cases = {
13741                 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13742                 TEST_CASE_ST(ut_setup, ut_teardown,
13743                                 test_multi_session_random_usage),
13744                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13745                 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13746                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13747                 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13748                 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13749
13750                 /** Negative tests */
13751                 TEST_CASE_ST(ut_setup, ut_teardown,
13752                         authentication_verify_HMAC_SHA1_fail_data_corrupt),
13753                 TEST_CASE_ST(ut_setup, ut_teardown,
13754                         authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13755                 TEST_CASE_ST(ut_setup, ut_teardown,
13756                         auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13757                 TEST_CASE_ST(ut_setup, ut_teardown,
13758                         auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13759
13760                 TEST_CASES_END() /**< NULL terminate unit test array */
13761         }
13762 };
13763
13764 static int
13765 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
13766 {
13767         gbl_driver_id = rte_cryptodev_driver_id_get(
13768                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
13769
13770         if (gbl_driver_id == -1) {
13771                 RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
13772                 return TEST_SKIPPED;
13773         }
13774
13775         return unit_test_suite_runner(&cryptodev_testsuite);
13776 }
13777
13778 static int
13779 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)
13780 {
13781         gbl_driver_id = rte_cryptodev_driver_id_get(
13782                         RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
13783
13784         if (gbl_driver_id == -1) {
13785                 RTE_LOG(ERR, USER1, "VIRTIO PMD must be loaded.\n");
13786                 return TEST_FAILED;
13787         }
13788
13789         return unit_test_suite_runner(&cryptodev_virtio_testsuite);
13790 }
13791
13792 static int
13793 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
13794 {
13795         gbl_driver_id = rte_cryptodev_driver_id_get(
13796                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13797
13798         if (gbl_driver_id == -1) {
13799                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
13800                 return TEST_SKIPPED;
13801         }
13802
13803         return unit_test_suite_runner(&cryptodev_testsuite);
13804 }
13805
13806 static int
13807 test_cryptodev_cpu_aesni_mb(void)
13808 {
13809         int32_t rc;
13810         enum rte_security_session_action_type at;
13811
13812         gbl_driver_id = rte_cryptodev_driver_id_get(
13813                         RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13814
13815         if (gbl_driver_id == -1) {
13816                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
13817                 return TEST_SKIPPED;
13818         }
13819
13820         at = gbl_action_type;
13821         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
13822         rc = unit_test_suite_runner(&cryptodev_testsuite);
13823         gbl_action_type = at;
13824         return rc;
13825 }
13826
13827 static int
13828 test_cryptodev_openssl(void)
13829 {
13830         gbl_driver_id = rte_cryptodev_driver_id_get(
13831                         RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
13832
13833         if (gbl_driver_id == -1) {
13834                 RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded.\n");
13835                 return TEST_SKIPPED;
13836         }
13837
13838         return unit_test_suite_runner(&cryptodev_testsuite);
13839 }
13840
13841 static int
13842 test_cryptodev_aesni_gcm(void)
13843 {
13844         gbl_driver_id = rte_cryptodev_driver_id_get(
13845                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
13846
13847         if (gbl_driver_id == -1) {
13848                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
13849                 return TEST_SKIPPED;
13850         }
13851
13852         return unit_test_suite_runner(&cryptodev_testsuite);
13853 }
13854
13855 static int
13856 test_cryptodev_cpu_aesni_gcm(void)
13857 {
13858         int32_t rc;
13859         enum rte_security_session_action_type at;
13860
13861         gbl_driver_id = rte_cryptodev_driver_id_get(
13862                         RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
13863
13864         if (gbl_driver_id == -1) {
13865                 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
13866                 return TEST_SKIPPED;
13867         }
13868
13869         at = gbl_action_type;
13870         gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
13871         rc = unit_test_suite_runner(&cryptodev_testsuite);
13872         gbl_action_type = at;
13873         return rc;
13874 }
13875
13876 static int
13877 test_cryptodev_null(void)
13878 {
13879         gbl_driver_id = rte_cryptodev_driver_id_get(
13880                         RTE_STR(CRYPTODEV_NAME_NULL_PMD));
13881
13882         if (gbl_driver_id == -1) {
13883                 RTE_LOG(ERR, USER1, "NULL PMD must be loaded.\n");
13884                 return TEST_SKIPPED;
13885         }
13886
13887         return unit_test_suite_runner(&cryptodev_testsuite);
13888 }
13889
13890 static int
13891 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
13892 {
13893         gbl_driver_id = rte_cryptodev_driver_id_get(
13894                         RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
13895
13896         if (gbl_driver_id == -1) {
13897                 RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded.\n");
13898                 return TEST_SKIPPED;
13899         }
13900
13901         return unit_test_suite_runner(&cryptodev_testsuite);
13902 }
13903
13904 static int
13905 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
13906 {
13907         gbl_driver_id = rte_cryptodev_driver_id_get(
13908                         RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
13909
13910         if (gbl_driver_id == -1) {
13911                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
13912                 return TEST_SKIPPED;
13913         }
13914
13915         return unit_test_suite_runner(&cryptodev_testsuite);
13916 }
13917
13918 static int
13919 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
13920 {
13921         gbl_driver_id = rte_cryptodev_driver_id_get(
13922                         RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
13923
13924         if (gbl_driver_id == -1) {
13925                 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
13926                 return TEST_SKIPPED;
13927         }
13928
13929         return unit_test_suite_runner(&cryptodev_testsuite);
13930 }
13931
13932 static int
13933 test_cryptodev_armv8(void)
13934 {
13935         gbl_driver_id = rte_cryptodev_driver_id_get(
13936                         RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
13937
13938         if (gbl_driver_id == -1) {
13939                 RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded.\n");
13940                 return TEST_SKIPPED;
13941         }
13942
13943         return unit_test_suite_runner(&cryptodev_testsuite);
13944 }
13945
13946 static int
13947 test_cryptodev_mrvl(void)
13948 {
13949         gbl_driver_id = rte_cryptodev_driver_id_get(
13950                         RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
13951
13952         if (gbl_driver_id == -1) {
13953                 RTE_LOG(ERR, USER1, "MVSAM PMD must be loaded.\n");
13954                 return TEST_SKIPPED;
13955         }
13956
13957         return unit_test_suite_runner(&cryptodev_mrvl_testsuite);
13958 }
13959
13960 #ifdef RTE_CRYPTO_SCHEDULER
13961
13962 static int
13963 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
13964 {
13965         gbl_driver_id = rte_cryptodev_driver_id_get(
13966                         RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
13967
13968         if (gbl_driver_id == -1) {
13969                 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
13970                 return TEST_SKIPPED;
13971         }
13972
13973         if (rte_cryptodev_driver_id_get(
13974                                 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
13975                 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
13976                 return TEST_SKIPPED;
13977 }
13978         return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
13979 }
13980
13981 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
13982
13983 #endif
13984
13985 static int
13986 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)
13987 {
13988         gbl_driver_id = rte_cryptodev_driver_id_get(
13989                         RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
13990
13991         if (gbl_driver_id == -1) {
13992                 RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded.\n");
13993                 return TEST_SKIPPED;
13994         }
13995
13996         return unit_test_suite_runner(&cryptodev_testsuite);
13997 }
13998
13999 static int
14000 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14001 {
14002         gbl_driver_id = rte_cryptodev_driver_id_get(
14003                         RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
14004
14005         if (gbl_driver_id == -1) {
14006                 RTE_LOG(ERR, USER1, "DPAA SEC PMD must be loaded.\n");
14007                 return TEST_SKIPPED;
14008         }
14009
14010         return unit_test_suite_runner(&cryptodev_testsuite);
14011 }
14012
14013 static int
14014 test_cryptodev_ccp(void)
14015 {
14016         gbl_driver_id = rte_cryptodev_driver_id_get(
14017                         RTE_STR(CRYPTODEV_NAME_CCP_PMD));
14018
14019         if (gbl_driver_id == -1) {
14020                 RTE_LOG(ERR, USER1, "CCP PMD must be loaded.\n");
14021                 return TEST_FAILED;
14022         }
14023
14024         return unit_test_suite_runner(&cryptodev_ccp_testsuite);
14025 }
14026
14027 static int
14028 test_cryptodev_octeontx(void)
14029 {
14030         gbl_driver_id = rte_cryptodev_driver_id_get(
14031                         RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
14032         if (gbl_driver_id == -1) {
14033                 RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded.\n");
14034                 return TEST_FAILED;
14035         }
14036         return unit_test_suite_runner(&cryptodev_testsuite);
14037 }
14038
14039 static int
14040 test_cryptodev_octeontx2(void)
14041 {
14042         gbl_driver_id = rte_cryptodev_driver_id_get(
14043                         RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
14044         if (gbl_driver_id == -1) {
14045                 RTE_LOG(ERR, USER1, "OCTEON TX2 PMD must be loaded.\n");
14046                 return TEST_FAILED;
14047         }
14048         return unit_test_suite_runner(&cryptodev_testsuite);
14049 }
14050
14051 static int
14052 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)
14053 {
14054         gbl_driver_id = rte_cryptodev_driver_id_get(
14055                         RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
14056
14057         if (gbl_driver_id == -1) {
14058                 RTE_LOG(ERR, USER1, "CAAM_JR PMD must be loaded.\n");
14059                 return TEST_FAILED;
14060         }
14061
14062         return unit_test_suite_runner(&cryptodev_caam_jr_testsuite);
14063 }
14064
14065 static int
14066 test_cryptodev_nitrox(void)
14067 {
14068         gbl_driver_id = rte_cryptodev_driver_id_get(
14069                         RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
14070
14071         if (gbl_driver_id == -1) {
14072                 RTE_LOG(ERR, USER1, "NITROX PMD must be loaded.\n");
14073                 return TEST_FAILED;
14074         }
14075
14076         return unit_test_suite_runner(&cryptodev_testsuite);
14077 }
14078
14079 static int
14080 test_cryptodev_bcmfs(void)
14081 {
14082         gbl_driver_id = rte_cryptodev_driver_id_get(
14083                         RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
14084
14085         if (gbl_driver_id == -1) {
14086                 RTE_LOG(ERR, USER1, "BCMFS PMD must be loaded.\n");
14087                 return TEST_FAILED;
14088         }
14089
14090         return unit_test_suite_runner(&cryptodev_testsuite);
14091 }
14092
14093 static int
14094 test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/)
14095 {
14096         int ret;
14097
14098         gbl_driver_id = rte_cryptodev_driver_id_get(
14099                         RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14100
14101         if (gbl_driver_id == -1) {
14102                 RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14103                 return TEST_SKIPPED;
14104         }
14105
14106         global_api_test_type = CRYPTODEV_RAW_API_TEST;
14107         ret = unit_test_suite_runner(&cryptodev_testsuite);
14108         global_api_test_type = CRYPTODEV_API_TEST;
14109
14110         return ret;
14111 }
14112
14113 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
14114                 test_cryptodev_qat_raw_api);
14115 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
14116 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
14117 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
14118         test_cryptodev_cpu_aesni_mb);
14119 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
14120 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
14121 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
14122         test_cryptodev_cpu_aesni_gcm);
14123 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
14124 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
14125 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
14126 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
14127 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
14128 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
14129 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
14130 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
14131 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
14132 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
14133 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
14134 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
14135 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
14136 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
14137 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);